web-dev-qa-db-ja.com

ZendフォームにHTMLを追加する

次のhtmlをzendフォームに追加できる簡単なコードを探しています。

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

それは、フォームの「method」要素の上にある必要がありますが、それだけです。このような単純なアクションでは、ロケット科学の学習を伴わない方法(ZendDecoratorsなど)を見つけることができません。

14
bluedaniel

現時点で私が考えることができる唯一の方法は、フォームにダミー要素を追加し、質問で指定した属性を持つ「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();

要素の検証を防止したいことに注意してください。これは1つの方法にすぎません。おそらく、他の方法もあります。

出力:

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

良い デコレータを説明する記事 があります。

28
jah

独自のビューヘルパーlibrarayを作成できます--App> View> Helper> 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にも次の行を追加することを忘れないでください。

 autoloaderNamespaces.app = "App_"
 resources.view.helperPath.App_View_Helper="App/View/Helper"
8
user1400

この方法を試すことができます。設定は必要ありません。拡張クラスの参照は1つだけです。 http://www.zfsnippets.com/snippets/view/id/5

<?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>'
        ));
5
Tri.Le

JQueryを使用するのはどうですか?

何かのようなもの:

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

ソリューションコードこのクラスを/ 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()を呼び出す必要があります。これは、すべてのZFの動作が変更されていないため、完全に互換性があることがわかります。

より多くの技術の説明:

すべてのフォームでサブフォームを使用する最良かつ最もクリーンな方法でzendフォーム間にコードを追加または挿入するために、サブフォームはフォームであるため、検証、フィルターなどのすべての機能を利用できます。また、簡単に再利用して、次のようにスタックできます。フォーム内または他のサブフォーム内に必要な数だけ。また、結果の投稿をその些細なものとして処理します。
では、住所や電話番号などのユーザー情報の管理者を取得したと仮定して、ユーザーサイトの別の部分が銀行口座や宗教などのより多くの個人情報を処理するとします。また、ユーザーのパスワードと役割を処理する、少なくとも1人の制限区域管理者が保護します。もちろん、コードのさまざまなコントローラーとアクションで、3つのフォームがあります。そして今、あなたはそれをすべてまとめる必要がありますが、それをラベルに表示したり、任意の領域を説明したりするには、多くのマークアップが必要です。サブフォームを使用すると、その些細なことは、ビューで$ this-> form-> subformNameをエコーするだけです。この時点で、フォームタグが表示されず、投稿を送信できないことがわかります。これはこのテクニックの唯一の問題であり、シンプルで(私に言わせれば)エレガントなクラス拡張とrenderメソッドのオーバーロードで解決します。

0
Plinio

私はあなたがあなた自身のライブラリに含めることができる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
Baptiste Pernet
  • ラベル(またはその他)を返すカスタムデコレータを作成します。

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

以上です

0
mohamed elbou