Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework2][ZendFramework] Formy i Annotacje
netvalue
post
Post #1





Grupa: Zarejestrowani
Postów: 199
Pomógł: 2
Dołączył: 9.06.2008

Ostrzeżenie: (0%)
-----


Witam,


zaczalem budowac aplikacje gdzie uzywam Doctrine 2 i wykorzystuje Entity na podstawie ktorych
rowniez formularze wykorzystując Zend\Form\Annotation.

przykladowy kawalek kodu Entity\Product.php:

  1. private $title;
  2.  
  3. /**
  4.   * @var string
  5.   *
  6.   * @ORM\Column(name="description", type="text", nullable=false)
  7.   * @Annotation\Filter({"name":"StringTrim"})
  8.   * @Annotation\Validator({"name":"StringLength", "options":{"min":1, "max":2}})
  9.   * @Annotation\Validator({"name":"Regex", "options":{"pattern":"/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/"}})
  10.   * @Annotation\Attributes({"type":"text"})
  11.   * @Annotation\Options({"label":"opis:"})
  12.   */

przykładowa aplikacja na której strukturze sie wzoruje

Pytanie czy takie rozwiazanie tworzenia, validacji i filtracji formularzy jest optymalne i sklalarne ?
Nie chce zagrzebac sie juz na poczatku ze slaba konstrukcja aplikacji.

Byc moze lepiej jest wykorzystywac standardowo formy Zend\Form\Form i use Zend\InputFilter\* ?
przykładowa aplikacja o strukturze ktora mam na mysli


Ten post edytował netvalue 22.05.2014, 14:24:52
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
RiE
post
Post #2





Grupa: Zarejestrowani
Postów: 97
Pomógł: 45
Dołączył: 5.05.2010

Ostrzeżenie: (0%)
-----


Jest na to kilka sposób, dwa najczęściej używane to:

1. Standardowa klasa Select (Zend\Form\Element\Select)

W klasie formularza jest taka definicja pola select:
  1.  
  2. /* Size */
  3. $this->add(array(
  4. 'name' => 'size',
  5. 'type' => 'Zend\Form\Element\Select',
  6. 'attributes' => array(
  7. 'class' => 'form-control'
  8. ),
  9. 'options' => array(
  10. 'label' => 'Size: ',
  11. 'label_attributes' => array(
  12. 'class' => 'control-label',
  13. 'id' => 'size'
  14. ),
  15. ),
  16. ));


W tej samej klasie, dodajesz metodę:
  1. public function setSizesToForm($sizes)
  2. {
  3. $list = array();
  4. foreach($sizes as $size)
  5. {
  6. if($size->getDetailKey() === 'size')
  7. $list[$size->getDetailName()] = $size->getDetailValue();
  8.  
  9. }
  10.  
  11. $this>get('size')->setOptions(array('options' => $list));
  12. }


I w kontrolerze, jak tworzysz instancję formularza to przekazujesz tablicę z danymi, które mają znaleźć się w formularzu albo tablicę obiektów i tam filtrujesz te dane, które Cię interesują
  1. $form = new \Application\Form\MyForm();
  2. $form->setSizesToForm($selectArray());
  3. //... reszta operacji
  4.  
  5. return new ViewModel(array('form' => $form));


2. Używanie klas z Doctrine 2 (DoctrineModule\Form\Element\*)

Doctrine 2 udostępnia 3 klasy do łatwego zarządzania:
- Select (DoctrineModule\Form\Element\ObjectSelect)
- Radio (DoctrineModule\Form\Element\ObjectRadio)
- Checkbox (DoctrineModule\Form\Element\ObjectMultiCheckbox)

Przykład użycia można znaleźć pod tym adresem https://github.com/doctrine/DoctrineModule/...form-element.md.
W skrócie. Definiujemy w tablicy, pod kluczem target_class entity z którego doctrine ma pobrać zawartość do selecta/radio/checkboxa. Następnie:
  1. 'find_method' => array(
  2. 'name' => 'findBy',
  3. 'params' => array(
  4. 'criteria' => array('active' => 1),
  5. 'orderBy' => array('lastname' => 'ASC'),
  6. ),
  7. ),

Następnie podajemy nazwę metody jaką mają być pobrane dane w tym przypadku findBy() oraz parametry wyszukiwania, które jest równoznaczne z:
  1. $em->getRepository('Library\Entity\MyEntity')->findBy(array('active' => 1));
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 19:58