无法覆盖FOSUserBundle ProfileFormType buildForm()函数

时间:2015-09-11 13:36:17

标签: javascript php angularjs symfony fosuserbundle

我一直试图从FOSUserBundle覆盖ProfileFormType。我按照previous问题的步骤进行了操作,因为我当前的任务与之前的任务类似,所以我已经解决了这个问题。 (我使用AngularJS作为前端)

不幸的是,我似乎无法覆盖父类的buildForm()函数。

我已经记录了表单错误,并说:

  

错误:此表单不应包含额外字段。

     

current_password:

     

错误:此值应为用户的当前密码。

services.yml

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>

edit.js

angular.module('myApp', [])
       .controller('EditUserCtrl', ["$scope", "$http", "$state", "$stateParams", function ($scope, $http, $state, $stateParams) {

    //returns {username: data1, email: data2, enabled: data3}
    $http.get(Routing.generate('get_user', {id: $stateParams.id}))
                        .then(function (response) {
                            var user = response.data.user;
                            $scope.user = user;
                        });

    $scope.submit = function () {
                    var formData = {
                        fos_user_profile_form: $scope.user,
                        id : $stateParams.id
                    };

                    var success = function (response) {
                        var valid = response.data.valid;
                        console.log(valid);
                    };
                    var error = function (reason) {
                        alert('error');
                    };

                    console.log($scope.user);

                    $http.post(Routing.generate('user_edit'), $.param(formData), {
                        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                    })
                            .then(success, error);
                }
    }
}]);

1 个答案:

答案 0 :(得分:2)

问题在于您扩展了配置文件表单,但在表单模板中不存在任何主要字段。从表单类型中删除以下行:

public function getParent() {
    return 'fos_user_profile';
}

或将遗失的字段current_password添加到edit.html