КОД РЕШЕНИЯ добавьте этот класс в вашу / application / форму и расширите все ваши формы из этого класса
class Application_Form_SpecialSubform extends Zend_Form_SubForm
{
protected $_openTag = '<form>';
protected $_closeTag = '</form>';
protected $_htmlIniCloseTagChars = '</';
public function render(\Zend_View_Interface $view = null) {
if (!$this->isPartOfAForm())
$this->addDecorator('Form');
return parent::render($view);
}
protected function isPartOfAForm(){
return (!is_null($this->getElementsBelongTo()));
}
public function initForm()
{
$defaultZendCloseTag = $this->getDefaultFormViewCloseTag();
$completeTag='';
$this->addDecorator('Form');
$this->getDecorator('Form')->setElement($this);
$completeTag=$this->getDecorator('Form')->render('');
$this->set_openTag(str_replace($defaultZendCloseTag, '', $completeTag));
return $this->get_openTag();
}
public function endForm()
{
return $this->get_closeTag();
}
protected function getDefaultFormViewCloseTag()
{
$defaultFormTag = $this->get_closeTag();
$view = $this->getView();
$defaultTag = $view->form('',null,true);
$pos = strrpos ($this->get_htmlIniCloseTagChars(),$defaultFormTag);
if ($pos !== false) {
$defaultFormTag = substr($defaultTag, $pos);
}
$this->set_closeTag($defaultFormTag);
return $defaultFormTag;
}
protected function get_openTag() {
return $this->_openTag;
}
protected function get_closeTag() {
return $this->_closeTag;
}
protected function get_htmlIniCloseTagChars() {
return $this->_htmlIniCloseTagChars;
}
protected function set_openTag($_openTag) {
$this->_openTag = $_openTag;
}
protected function set_closeTag($_closeTag) {
$this->_closeTag = $_closeTag;
}
protected function set_htmlIniCloseTagChars($_htmlIniCloseTagChars) {
$this->_htmlIniCloseTagChars = $_htmlIniCloseTagChars;
}
}
на ваш взгляд, вы должны вызывать initForm (), когда хотите открыть тег формы и endForm (), чтобы закрыть его, поскольку вы можете видеть, что ВСЕ поведение ZF не затронуто, поэтому оно полностью совместимо.
БОЛЬШЕ ТЕХНИЧЕСКОГО ОБЪЯСНЕНИЯ:
Чтобы добавить или внедрить любой код между нашими Zend-формами наилучшим и наиболее чистым способом, которым он использует подформы во всех ваших формах, субформы являются формами, поэтому вы получаете все функции, такие как проверка, фильтрация, а также возможность легкого повторного использования. и складывать столько, сколько вы хотите внутри вашей формы или внутри любой другой подчиненной формы. Также обработайте полученный пост его тривиальным.
так что давайте сделаем пример
Допустим, у вас есть администратор пользовательской информации, такой как адрес, номер телефона и т. д., скажем, userInfo
другая часть сайта yout обрабатывает более личную информацию, такую как учетная запись банка и религия. и, по крайней мере, еще одна защищенная администратором защищенная область, которая обрабатывает пароль и роль пользователя.
у вас, конечно, есть ваши 3 формы, на разных контроллерах и действиях вашего кода.
И теперь вам нужно собрать все это вместе, но вам нужно много разметки, чтобы показать это в ярлыках или объяснить любую область.
с подчиненными его тривиальным просто повторить $ this-> form-> subformName на ваш взгляд.
в этот момент вы заметите, что тег формы не появится, и вы не сможете отправить сообщение. это единственная проблема этого метода, и она будет решаться с помощью простого и (позвольте мне сказать) элегантного расширения класса и перегрузки метода рендеринга.