ネストされたZend\Form\Fieldset
s およびZend\Form\Collection
sを使用しています。これは、フォーム入力から完全なオブジェクト (保存する準備ができている) を取得するために、複雑なオブジェクト構造をフォームにマップするための非常に快適な方法を提供します。
今フォームに追加したい要素は、可能なプロトコルのリストを表す必要があります。id
データベースでは、列とオブジェクトの構造を持つ単純なテーブルでname
あり、オブジェクトの構造は のように記述できますEndpoint has Protocol[]
。(s. 以下)を定義しましたが、この要素をプロトタイプMultiCheckbox
にバインドする方法がわかりません。Protocol
a の場合、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(...)
-- に使用しようとしますが、これは機能しません。