2011-12-10 1 views
2

나는 자동으로 젠드 양식의 검증 및 필터의 접두사 경로를 설정하기 위해 노력하고있어. 나는 많은 연구를 해왔고 많은 해결책을 찾았지만 자동으로 효과가 나타나기를 바랍니다. 내가 양식에서이 작업을 수행 할 수 있습니다 알고자동 로딩 젠드 검사기 및 필터

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

또는 요소 등

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

에 그들을 설정되어 있지만 자동으로 이미 자동 로더에서 설정 무슨으로 보는 이들에 대한 어떤 방법이 있고/또는 다시 설정하지 않고도 부트 스트랩 (또는 다른 곳)에 설정할 수 있습니까? 내가

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

를 사용하여 유효성 검사기를 추가 나는 그것이 그 후 다시 젠드로 하락, 자동 로더에 나와있는 계층 구조를 존중하고자 할 때, 이제

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

:

여기 내 자동 로더입니다. 필자는 이러한 종류의 자동 로딩을 밸리데이터와 필터에 자동으로 부트 스트랩하는 방법을 찾지 못했습니다.

감사합니다.

답변

2

나는 각 양식에 대한 모든 이상 코드를 반복 할 필요없이 내 젠드 양식 모두에 같은 설정을 얻는 방법은 다시 내 다른 형태의 모든 확장 Zend_Form를 확장 기본 폼 클래스를 만드는 것입니다. 기본 폼의 생성자에서

, 나는 요소의 여러 유형에 대해 서로 다른 장식을 설정하거나 도우미 및 유효성 검사기와 다른 것들에 대한 접두사 경로를 지정, 내 응용 프로그램의 장식을 사용자 정의 할 수 있습니다.

이 방법에 대해 주목해야 할 중요한 것은, 당신은 매우 마지막 줄 parent::__construct()를 호출해야합니다 당신의 기본 형태 __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

감사합니다, 나는 궁극적으로뿐만 아니라 기본 클래스 구현에 결국 : 여기

은 예입니다. 목록의 다음 항목은 autoloader로 설정 한 네임 스페이스를 사용하여 addElementPrefixPath 호출을 통해 자동으로 실행되도록하는 것입니다. 감사 – Ryan