나는 각 양식에 대한 모든 이상 코드를 반복 할 필요없이 내 젠드 양식 모두에 같은 설정을 얻는 방법은 다시 내 다른 형태의 모든 확장 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
}
}
감사합니다, 나는 궁극적으로뿐만 아니라 기본 클래스 구현에 결국 : 여기
은 예입니다. 목록의 다음 항목은 autoloader로 설정 한 네임 스페이스를 사용하여 addElementPrefixPath 호출을 통해 자동으로 실행되도록하는 것입니다. 감사 – Ryan