2015-09-11 2 views
1

Я пытался переопределить ProfileFormType из FOSUserBundle. Я выполнил шаги из моей проблемы previous, которая была решена, так как моя текущая задача каким-то образом похожа на предыдущую. (Я использую AngularJS для интерфейса)Невозможно переопределить функцию FOSUserBundle ProfileFormType buildForm()

К сожалению, я не могу переопределить функцию buildForm() из родительского класса.

Я вошел ошибки формы, и он говорит:

ERROR: This form should not contain extra fields.

current_password:

ERROR: This value should be the user's 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); 
       } 
    } 
}]); 
+0

Я обычно переопределяю форму профиля по-другому. Попробуйте расширить форму fosprofiletype и вызвать «parent :: buildForm» в методе buildForm. – Matteo

+0

Не работает для меня. Он выдает ошибку внутреннего сервера – schizoskmrkxx

ответ

2

Проблема заключается в том, что вы простирающийся профиль формы, но в шаблоне формы ни одна из основной поля существуют. Удалить эти строки из вашего типа формы:

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

или добавить недостающее поле current_password к edit.html.

+0

Спасибо! Это сработало. Оказывается, наследование типа ProfileFormType не требуется. – schizoskmrkxx

Смежные вопросы