Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework2][ZendFramework] Formy i Annotacje
Forum PHP.pl > Forum > PHP > Frameworki
netvalue
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
RiE
Ja osobiście nie jestem zwolennikiem używania adnotacji, nie podoba mi się ten sposób definiowania danych.
Na pewno jest przejrzysty i szybszy(szybciej się go tworzy) niż standardowy sposób definiowania formularza. Do przetwarzania adnotacji używane jest Reflecion API, które pod względem wydajnościowym jest zapewne wolniejsze od typowych funkcji i operacji. Chociaż i z tym jest coraz lepiej wraz z nowszymi wersjami PHP.

Tworząc w Zend 2, na pewno warto być zaznajomionym z tym jak odbywa się tworzenie formularzy w standardowy sposób, jak można 'dobrać się' do odpowiednich właściwości itd.
Większość modułów wykorzystuje standardowy sposób tworzenia formularzy.
sf
Ogólnie tego się nie powinno używać, to jest dobre jak musisz coś zrobić szybko i o tym zapomnieć. Jeśli planujesz to rozwijać to pamiętaj, że nie wszystko w ten sposób da się zrobić. Zastosuj standardowe formy i filtry.
netvalue
oki dzieki za odpowidzi...
nie moge znalezc odpowiedzi na taka sytuacje :

tworze formularz w sposób standardowy + filtry. Chce stworzyć elementy typu SELECT (np. kategorie)
a w jego polach OPTIONS aby były wstawione kategorie z bazdy danych. Korzystam z Doctrine2...
Jesli mam recznie stworzyc sobie takie element w widoku nie ma problemu... ale jesli chcialbym zeby byl genrowany juz z poziomu klasy formy to juz trudniej...
RiE
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));
netvalue
same dobrodziejstwa Doctrine2 smile.gif

troche się teraz zgubiłem z logiką używania Entity i Model. Mianowicie, czy "obróbke" danych powinienem prowadzić w klasach Entity\Example.php czy Model\Example.php ?

Obecnie ma maką strukturę:

  1. Controlers\Index.php // obsługa akcji + dodałem jedną funckję którą nazwałem SaveDb i jest odpowiedzialna za zapis do db
  2. Form\ProductForm.php // tworzenie elemtów form
  3. Entity\Product.php // Mapowanie ORM Adnotacje Doctrine2 oraz Zend\InputFilter dla elemtów form


teraz czy tą obróbkę danych np. SaveDB oraz inne podobne powinienem stosować w Entity\Product.php czy utworzyć :
  1. Model\ProductModel.php

i tutaj w klasie realizować obróbkę , zapisy, itp. ?

nikt nie wie wink.gif ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.