Intereting Posts
PHP – изменение текущего объекта в цикле foreach Иерархия категорий (PHP / MySQL) Когда использовать $ this-> свойство вместо $ property в PHP PHP: Есть ли какая-то санитарная обработка, которая мне нужна для использования данных _GET? Область переменных php PHP-сессии с отключенными кукисами, работает ли это? Explode, который не возвращает пустые строки? Объединение двух регулярных выражений для усечения слов в строках PHP Сравнение ключей и изменение определенных значений из многомерного массива с соответствующими значениями ключей из простого массива Как преобразовать объекты HTML, такие как & # 8211; к их эквивалентам символов? Несколько запросов на сокет TCP на PHP как рандомизировать поиск вопроса из базы данных? CodeIgniter RESTful, асинхронный / фоновый процесс PHP: нужен ли gettext LC_MESSAGES? Использование settype в PHP вместо typecasting с помощью скобок, в чем разница?

Добавьте некоторые html в формы Zend

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>', ))