Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Problem z dekoratorem ViewScript przy elemencie typy "file"
Forum PHP.pl > Forum > PHP > Frameworki
Sajrox
Witam serdecznie,

Dlaczego dekorowanie elementu innego typu niż "file" przy pomocy ViewScript nie spraswia problemu, gdy przy polu typu file są już problemy.

Tworze nowy element w mojej Klasie która dziedziczy po Zend_Form

  1. parent::addElement('file', 'zdjecie')
  2. ->getElement('zdjecie')
  3. ->setMaxFileSize(102400)
  4. ->addValidator('Extension', true, 'jpg,png,gif')
  5. ->addValidator('Size', true, 102400)
  6. ->addValidator('Count', true, 1)
  7. ->setDecorators(array(array('ViewScript', array('viewScript' => 'image.phtml'))));

NIestety to nie działa. jednak gdy zakomentuje ->setDecorators(... tworzy element file poprawnie.


Kod tworzący element typu text działa poprawnie wraz z dekoratorem ViewScript
  1. parent::addElement('text', 'zdjecieTxt')
  2. ->getElement('zdjecieTxt')
  3. ->setDecorators(array(array('ViewScript', array('viewScript' => 'image.phtml'))));


W chwili obecnej plik 'image.phtml' jest pusty.

Co może być tutaj przyczyną wchwili tworzenia elementu file z dekoratorem ?
Błąd jaki otrzymuje:
  1. Warning: Exception caught by form: No file decorator found... unable to render file element Stack Trace: #0 J:\wamp\www\ZendFramework-1.9.5\library\Zend\Form\Decorator\FormElements.php(101): Zend_Form_Element_File->render() #1 J:\wamp\www\ZendFramework-1.9.5\library\Zend\Form.php(2626): Zend_Form_Decorator_FormElements->render('') #2 J:\wamp\www\ZendFramework-1.9.5\library\Zend\Form.php(2641): Zend_Form->render() #3 J:\wamp\www\ZendFramework-1.9.5\application\MODULES\user\views\scripts\orders\add.phtml(1): Zend_Form->__toString() #4 J:\wamp\www\ZendFramework-1.9.5\library\Zend\View.php(108): include('J:\wamp\www\Zen...') #5 J:\wamp\www\ZendFramework-1.9.5\library\Zend\View\Abstract.php(833): Zend_View->_run('J:\wamp\www\Zen...') #6 J:\wamp\www\ZendFramework-1.9.5\library\Zend\Controller\Action\Helper\ViewRenderer.php(903): Zend_View_Abstract->render('orders/add.phtm...') #7 J:\wamp\www\ZendFramework-1.9.5\library\Zend\Controller\Action\Helper\ViewRenderer.php(924): Zend_Controller_Action_Helper_ViewRenderer->renderScr in J:\wamp\www\ZendFramework-1.9.5\library\Zend\Form.php on line 2646
seth-kk
nie setDecorators tylko addDecorator(s) - file wymaga kilku domyslnych dekoratorow co zreszta masz napisane w komunikacie bledu
Sajrox
Racja nie setDecorators tylko addDecorators. To akurat zmieniłem sobie aby i pw metodzie setDecorators() wywołuję addDecorators() z drobnymi dodatkami.

Ale nie o to chodzi. Co do samego komunikatu o błędzie to nie mówi on akurat jakich elementów brakuje.
Niestety szukam i nie jestem w stanie tego nigdzie znaleść sad.gif
batman
Problem nie leży po stronie addDecorator, czy setDecorators, a po stronie elementu oraz dekoratora File.
Element File wymaga, aby co najmniej jeden dekorator implementował interfejs Zend_Form_Decorator_Marker_File_Interface. W przeciwnym razie rzuci wyjątek. Dekorator ViewScript nie implementuje wspomnianego interfejsu i dlatego zgłaszany jest wyjątek.
Rozwiązaniem tego problemu jest stworzenie własnego dekoratora ViewScript dziedziczącego po Zend_Form_Decorator_ViewScript oraz implementującego interfejs Zend_Form_Decorator_Marker_File_Interface.
Sajrox
Dzięki wielkie @batman smile.gif
Generalnie wystrczyło dodać włąśny dekorator
  1. class Form_Decorator_ViewScriptFile extends Zend_Form_Decorator_ViewScript implements Zend_Form_Decorator_Marker_File_Interface {
  2. }


Wcześniej musiałem zakomentować pewien fragment kody w samej bibliotece Zenda :/
batman
Cytat(Sajrox @ 4.12.2009, 10:55:27 ) *
Wcześniej musiałem zakomentować pewien fragment kody w samej bibliotece Zenda :/
Nie chciałbym zabrzmieć moralizatorsko, ale nie wolno grzebać w bibliotekach Zenda. W zasadzie to nie wolno grzebać w bibliotekach w ogóle. Zamiast modyfikować coś w tych klasach, lepiej stworzyć nową klasę, która po niej dziedziczy.
seth-kk
Cytat(batman @ 4.12.2009, 08:28:46 ) *
Problem nie leży po stronie addDecorator, czy setDecorators, a po stronie elementu oraz dekoratora File...

Bezposrednio nie ale mysle ze sytuacja ma zapobiegac przypadkowemu usunieciu dekoratora file ktory dodaje dodatkowego inputa z max_file_size
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.