19

配列表記を使用して非表示のフォームフィールドをフォームに追加できるようにしたいと思います。私はこのようなHTMLでこれを行うことができます:

<input type="hidden" name="contacts[]" value="123" />
<input type="hidden" name="contacts[]" value="456" />

フォームが送信されると、$_POST配列には、配列としてグループ化された非表示の要素値が含まれます。

array(
    'contacts' => array(
        0 => '123'
        1 => '456'
    )
)

フォームに非表示の要素を追加し、次のように配列表記を指定できます。

$form->addElement('hidden', 'contacts', array('isArray' => true));

ここで、その要素に配列を入力すると、値が配列として格納され、要素が上記のHTMLとしてレンダリングされるはずです。

$form->populate($_POST);

ただし、これは機能しません。私が使用しているZendFrameworkのバージョンにバグがある可能性があります。私はこれを正しくやっていますか?私は別の方法で何をすべきですか?上記の結果をどのように達成できますか?必要に応じて、カスタムフォーム要素を作成します。何をする必要があるか教えてください。

4

4 に答える 4

19

求める結果を得るには、サブフォームを使用する必要があります。ドキュメントはかなりの乗り物でしたが、ここで見つけることができます

そこで見つけたものを使用して、次のformLを作成しました

 <?php

class Form_Test extends Zend_Form {

    public function init() {
        $this->setMethod('post');
        $this->setIsArray(true);

        $this->setSubFormDecorators(array(
            'FormElements',
            'Fieldset'
        ));

        $subForm = new Zend_Form(array('disableLoadDefaultDecorators' => true));

        $subForm->setDecorators(array(
            'FormElements',
        ));

        $subForm->addElement('hidden', 'contacts', array(
            'isArray' => true,
            'value' => '237',
            'decorators' => Array(
                'ViewHelper',
            ),
        ));

        $subForm2 = new Zend_Form(array('disableLoadDefaultDecorators' => true));

        $subForm2->setDecorators(array(
            'FormElements',
        ));

        $subForm2->addElement('hidden', 'contacts', array(
            'isArray' => true,
            'value' => '456', 'decorators' => Array(
                'ViewHelper',
            ),
        ));

        $this->addSubForm($subForm, 'subform');
        $this->addSubForm($subForm2, 'subform2');


        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setValue('Submit');

        $this->addElement('submit', 'submit');
    }

}

Wichはこのhtmlを出力します:

<form enctype="application/x-www-form-urlencoded" method="post" action=""><dl class="zend_form">
<input type="hidden" name="contacts[]" value="237" id="contacts">

<input type="hidden" name="contacts[]" value="456" id="contacts">

<dt id="submit-label">&nbsp;</dt><dd id="submit-element">

<input type="submit" name="submit" id="submit" value="submit"></dd></dl></form>

送信すると、投稿は次のようになります。

array(2) {
  ["contacts"] => array(2) {
    [0] => string(3) "237"
    [1] => string(3) "456"
  }
  ["submit"] => string(6) "submit"
}

それで、あなたが求める種類のフォームを作成する方法です。お役に立てれば!質問がある場合はコメントを投稿してください!

あなたが私に尋ねれば、それはかなりハックです。基本的にサブフォームを作成しますが、フォームデコレータを無効にして、要素だけが出力されるようにします。同一のcontacts[]要素は異なる形式であるため、オブジェクトzendはそれらを上書きせず、機能します。しかし、ええ..

編集:ラベルを削除し、非表示の入力をゴミで囲むように少し変更しました。

于 2010-09-09T00:53:27.040 に答える
16

配列表記を使用するには、要素が親配列に「属する」ことを指定する必要があります。

$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
于 2011-08-15T04:26:47.580 に答える
8

これは確かにZendFrameworkのバグのようです-要素のvalue属性は適切に配列に設定されていますが、要素がレンダリングされるときに無視されます-$this->view->escape($value)要素のhtmlを出力するために使用されます。このような要素にカスタムヘルパーを実装することで、これを解決しました。

class My_View_Helper_HiddenArray extends Zend_View_Helper_FormHidden 
{
    public function hiddenArray($name, $value = null, array $attribs = null)
    {
        if (is_array($value)) {
            $elementXHTML = '';
            // do not give element an id due to the possibility of multiple values
            if (isset($attribs) && is_array($attribs) && array_key_exists('id', $attribs)) {
                unset($attribs['id']);
            }

            foreach ($value as $item) {
                $elementXHTML .= $this->_hidden($name, $item, $attribs);
            }
            return $elementXHTML;

        } else {
            return $this->formHidden($name, $value, $attribs);
        }
    }
}

これは、次の方法で使用した場合:

$contacts = $form->createElement('hidden', 'contacts')
->setIsArray(true)
->setDecorators(array(
    array('ViewHelper', array('helper' => 'HiddenArray')),
));
$form->addElement($contacts);

必要な出力を生成します。

ここでZend_View_Helper_FormHiddenを拡張する理由は、配列値が設定されていない場合にデフォルトの動作を呼び出せるようにするためです(return parent::formHidden($name, $value, $attribs))。

これが誰かに役立つことを願っています:)

于 2012-01-31T15:56:43.947 に答える
0

ZFの新しいバージョンについては、https: //framework.zend.com/manual/2.1/en/modules/zend.form.elements.html#multicheckboxを使用する必要があります

于 2019-03-06T16:16:48.643 に答える