如何设置依赖于其他输入字段的输入过滤器。 我只想在选择其他表单字段(复选框)时根据需要设置表单字段。
我如何在zf2中处理这个?
答案 0 :(得分:1)
我使用与Crisp相同的想法,但我更喜欢在Form类而不是控制器中使用它。我认为最好将所有验证器一起定义在同一个地方。我是这样做的:
1 - 所有Form类都继承自定义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,
) );
}
}
}
这样可以保持Controller清洁,并将所有验证器放在同一个地方。
答案 1 :(得分:0)
您可以测试是否填充了复选框并在表单上相应地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
}
}
}