1

我已经在我的项目中成功安装了 FOSUserBundle,一切都按预期工作。但是,我正在努力解决如何在我的实际项目中实现它。

我想创建以下设置:

  • 以一种形式显示一些用户设置的页面(如新闻订阅),以第二种形式更改密码的可能性,也可能以第三种形式更改用户名。

  • 设置表单以及更多信息来自我的控制器中的现有操作,并且运行良好。

我确实尝试了一些事情,但事情还没有真正解决:

  • 我将一些功能复制FOSUserBundle\Controller\ChangePasswordController\changePasswordAction()到我自己的操作中。这样我就可以获得更改密码表单,创建视图并将其传递给我的模板。

  • 我将表单添加到我的模板中{{ form_widget(form) }}。表单正在显示,它甚至可以正常工作。我可以更改密码。但是,标签正在丢失,只是读取CurrentFirstSecond。此外,当两个新密码不匹配或留空时,也不会显示错误消息。

总而言之,我觉得我可能以错误的方式做这件事。您能否帮助我如何处理这项任务并指出我可能在哪里做一些愚蠢的事情?

这是我的操作代码,简化为这里的重要内容:

# src/Acme/MyBundle/Controller/BackendController.php
public function accountAction(){

    //pretty much a copy of FOSUserBundle\Controller\ChangePasswordController\changePasswordAction()
    $user = $this->get('security.context')->getToken()->getUser();
    $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) {
       //password has been changed, response will be generated
    }

    //more stuff going on here
    $moreStuff = ...

    //render view
    return $this->render('AcmeMyBundle:Backend:account.html.twig', array(
        'form' => $form->createView(),
        'moreStuff' => $moreStuff
    ));
}
4

1 回答 1

0

IMO 在一个动作中渲染多个表单并不是一个好主意。 始终尝试将事物分开,让一个动作只处理一个功能。

在您的树枝模板中,我建议使用渲染方法:

{% render 'AcmeBundle:SomeAction' with{'param:param} %}

如果需要,它将对带有一些参数的操作生成一个 GET 请求。

创建一个将使用子请求呈现树枝模板的操作:

// AcmeUserBundle:editAction

{% render 'AcmeUserBundle:changePasswordAction' %}
{% render 'AcmeUserBundle:settingsAction' %}
{% render 'AcmeUserBundle:profileAction' %}

然后您需要为每个表单创建一个操作。

对于密码和用户名修改,如果您的需求只是视觉上的,您还可以覆盖 FOSUserBundle 视图。如果您需要在表单上添加/删除字段,则需要创建新服务。

我建议阅读有关覆盖的 FOSUserBundle 文档:

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.md#next-steps

于 2012-09-10T07:54:33.827 回答