web-dev-qa-db-ja.com

Zend Framework:Zend Form Hidden Elementのデコレーターを削除するにはどうすればよいですか?

非表示のフォーム要素のデフォルトのデコレータを削除しようとしています。デフォルトでは、非表示の要素は次のように表示されます。

<dt>Hidden Element Label (if I had set one)</dt>
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd>

非表示の要素がページのスペースを占有しないようにします。デフォルトのデコレータをすべて削除したいので、入力タグのみを残します。

<input type="hidden" name="foobar" value="1" id="foobar">

どうすればこれを達成できますか?

49
Andrew

非表示フィールドの場合、必要なデコレーターは1つだけです-ViewHelper:

$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));

これにより、Dt-Ddラッパーとラベルなしで、入力フィールドのみがレンダリングされます。

50
ischenkodv

Zend Element Decorators ドキュメントから:

デフォルトのデコレータをロードする必要はありません

デフォルトでは、デフォルトのデコレータはオブジェクトの初期化中にロードされます。これを無効にするには、コンストラクタに「disableLoadDefaultDecorators」オプションを渡します。

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);
32
drfloob

これを使う

$element->removeDecorator('DtDdWrapper');

特定の要素の周りのdt ddタグを取り除くため

24
dittonamed

//上記に基づく-隠された要素を$ thisフォームに追加する単純な関数

/**
 * Add Hidden Element
 * @param $field
 * @param value
 * @return nothing - adds hidden element
 * */
public function addHid($field, $value){     
    $hiddenIdField = new Zend_Form_Element_Hidden($field);
    $hiddenIdField->setValue($value)
          ->removeDecorator('label')
          ->removeDecorator('HtmlTag');     
    $this->addElement($hiddenIdField);
}
6
Joseph

隠された入力がたくさんある場合のベストアンサーは次のとおりです。

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');
5
yanek1988

他の投稿で述べたように、setDisableLoadDefaultDecorators(true)は既にロードされていると機能しません...しかしclearDecorators()は機能します!

4
Grant Perry

DisableLoadDefaultDecoratorsを正しく動作させることができませんでした。ここに私が思いついた解決策があります。

$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
              ->removeDecorator('label')
              ->removeDecorator('HtmlTag'); 

HTMLでは、非表示フィールドは追加タグなしで表示されます。

...
<dt><label for="password" class="required">Password</label></dt>
<dd><input type="password" name="password" id="password" value="" /></dd>
<input type="hidden" name="id" value="1" id="id" />
...
3
Andrew

まあ、2012年とまだ同じ問題。デコレータを削除すると、htmlは検証されません。それらを残すと、非表示の要素がスペースを占有します。すべてのプロジェクトで、CSSヘルパー.hiddenを使用しているため、<dd>およびラベルの設定を解除します。

$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar'));
$element->removeDecorator('Label');
$element->getDecorator('HtmlTag')->setOption('class', 'hidden');

有効なhtml(5)、見栄えの良いフォーム。これは、隠しフィールドのカスタムデコレータにも使用できます。

[〜#〜] edit [〜#〜]

これは私がそれを自分のフォーム要素に入れる方法です:

class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden
{
    public function render(Zend_View_Interface $view = null)
    {
        $this->removeDecorator('Label');
        $this->getDecorator('HtmlTag')->setOption('class', 'hidden');
        return parent::render($view);
    }
}
2
Novalis

http://www.phpfreaks.com/forums/index.php?topic=225848. のtakeme2webからの提案

$ yourhiddenzendformelement-> setDecorators(array( 'ViewHelper'));

2

まだ<dl>ラッパーを使用している場合、単一の「ViewHelper」デコレーターのみを使用すると、無効なマークアップが生成されます。 ZF-2718 で別のアプローチの概要を説明します。これにより、<dd>でラップされたサブフォームに非表示フィールドが追加されます。

2
Tim Brayshaw

これを使って:

    foreach ($this->getElements() as $element) {

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
0
MD66