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

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

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

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

Ответ 1

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

Ответ 2

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

Создайте папку в папке с вашей библиотекой, которая называется App. поэтому папка с именем View так в View создает папку Helper, поэтому в папке Helper создайте класс с именем 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"

Ответ 3

Вы можете попробовать таким образом, без конфигурации, только один класс расширения ссылка: http://www.zfsnippets.com/snippets/view/id/50

<?php

/**
 * Form note element
 *
 * @author Ruslan Zavackiy <[email protected]>
 * @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>'
        ));

Ответ 4

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

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

<script language="javascript">
    $(document).ready(function() {
        $('#submit-element').append('<div id="wmd-button-bar" class="wmd-panel"></div>');
    });
</script>

Ответ 6

  • Создайте собственный декоратор, который возвращает метку (или что-то еще):

    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>$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);

и что он

Ответ 7

У меня есть элемент 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>';
)));

Ответ 8

КОД РЕШЕНИЯ добавьте этот класс в форму /application/form и распространите все ваши формы из этого класса

  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 являются формами, поэтому вы получили все функции, такие как проверка, фильтр..., а также вы можете легко использовать его и уложите столько, сколько хотите внутри вашей формы или внутри любой другой подформы. Также обработайте полученный результат его тривиальным.
 поэтому давайте сделаем пример вы получите администратора информации пользователя, такого как адрес, номер телефона и т.д., скажем, userInfo другая часть сайта yout обрабатывает более конфиденциальную информацию, такую ​​как учетная запись banck и религия. и, по крайней мере, еще один защищенный администратор зоны, который обрабатывает пользовательский пароль и роль. вы, конечно, имеете свои 3 формы, на разных контроллерах и действиях вашего кода. И теперь вам нужно собрать все это вместе, но вам нужно много разметки, чтобы показать это в ярлыках или объяснить любую область. с subforms его тривиальное просто echo $this- > form- > subformName на ваш взгляд. на этом этапе вы заметите, что тег формы не появится, и вы не можете отправить сообщение. это единственная проблема этого tecnique, и она решит с простым и (пусть я расскажу) элегантным расширением класса и перегрузкой метода рендеринга.

Ответ 9

Поместите его в свой вид script...

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

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

Ответ 10

Эта функция встроена в 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>',
))