Javascript Can';t重写FOSUserBundle ProfileFormType buildForm()函数
我一直在试图覆盖FOSUserBundle中的ProfileFormType。我按照问题中的步骤进行操作,因为我当前的任务与前一个类似,所以问题已经解决。(我使用AngularJS作为前端) 不幸的是,我似乎无法从父类重写buildForm()函数 我已经记录了表单错误,上面写着: 错误:此表单不应包含额外字段 当前密码: 错误:此值应为用户的当前密码 服务.ymlJavascript Can';t重写FOSUserBundle ProfileFormType buildForm()函数,javascript,php,angularjs,symfony,fosuserbundle,Javascript,Php,Angularjs,Symfony,Fosuserbundle,我一直在试图覆盖FOSUserBundle中的ProfileFormType。我按照问题中的步骤进行操作,因为我当前的任务与前一个类似,所以问题已经解决。(我使用AngularJS作为前端) 不幸的是,我似乎无法从父类重写buildForm()函数 我已经记录了表单错误,上面写着: 错误:此表单不应包含额外字段 当前密码: 错误:此值应为用户的当前密码 服务.yml services: acme.profile.form.type: class: Acme\Bulleti
services:
acme.profile.form.type:
class: Acme\BulletinBundle\Form\Type\ProfileFormType
arguments: ["%fos_user.model.user.class%"]
tags:
- { name: form.type, alias: acme_user_profile }
config.yml
fos_user:
profile:
form:
type: acme_user_profile
ProfileFormType.php
namespace Acme\BulletinBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ProfileFormType extends AbstractType {
private $class;
public function __construct($class) {
$this->class = $class;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'));
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => $this->class,
'intention' => 'profile',
'csrf_protection' => false,
));
}
public function getParent() {
return 'fos_user_profile';
}
public function getName() {
return 'acme_user_profile';
}
}
UserController.php
/**
* @Method("POST")
* @Route("/user/edit", name="user_edit", options={"expose"=true})
*/
public function editAction(Request $request) {
$id = $request->request->get('id');
$user = $this->getDoctrine()
->getManager()
->getRepository("AcmeBulletinBundle:User")
->find($id);
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->get('fos_user.profile.form.factory');
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isValid()) {
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$userManager->updateUser($user);
return new JsonResponse(['valid' => true]);
}
$errs = (string) $form->getErrors(true, false);
return new JsonResponse(['valid' => $errs]);
}
edit.html
<form class="form-group text-left" ng-submit="submit()" novalidate name="userFrm">
<div class="form-group">
<label for="user.email" class="required">Email</label>
<input id="user.email" name="user.username" class="form-control" required type="text" ng-model="user.email" />
</div>
<div class="form-group">
<label for="user.username" class="required">Username</label>
<input id="user.username" name="user.username" class="form-control" required type="text" ng-model="user.username" />
</div>
<input type="submit" value="Update" ng-disabled="userFrm.$invalid" class="btn btn-primary center-block col-lg-2" />
</form>
问题是您正在扩展配置文件表单,但表单模板中不存在任何主字段。从表单类型中删除以下行:
public function getParent() {
return 'fos_user_profile';
}
或者将缺少的字段
current\u password
添加到edit.html
我通常以不同的方式覆盖配置文件表单。尝试扩展fosprofiletype表单,并在buildForm方法中调用父::buildForm
,但这对我不起作用。它会抛出一个内部服务器错误谢谢!成功了。事实证明,没有必要继承ProfileFormType。
public function getParent() {
return 'fos_user_profile';
}