別の入力フィールドに依存する入力フィルターを設定するにはどうすればよいですか。他のフォームフィールド(チェックボックス)が選択されている場合のみ、フォームフィールドを必須として設定したい。
zf2 でこれを処理するにはどうすればよいですか?
別の入力フィールドに依存する入力フィルターを設定するにはどうすればよいですか。他のフォームフィールド(チェックボックス)が選択されている場合のみ、フォームフィールドを必須として設定したい。
zf2 でこれを処理するにはどうすればよいですか?
私は Crisp と同じ考え方を使用していますが、コントローラーではなく Form クラスで行うことを好みます。すべてのバリデーターを同じ場所でまとめて定義する方がよいと思います。私はこのようにします:
1 - すべてのフォーム クラスは、カスタム BaseForm から継承します。
class BaseForm extends ProvidesEventsForm
{
private $postData;
protected function getPostData() {
return $this->postData;
}
public function __construct( $name = null, $serviceManager ) {
parent::__construct( $name );
$this->serviceManager = $serviceManager;
$this->request = $serviceManager->get( 'Application' )->getMvcEvent()->getRequest();
$this->postData = get_object_vars( $this->request->getPost() );
}
}
このようにして、チェックボックスのように、投稿から任意の値を簡単に選択できます (ルートパラメーターで同じアプローチを実行できるため、フォームにすべてのビューデータが含まれます)。
2 - BaseForm から継承する FormEdit クラスでは、次の方法で getPostData() 値を SomeFilter に渡します。
class FormEdit extends BaseForm
{
public function __construct( $name = null, $serviceManager ) {
parent::__construct( $name, $serviceManager );
$filter = new SomeFilter( $this->getPostData() );
$this->setInputFilter( $filter );
}
3 - そして今、それを SomeFilter で使用するだけです:
class SomeFilter extends InputFilter
{
public function __construct( $postData ) {
if ( $postData[ 'checkbox' ] ) {
$this->add( array(
'name' => 'other_input',
'required' => true,
) );
}
}
}
このようにして、コントローラーをクリーンに保ち、すべてのバリデーターを同じ場所に保ちます。
setValidationGroup
コントローラーアクションで検証する前に、チェックボックスが入力されているかどうか、それに応じてフォームでテストできます...
public function someAction()
{
$form = new MyForm; // contains name, title, checkbox, required_if_checked fields
// usual form related setup
if ($request->isPost()) {
$form->setData($request->getPost());
// see if the checkbox is checked
$checked = $this->params()->fromPost('checkbox', false);
// not checked, set validation group, omitting the dependent field
if (!$checked) {
$form->setValidationGroup(array(
'name',
'title',
'checkbox', // could probably skip this too
));
}
if ($form->isValid()) {
// do stuff with valid data
}
}
}