Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Zend_Form + Ajax data
Forum PHP.pl > Forum > PHP > Frameworki
Astarot
Witam,
Spróbowałem napisać aplikację w ZF z wykorzystaniem Zend_Form.
W przypadku zwykłych, statycznych formularzy nie mam problemu z obsługą formów od ZF.
Potrzebuję jednak wyświetlić podkategorie(selectem) dla wybranej wyżej kategorii(select).
Pomyślałem sobie, że jedynym rozsądnym rozwiązaniem będzie ajax, dodałem do selecta z kategoriami zdarzenie onChange, w js ajaxem odebrałem ID kategorii, następnie
zastąpiłem pusty select podkategorii (generowany w Zend_Form) elementem o tym samym id i name uzupełnionym o opcje pobrane ajaxem.
Problem polega jednak na tym, że Zend_Form nic nie wie o opcjach które zostały dostarczone dzięki Ajax i wyrzuca błąd

  1. '1' was not found in the haystack


W jaki sposób prawidłowo należy rozwiązać problem z dynamicznymi formularzami(selectami) przy użyciu Zend_Form?

Chyba znalazłem rozwiązanie problemu, może nie jest za bardzo eleganckie ale działa
Pobieram wszystkie podkategorie kategorii przy ładowaniu formularza, a dopiero po wybraniu konkretnej kategorii wyświetlam podkategorie przypisane do niej.
Dzięki temu Zend_Form wie z czym ma do czynienia
  1. //form..
  2. $categoryid = new Zend_Form_Element_Select('categoryid');
  3. $categoryid->setLabel('Kategoria');
  4. $categoryid->addMultiOptions(array('' => '-- Wybierz --'));
  5. $category = new Application_Model_Mapper_SiteCategory;
  6. $category = $category->getAll();
  7. foreach($category as $obj)
  8. $categoryid->addMultiOptions(array($obj->id => $obj->name));
  9.  
  10. $subcategoryid = new Zend_Form_Element_Select('subcategoryid');
  11. $subcategory = new Application_Model_Mapper_SiteSubCategory;
  12. $subcategory = $subcategory->getAll();
  13. foreach($subcategory as $obj)
  14. $subcategoryid->addMultiOptions(array($obj->id => $obj->name));
  15. $subcategoryid->setLabel('Podkategoria');
  16. $subcategoryid->setRequired(true);
snapshot
A nie możesz dodać pustego elementu select dla podkategorii i dodawać mu elementy w momencie, kiedy znany jest już ID kategorii nadrzędnej (w celu walidacji)?
Astarot
Zend_Form na to nie pozwoli, przy generowaniu selecta musi znać zestaw danych jaki będzie zawierał.
snapshot
Waliduj select z kateogrią, jeśli ok to wrzucaj do selecta z podkategoriami wpisy i wtedy waliduj całość
droslaw
Może lepszym rozwiązaniem będzie wykonanie metody setRegisterInArrayValidator z parametrem false na elemencie formularza.
Potem można dodać jeszcze walidator Zend_Validate_Db_RecordExists, żeby sprawdzić czy podane podkategorie istnieją w bazie.
  1. $subcategoryid->setRegisterInArrayValidator(false)
  2. ->addValidator(new Zend_Validate_Db_RecordExists(array( 'field' => 'id', 'table' => $subCategoriesTableName);

setRegisterInArrayValidator powinien wyeliminować ten błąd:
  1. '1' was not found in the haystack
Astarot
@droslaw: dziękuję, naprawdę bardzo ciekawe i użyteczne rozwiązanie problemu smile.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.