Im ищет простой бит кода, который позволит мне добавить следующий html в мою zend-форму:
<div id="wmd-button-bar" class="wmd-panel"></div>
То есть, он должен быть выше моего элемента метода в форме, но это он. Для такого простого действия я не могу найти какие-либо методы, которые не связаны с изучением ракетостроения (например, Zend Decorators).
Единственный способ, который я могу сейчас представить, – добавить в форму фиктивный элемент и удалить все декораторы, кроме «HtmlTag», с атрибутами, указанными в вашем вопросе. Удаление декораторов означает, что фактический элемент не будет отображаться – будет отображаться только декоратор HtmlTag.
поэтому, если ваша форма равна $ form:
$form->addElement( 'hidden', 'dummy', array( 'required' => false, 'ignore' => true, 'autoInsertNotEmptyValidator' => false, 'decorators' => array( array( 'HtmlTag', array( 'tag' => 'div', 'id' => 'wmd-button-bar', 'class' => 'wmd-panel' ) ) ) ) ); $form->dummy->clearValidators();
Обратите внимание, что вы хотите предотвратить любую проверку элемента. Это только один способ – есть и другие.
Вывод:
<div id="wmd-button-bar" class="wmd-panel"></div>
Существует хорошая статья, описывающая декораторы http://devzone.zend.com/article/3450, и как только вы поймете, как они работают, вы обнаружите, что это не ракетостроение …
Вы можете создать свой собственный иллюстратор списка справки – App> View> Helper> PlainTextElemet.php
Создайте папку в папке с вашей библиотекой, которая называется «Приложение», поэтому папка с именем «Открыть» в «Открыть создать папку помощника», поэтому в папке «Помощник» создайте класс с именем PlainTextElement, следующим за
class App_View_Helper_PlainTextElement extends Zend_View_Helper_FormElement { public function PlainTextElement($name, $value = null, $attribs = null) { $info = $this->_getInfo($name, $value, $attribs); extract($info); // name, value, attribs, options, listsep, disable if (null === $value) {$value = $name;} return $value; } }
Затем в libray же выше создайте класс App> Form> Element> PlainText.php
И добавьте следующий код в этот класс
class App_Form_Element_PlainText extends Zend_Form_Element_Xhtml { public $helper='PlainTextElement'; public function isValid($value){ return true; } }
Теперь в вашей форме вы можете создать каждый HTML-код, который вам нравится:
$someValue = '<div id="wmd-button-bar" class="wmd-panel"></div>'; $this->addElement(new App_Form_Element_PlainText('pliantext1', array( 'value'=>$someValue, )));
Не забывайте, что в вашем приложении application.ini также добавляются fllowing lines:
autoloaderNamespaces.app = "App_" resources.view.helperPath.App_View_Helper="App/View/Helper"
Вы можете попробовать это, без конфигурации, только одну ссылку на класс расширения: http://www.zfsnippets.com/snippets/view/id/50
<?php /** * Form note element * * @author Ruslan Zavackiy <ruslan.zavackiy@gmail.com> * @package elements */ /** * Loads helper Zend_View_Helper_FormNote */ class Custom_Form_Element_Note extends Zend_Form_Element_Xhtml { public $helper = 'formNote'; } ?>
тогда
$companies->addElement('note', 'companyNote', array( 'value' => '<a href="javascript:;" id="addCompany">Add Company</a>' ));
Как насчет использования JQuery:
Что-то вроде:
<script language="javascript"> $(document).ready(function() { $('#submit-element').append('<div id="wmd-button-bar" class="wmd-panel"></div>'); }); </script>
Вы должны добавить декоратора .
Любой конструктор разметки может быть полезен.
Для получения дополнительной информации о декораторах см .: http://www.slideshare.net/weierophinney/leveraging-zendform-decorators
Создайте собственный декоратор, который возвращает метку (или что-то еще):
класс My_Decorator_CustomHtml расширяет Zend_Form_Decorator_Abstract { публичная функция render ($ content) { $ element = $ this-> getElement (); if (! $ element instanceof Zend_Form_Element) { return $ content; } if (null === $ element-> getView ()) { return $ content; } $ html = $ element-> getLabel (); return $ html; }
}
Поместите это в путь декоратора
<pre>$form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');</pre>
Создайте элемент и поместите пользовательский html в метку
$html = '<div id="wmd-button-bar" class="wmd-panel">some text....</div>'; $element = new Zend_Form_Element_Hidden('hidden-input', array( 'label'=>$html, ));
$element->setDecorators(array('CustomHtml')); //add it to the form $form->addElement($element);
вот и все
Я пришел с элементом Html, который вы можете включить в свою собственную библиотеку
class Application_Form_Element_Html extends Zend_Form_Element_Xhtml { /** * Build the element and set the decorator callback to generate the html. */ public function __construct($name, $options) { // Get the HTML to generate. $html = $options['html']; // Set the decorators for the generation. $this->setDecorators(array ( array('Callback', array ( 'callback' => function($content) use ($html) { return $html; } )) )); } }
Чтобы включить его, не забудьте сделать
$form->addPrefixPath('Application_Form_Element', APPLICATION_PATH . '/forms/Element', 'element');
Затем в форме вы можете просто вызвать:
$form->addElement($this->createElement('html', 'info', array ( 'html' => '<div>My awesome HTML</div>'; )));
КОД РЕШЕНИЯ добавьте этот класс в свою / заявку / форму и распространите все ваши формы из этого класса
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 (), чтобы закрыть его, так как вы можете видеть, что поведение ALL ZF не тронуто, поэтому оно полностью совместимо.
БОЛЬШЕ ТЕХНОЛОГИИ ПОЯСНЕНИЯ:
Чтобы добавить или ввести какой-либо код между нашими zend-формами, лучший и самый чистый способ использования SubForms во всех ваших формах, Subforms являются формами, поэтому вы получаете все функции, такие как проверка, фильтр …, а также вы можете легко использовать его и складывать как многие, как вы хотите, внутри вашей формы или внутри любой другой подформы. Также обработайте полученный результат его тривиальным.
так что давайте сделаем пример supouse, у вас есть администратор информации о пользователе, такой как адрес, номер телефона и т. д., скажем, userInfo. Другая часть вашего сайта обрабатывает более личную информацию, такую как учетная запись banck и религия. и, по крайней мере, еще один защищенный администратор зоны, который обрабатывает пользовательский пароль и роль. вы, конечно, имеете свои 3 формы, на разных контроллерах и действиях вашего кода. И теперь вам нужно собрать все это вместе, но вам нужно много разметки, чтобы показать это в ярлыках или объяснить любую область. с subforms его тривиальное просто echo $ this-> form-> subformName на ваш взгляд. на этом этапе вы заметите, что тег формы не появится, и вы не можете отправить сообщение. это единственная проблема этого tecnique, и она решит с простым и (пусть я расскажу) элегантным расширением класса и перегрузкой метода рендеринга.
Поместите это в свой сценарий просмотра …
<!-- /application/views/scripts/myController/myAction.phtml --> <div id="wmd-button-bar" class="wmd-panel"></div> <?php echo $this->form ;?>
Эта функциональность встроена в Zend через Zend_Form_Element_Note.
new Zend_Form_Element_Note('forgot_password', array( 'value' => '<a href="' . $this->getView()->serverUrl($this->getView()->url(array('action' => 'forgot-password'))) . '">Forgot Password?</a>', ))