3

ネストされたZend\Form\Fieldsets およびZend\Form\Collectionsを使用しています。これは、フォーム入力から完全なオブジェクト (保存する準備ができている) を取得するために、複雑なオブジェクト構造をフォームにマップするための非常に快適な方法を提供します。

今フォームに追加したい要素は、可能なプロトコルのリストを表す必要があります。idデータベースでは、列とオブジェクトの構造を持つ単純なテーブルでnameあり、オブジェクトの構造は のように記述できますEndpoint has Protocol[]。(s. 以下)を定義しましたが、この要素をプロトタイプMultiCheckboxにバインドする方法がわかりません。Protocola の場合、Fieldset経由で機能しFieldset\setObject(...)ます。

Zend\Formチェックボックスからオブジェクトを作成するフォーム処理メカニズムを取得するには?


これまでのコード:

EndpointFieldset.php

// namespace ...;
// use ....;
class EndpointFieldset extends Fieldset
{
    // ...
    public function init()
    {
        parent::init();
        $this->add(
            [
                'type' => 'multi_checkbox',
                'name' => 'protocols',
                'options' => [
                    'label' => _('protocols'),
                    'label_attributes' => [
                        'class' => 'col-md-1 protocol-field'
                    ],
                    'value_options' => $this->getValueOptions(),
                    'selected' => static::PROTOCOLS_DUMMY_VALUE
                ]
            ]
        );
    }
    // ...
    protected function getValueOptions()
    {
        $valueOptions = [];
        foreach (Protocol::PROTOCOLS as $key => $value) {
            $valueOptions[] = [
                'value' => $key,
                'label' => $value
            ];
        }
        return $valueOptions;
    }
}

myform.phml

use Zend\Form\View\Helper\FormMultiCheckbox;
echo $this->formMultiCheckbox($myFieldset->get('protocols'), FormMultiCheckbox::LABEL_PREPEND);

アップデート

新しいエントリを保存するための回避策を見つけました。フォームによって提供されたオブジェクトを手動で完成させProtocol、値からオブジェクトを作成するだけMultiCheckBoxです。しかし、(既存のエントリを編集するために) 完全なオブジェクトを更新フォームに渡すと、通知が表示され、チェックボックスが構築されません。

注意: クラス My\DataObject\Protocol のオブジェクトは、202 行目の /var/www/path/to/project/vendor/zendframework/zend-form/src/View/Helper/FormMultiCheckbox.php で int に変換できませんでした

これについての私の解釈は、 はMultiCheckBoxプリミティブ型として値を持つ配列を期待するということです (例: int)。代わりに、Protocolオブジェクトを含む配列を取得し、その値をin_array(...)-- に使用しようとしますが、これは機能しません。

4

0 に答える 0