Forms ZF2相关表单字段
如何设置依赖于其他输入字段的输入筛选器。 我只想在选中其他表单字段(复选框)时将表单字段设置为必需Forms ZF2相关表单字段,forms,filter,zend-framework2,Forms,Filter,Zend Framework2,如何设置依赖于其他输入字段的输入筛选器。 我只想在选中其他表单字段(复选框)时将表单字段设置为必需 如何在zf2中处理此问题?在控制器操作中验证前,您可以在表单上测试复选框是否已填充,并相应地设置验证组 public function someAction() { $form = new MyForm; // contains name, title, checkbox, required_if_checked fields // usual form related setup
如何在zf2中处理此问题?在控制器操作中验证前,您可以在表单上测试复选框是否已填充,并相应地设置验证组
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
}
}
}
我使用了与Crisp相同的想法,但是我更喜欢在表单类中而不是在控制器中进行。我认为最好将所有验证器一起定义在同一个位置。我是这样做的:
class FormEdit extends BaseForm
{
public function __construct( $name = null, $serviceManager ) {
parent::__construct( $name, $serviceManager );
$filter = new SomeFilter( $this->getPostData() );
$this->setInputFilter( $filter );
}
1所有表单类都继承自自定义基表单:
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,
) );
}
}
}
通过这种方式,您可以保持控制器干净,并将所有验证器放在同一位置。要么这样做,要么编写自己的验证器,然后从查看相同的验证器开始,看看如何访问其他表单元素。