2012-10-05 32 views
1

我想将FOSUserBundle的change_password表单集成到我的设置页面,其中还有change_email表单或其他信息。我知道如何在我的设计中集成FOS,但不知道如何去做我想做的事情。现在FOSUserBundle将更改密码表单与其他表格集成

,形式产生通过控制器和一个表单生成方法,我不知道如何修改这个...提前

感谢, 瓦伦丁

回答

7

(我看到这是一个8个月的问题,但也许它可以帮助某人。)

最简单的方法是对密码更改事件使用单独的表单,如果您只想为用户配置文件制作一个页面。 FOSUserBundle提供此功能。所以如果你想使用你自己的路线和表格,你可以复制FOS控制器和表格中的代码,改变一些参数(比如路线名称和设计),然后设置好。可能有一些更复杂的方法来使用这个Bundle,但在我看来这是最简单和最灵活的。

FOSUserBundle位于/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/目录中。 密码控制器位于/Controller/ChangePasswordController.php ,表格位于/Resources/views/ChangePassword

这是我在设置页面中做到的。我只使用密码更改功能,但我认为,您可以针对不同的表单分别执行操作,然后将用户重定向到带有视图的原始索引页面。

这是控制器(我只改变了重定向路径和视图):

use JMS\SecurityExtraBundle\Annotation\Secure; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use FOS\UserBundle\Model\UserInterface; 

class SettingsController extends Controller 
{ 
    /** 
    * @Secure(roles="ROLE_USER") 
    */ 
    public function indexAction() 
    { 
     $user = $this->container->get('security.context')->getToken()->getUser(); 
     if (!is_object($user) || !$user instanceof UserInterface) { 
      throw new AccessDeniedException('This user does not have access to this section.'); 
     } 

     $form = $this->container->get('fos_user.change_password.form'); 
     $formHandler = $this->container->get('fos_user.change_password.form.handler'); 

     $process = $formHandler->process($user); 
     if ($process) { 
      $this->get('session')->setFlash('notice', 'Password changed succesfully'); 

      return $this->redirect($this->generateUrl('settings')); 
     } 

     return $this->render('AcmeHelloBundle:Settings:password.html.twig', ['form' => $form->createView()]); 
    } 
} 

这是视图(password.html.twig) - 这里唯一的变化是路径:路径( '设置')

<form action="{{ path('settings') }}" {{ form_enctype(form) }} method="POST" class="fos_user_change_password"> 
    {{ form_widget(form) }} 
    <div> 
     <input type="submit" value="{{ 'change_password.submit'|trans({}, 'FOSUserBundle') }}" /> 
    </div> 
</form> 

所以就是这样。现在你有一个很好的密码更改表单,所有繁重的工作都由FOS UserBundle来完成!