Добавьте HTML в Zend Forms - PullRequest
       60

Добавьте HTML в Zend Forms

14 голосов
/ 02 апреля 2010

Я ищу простой фрагмент кода, который позволил бы мне добавить следующий html в мою форму zend:

<div id="wmd-button-bar" class="wmd-panel"></div>

Вот так, он должен быть выше моего элемента 'method' в форме, но это так. Для такого простого действия я не могу найти какие-либо методы, которые не включают в себя изучение ракетостроения (т.е. Zend Decorators).

Ответы [ 10 ]

28 голосов
/ 02 апреля 2010

Единственный способ, о котором я могу подумать в данный момент, - это добавить в форму фиктивный элемент и удалить все декораторы, кроме 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>

Есть хорошая статья, описывающая декораторов .

8 голосов
/ 02 апреля 2010

Вы можете создать свой собственный помощник вида libraray - App> View> Помощник> PlainTextElemet.php

Создайте в своей библиотеке папку с именем App. поэтому папка с именем View так что в View create Helper Folder так в папке Helper create класс с именем 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 добавить и следующие строки:

 autoloaderNamespaces.app = "App_"
 resources.view.helperPath.App_View_Helper="App/View/Helper"
5 голосов
/ 25 августа 2012

Вы можете попробовать этот способ, без конфигурации, только один класс расширения ссылка: 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>'
        ));
1 голос
/ 23 июня 2011

Как насчет использования JQuery:

Что-то вроде:

<script language="javascript">
    $(document).ready(function() {
        $('#submit-element').append('<div id="wmd-button-bar" class="wmd-panel"></div>');
    });
</script>
0 голосов
/ 25 февраля 2016

КОД РЕШЕНИЯ добавьте этот класс в вашу / 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 на ваш взгляд. в этот момент вы заметите, что тег формы не появится, и вы не сможете отправить сообщение. это единственная проблема этого метода, и она будет решаться с помощью простого и (позвольте мне сказать) элегантного расширения класса и перегрузки метода рендеринга.

0 голосов
/ 09 сентября 2014

Я поставляю 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>';
)));
0 голосов
/ 15 ноября 2013

Эта функциональность встроена в 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>',
))
0 голосов
/ 15 марта 2012
  • Создайте собственный декоратор, который возвращает метку (или что-либо еще):

    class My_Decorator_CustomHtml extends Zend_Form_Decorator_Abstract {
                public function 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><code>}
    </code>
  • Поместите это в путь декоратора

    $form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');

  • Создайте элемент и поместите пользовательский HTML-код в метку

    $html = '<div id="wmd-button-bar" class="wmd-panel">some text....</div>'; $element = new Zend_Form_Element_Hidden('hidden-input', array( 'label'=>$html, ));<br> $element->setDecorators(array('CustomHtml')); //add it to the form $form->addElement($element);

и все

0 голосов
/ 02 апреля 2010

Вы должны добавить декоратор .

Может быть полезен любой декоратор разметки .

Для получения дополнительной информации о декораторах см .: http://www.slideshare.net/weierophinney/leveraging-zendform-decorators

0 голосов
/ 02 апреля 2010

Поместите это в ваш скрипт вида ...

<!-- /application/views/scripts/myController/myAction.phtml -->

<div id="wmd-button-bar" class="wmd-panel"></div>
<?php echo $this->form ;?>
...