2011-12-10 80 views
2

我想爲Zend窗體的驗證器和過濾器自動設置前綴路徑。我做了很多研究並找到了很多解決方案,但我希望這些解決方案能夠自動生效。我知道我可以在表單中做到這一點:自動載入Zend驗證器和過濾器

$this->addElementPrefixPath('My_Validate', 'My/Validate/', 'validate'); 

或設置它們的元素,如

$input->addValidatorPrefixPath('Other_Namespace', 'Other/Namespace'); 
$input->addFilterPrefixPath('Foo_Namespace', 'Foo/Namespace'); 

上,但有什麼辦法,這些自動查找到什麼自動裝載機已設置與/或者在bootstrap(或其他地方)中設置,而不必再次設置它?

這裏是我的自動加載磁帶機:

// Autoload libraries 
$autoloader = Zend_Loader_Autoloader::getInstance();  
$autoloader->registerNamespace('Lib1_') 
    ->registerNamespace('Lib2_') 
    ->registerNamespace('Lib3_'); 

現在,當我添加使用

->addValidator('CustomValidator', false, 1) 

一個驗證我想它尊重自動裝卸列出的層次結構,之後回落至Zend的。我只是無法找到如何自動引導驗證器和過濾器的這種自動加載。

謝謝!

回答

2

我將這樣的設置導入到所有的Zend表單中,而無需爲每個表單重複代碼,這就是創建一個擴展Zend_Form的基本表單類,這反過來又擴展了我的所有其他表單。

在基礎窗體的構造函數中,我爲各種類型的元素設置了不同的裝飾器,或者爲我的應用程序定製了裝飾器,爲幫助器和驗證器等指定了前綴路徑。

關於此方法需要注意的重要一點是,如果您的基礎窗體爲__construct方法,則必須將parent::__construct()作爲最後一行。原因是因爲Zend_Form::init()方法被Zend_Form::__construct()調用,並且之後沒有其他構造函數運行。

下面是一個例子:

<?php 

class Application_Form_Base extends Zend_Form 
{ 
    // decorator spec for form elements like text, select etc. 
    public $elementDecorators = array(
     'ViewHelper', 
     'Errors', 
     array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false)), 
     array('HtmlTag', array('class' => 'form-div')), 
     array('Label', array('class' => 'form-label', 'requiredSuffix' => '*')) 
    ); 

    // decorator spec for checkboxes 
    public $checkboxDecorators = array(
     'ViewHelper', 
     'Errors', 
     array('Label', array('class' => 'form-label', 'style' => 'display: inline', 'requiredSuffix' => '*', 'placement' => 'APPEND')), 
     array('HtmlTag', array('class' => 'form-div')), 
     array('Description', array('tag' => 'p', 'class' => 'description', 'escape' => false, 'placement' => 'APPEND')), 
    ); 

    // decorator spec for submits and buttons 
    public $buttonDecorators = array(
     'ViewHelper', 
     array('HtmlTag', array('tag' => 'div', 'class' => 'form-button')) 
    ); 

    public function __construct() 
    { 
     // set the <form> decorators 
     $this->setDecorators(array(
          'FormElements', 
          array('HtmlTag', array('tag' => 'div', 'class' => 'form')), 
          'Form')); 

     // set this as the default decorator for all elements added to the form 
     $this->setElementDecorators($this->elementDecorators, array('submit', 'button'), true); 

     // add prefix paths for decorators and validators 
     $this->addElementPrefixPath('My_Decorator', 'My/Decorator', 'decorator'); 
     $this->addElementPrefixPath('My_Validator', 'My/Validator', 'validate'); 

     parent::__construct(); 
     // parent::__construct must be called last because it calls $form->init() 
     // and anything after it is not executed 
    } 
} 
+0

謝謝,我最終結束了一個基類實現爲好。接下來是使用我使用自動加載器設置的名稱空間,讓它自動運行addElementPrefixPath調用。謝謝 – Ryan