Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework2][ZendFramework] Formy i Annotacje
netvalue
post 22.05.2014, 14:18:04
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
RiE
post 22.05.2014, 20:04:30
Post #2





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

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


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.
Go to the top of the page
+Quote Post
sf
post 22.05.2014, 20:08:43
Post #3





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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.


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
netvalue
post 23.05.2014, 07:17:46
Post #4





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

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


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...
Go to the top of the page
+Quote Post
RiE
post 23.05.2014, 09:08:40
Post #5





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
netvalue
post 26.05.2014, 13:52:08
Post #6





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

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


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 ?

Ten post edytował netvalue 23.05.2014, 13:18:27
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 06:40