php中获取表单事件,Symfony2的表单事件 FormEventSubscriber

Form事件是动态处理表单动作的一种方式,在buildForm方法里添加Subscriber:

namespace Demo\AdminBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;

use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType{

private $doctrine;

public function __construct( $class ,  \Doctrine\Bundle\DoctrineBundle\Registry $doctrine)

{

parent::__construct( $class);

$this->doctrine = $doctrine;

}

public function buildForm( FormBuilderInterface $builder , array $option )

{

parent::buildForm($builder, $option);

$builder->add('name')

;        //这里传递FormFactory到监听器里 用来修改表单

$subscriber = new \Mc\AdminBundle\EventListener\FormSetDataListener($builder->getFormFactory());        //添加subscriber

$builder->addEventSubscriber( $subscriber);

}

...

然后写一下Subscriber :

namespace Demo\AdminBundle\EventListener;

use Symfony\Component\Form\FormEvent;

use Symfony\Component\Form\FormFactoryInterface;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Symfony\Component\Form\FormEvents;

class FormSetDataListener implements EventSubscriberInterface{

private $factory;

public function __construct( FormFactoryInterface $factory)

{

$this->factory = $factory;

}

//从这里获取订阅的事件

public static function getSubscribedEvents()

{

return array( FormEvents::POST_SET_DATA => 'postSetData');

}

public function postSetData( FormEvent $event )

{

$form = $event->getForm();

$data = $event->getData();

if( null == $data)

{

return ;

}

//这里我的操作是移除原先的密码框 然后手动给它填充数据 data的数据是从另外一个表单传递到这个表单来的

//(基于FOSUserBundle做的一个分步注册的功能 俗称form wizard) 这个数据来源直接在FormFactory获取就好了

//这样等于在这里重建了一下form

$form->remove('plainPassword');

$form->add('plainPassword', 'repeated', array(

'data' => $data->getPassword() ,

'type' => 'text',

'options' => array('translation_domain' => 'FOSUserBundle'),

'first_options' => array('label' => 'form.password'),

'second_options' => array('label' => 'form.password_confirmation'),

'invalid_message' => 'fos_user.password.mismatch',

)

);

}

}

到这里一个form监听事件就完成了

这里的

public static function getSubscribedEvents()

{

return array( FormEvents::POST_SET_DATA => 'postSetData');

}

还有几个事件 分别是form的不同时期 都是可以通过监听来修改它的状态:

* This file is part of the Symfony package.

*

* (c) Fabien Potencier 

*

* For the full copyright and license information, please view the LICENSE

* file that was distributed with this source code.

*/namespace Symfony\Component\Form;/**

* @author Bernhard Schussek 

*/final class FormEvents{

const PRE_SUBMIT = 'form.pre_bind';

const SUBMIT = 'form.bind';

const POST_SUBMIT = 'form.post_bind';

const PRE_SET_DATA = 'form.pre_set_data';

const POST_SET_DATA = 'form.post_set_data';

/**

* @deprecated Deprecated since version 2.3, to be removed in 3.0. Use

*             {@link PRE_SUBMIT} instead.

*/

const PRE_BIND = 'form.pre_bind';    /**

* @deprecated Deprecated since version 2.3, to be removed in 3.0. Use

*             {@link SUBMIT} instead.

*/

const BIND = 'form.bind';    /**

* @deprecated Deprecated since version 2.3, to be removed in 3.0. Use

*             {@link POST_SUBMIT} instead.

*/

const POST_BIND = 'form.post_bind';

private function __construct()

{

}

}

至于每个事件的先后顺序 可以在form一系列的定义里都可以看到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值