2013-07-26 5 views
0

Я ищу, где каждый, но не могу найти ответ, поэтому вопрос, где должна быть классом декоратора, давайте посмотрим с примером:Zend 1,11, расположение декоратор файл

У меня есть приложение/форма/Guestbook.php

class Application_Form_Guestbook extends Zend_Form 
{ 

    public function init() 
    { 

     $this->addPrefixPath('My_Decorator', '/application/forms/decorator', 'decorator'); 

     $this->setMethod('post'); 
     $this->addElement('text', 'email', array(
      'label' => 'Your email address', 
      'require' => true, 
      'filters' => array('StringTrim'), 
      'validators' => array('EmailAddress'), 
      //'prefixPath' => array('decorator' => array('My_Decorator' => 'application/forms/decorator')), 
      'decorators' => array(array('SimpleInput')))); 



     // Add the comment element 
     $this->addElement('textarea', 'comment', array(
      'label' => 'Please Comment:', 
      'required' => true, 
      'validators' => array(
       array('validator' => 'StringLength', 'options' => array(0, 20)) 
      ) 
     )); 

     // Add a captcha 
     $this->addElement('captcha', 'captcha', array(
      'label' => 'Please enter the 5 letters displayed below:', 
      'required' => true, 
      'captcha' => array(
       'captcha' => 'Figlet', 
       'wordLen' => 5, 
       'timeout' => 300 
      ) 
     )); 

     $this->addElement('submit', 'submit', array('ignore' => true, 'label' => 'Sign Guestbook')); 
     $this->addElement('hash', 'csrf', array('ignore' => true)); 
    } 

} 

и имеют применение/формы/декоратор/SimpleInput.php

class My_Decorator_SimpleInput extends Zend_Form_Decorator_Abstract 
{ 

    protected $_format = '<label for="%s">%s !!!!!!</label><input id="%s" name="%s" type="text" value="%s"/>'; 

    public function render($content) 
    { 
     $element = $content->getElement(); 
     $name = htmlentities($element->getFullyQualifiedName()); 
     $label = htmlentities($element->getLabel()); 
     $id = htmlentities($element->getId()); 
     $value = htmlentities($element->getValue()); 

     $markup = sprintf($this->_format, $name, $label, $id, $name, $value); 

     return $markup; 
    } 

} 

Когда я пытаюсь запустить страницу у меня есть ошибка при загрузке оформитель:

An error occurred 
Application error 
Exception information: 

Message: Plugin by name 'SimpleInput' was not found in the registry; used paths: My_Decorator_: /application/forms/decorator/ Zend_Form_Decorator_: Zend/Form/Decorator/ 
Stack trace: 

#0 /home/dev/public_html/local.zend.test/library/Zend/Form/Element.php(1827): Zend_Loader_PluginLoader->load('SimpleInput') 
#1 /home/dev/public_html/local.zend.test/library/Zend/Form/Element.php(2207): Zend_Form_Element->_getDecorator('SimpleInput', NULL) 
#2 /home/dev/public_html/local.zend.test/library/Zend/Form/Element.php(1980): Zend_Form_Element->_loadDecorator(Array, 'SimpleInput') 
#3 /home/dev/public_html/local.zend.test/library/Zend/Form/Element.php(316): Zend_Form_Element->getDecorators() 
#4 /home/dev/public_html/local.zend.test/library/Zend/Form/Element.php(271): Zend_Form_Element->loadDefaultDecorators() 
#5 /home/dev/public_html/local.zend.test/library/Zend/Form.php(1125): Zend_Form_Element->__construct('email', Array) 
#6 /home/dev/public_html/local.zend.test/library/Zend/Form.php(1035): Zend_Form->createElement('text', 'email', Array) 
#7 /home/dev/public_html/local.zend.test/application/forms/Guestbook.php(18): Zend_Form->addElement('text', 'email', Array) 
#8 /home/dev/public_html/local.zend.test/library/Zend/Form.php(240): Application_Form_Guestbook->init() 
#9 /home/dev/public_html/local.zend.test/application/controllers/GuestbookController.php(28): Zend_Form->__construct() 
#10 /home/dev/public_html/local.zend.test/library/Zend/Controller/Action.php(516): GuestbookController->signAction() 
#11 /home/dev/public_html/local.zend.test/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('signAction') 
#12 /home/dev/public_html/local.zend.test/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#13 /home/dev/public_html/local.zend.test/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#14 /home/dev/public_html/local.zend.test/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#15 /home/dev/public_html/local.zend.test/public/index.php(26): Zend_Application->run() 
#16 {main} 

Этот пример из краткого руководства. Вопрос в том, где должно быть местоположение таких декораторов (местоположение по умолчанию) или как я могу их загрузить и какой «путь// декоратор» я должен написать (из папки root \ application \ forms?), Потому что документация в Zend как правило уродлива. .. = \

ответ

0

Редактировать # 3.

Я думаю, проблема может заключаться в том, что Zend не нравится, как вы устанавливаете путь./application является абсолютным путем и, вероятно, не решит, где вы думаете.

Try:

$this->addPrefixPath('My_Decorator', APPLICATION_PATH . '/forms/decorator', 'decorator'); 

Таким образом, путь должен быть хорошим. Вероятно, что Zend искал/public/application/etc ... так, как вы его использовали.

Надеюсь, что эта помощь!

+0

Нет, это не так. :(Я пробовал этот путь и играю в LOT, но не могу найти решение. – user1954544

+0

Отредактировал мой ответ с другим решением, которое «должно» работать, если в вашей настройке нет чего-то странного или специального. – Iznogood

+0

Итак, вы что только в этом случае декораторы могут существовать в библиотеке/{myFolder}/... (я новичок в zend, поэтому вопрос, возможно, является манекеном) – user1954544

0

Декораторы загружаются с помощью автозагрузчика, как и другие классы, поэтому декоратор нужно ставить в соответствии с именем класса:

напр. класс My_Decorator_Something in library/My/Decorator/Something.php

Похоже, что лучшим вариантом в этом случае является улучшение присвоения класса декоратора.

Однако, если вам нужно другое, нестандартное местоположение, вам необходимо написать и зарегистрировать свой автозагрузчик.