Sonata Admin的自定义Flash消息

Posted

技术标签:

【中文标题】Sonata Admin的自定义Flash消息【英文标题】:Customise flash message of Sonata Admin 【发布时间】:2018-12-25 23:39:58 【问题描述】:

我在我的 Symfony 项目中使用 Sonata admin。用户存储在 User 实体中,我已经为用户提供了将其用户详细信息作为个人资料进行管理的规定。更新配置文件时,闪烁消息看起来像,

但这条消息对我来说看起来很奇怪。如何将此消息更改为 个人资料已成功更新?是否可以处理来自 UserAdmin 类的 User 相关 Flash 消息?

任何建议/解决方案都会有所帮助。提前致谢!!

【问题讨论】:

【参考方案1】:

正如您在 CrudController 中看到的,当更新操作成功时,对于每个实体,此代码都会运行:https://github.com/sonata-project/SonataAdminBundle/blob/3.x/src/Controller/CRUDController.php#L357:

                $this->addFlash(
                    'sonata_flash_success',
                    $this->trans(
                        'flash_edit_success',
                        ['%name%' => $this->escapehtml($this->admin->toString($existingObject))],
                        'SonataAdminBundle'
                    )
                );

所以如果你想覆盖它

解决方案 1: 您更改每个实体的翻译...

解决方案 2: 您在使用您自己的特定于 UserEntity 的控制器时覆盖此 Flash 消息...

如果我是你,我将创建一个 baseController,以使这种翻译可定制,并且每个实体都将从中继承......

更新

在 baseController 中,您覆盖每个操作(创建、删除、编辑)。 做出选择后,第一个:创建自定义操作,第二个,为翻译消息创建一个受保护的变量...

class OwnBaseController extends BaseController 
  ....

  protected $successMessage = "flash_edit_success";
  protected $errorMessage = "flash_edit_error";

  ....

  /** Exemple with edit action **/

                try 
                    $existingObject = $this->admin->update($submittedObject);
                    if ($this->isXmlHttpRequest()) 
                        return $this->renderJson([
                            'result' => 'ok',
                            'objectId' => $objectId,
                            'objectName' => $this->escapeHtml($this->admin->toString($existingObject)),
                        ], 200, []);
                    
                    $this->addFlash(
                        'sonata_flash_success',
                        $this->successMessage ,    // <----- LOOK HERE
                            'messages'
                        )
                    );
                    // redirect to edit mode
                    return $this->redirectTo($existingObject);
                 catch (ModelManagerException $e) 
                    $this->handleModelManagerException($e);
                    $isFormValid = false;
                 catch (LockException $e) 
                    $this->addFlash('sonata_flash_error', $this->trans($this->errorMessage, [  // <----- LOOK HERE
                        '%name%' => $this->escapeHtml($this->admin->toString($existingObject)),
                        '%link_start%' => '<a href="'.$this->admin->generateObjectUrl('edit', $existingObject).'">',
                        '%link_end%' => '</a>',
                    ], 'SonataAdminBundle'));
                


class UserController extends OwnBaseController 
   protected $successMessage = "user_edit_success_custom_message";
   protected $errorMessage = "user_edit_error_custom_message";


【讨论】:

你能建议在 baseController 中必须实现什么吗?覆盖 EditAction??【参考方案2】:

我已经覆盖了翻译文件以更改所有实体操作共有的 Flash 消息。

我刚刚从

复制了 SonataAdminBundle.en.xliff 文件

/vendor/sonata-project/admin-bundle/src/Resources/translations/

并将其放在 src/Resources/SonataAdminBundle/translations/translations 中,然后根据需要编辑消息。

【讨论】:

以上是关于Sonata Admin的自定义Flash消息的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Admin Bundle 使用注释的自定义路由

Sonata Admin 带有数据转换器的自定义字段

Symfony Sonata Admin Bundle - 将带有树枝模板的自定义字段导出到 XLS

如何在奏鸣曲 admin Admin Controller 中设置 Flash 消息

未找到渲染 Sonata Admin Twig 文件的变量形式

Sonata Admin Bundle - 自定义模板