在sonata admin Bundle的List视图中添加新Button

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在sonata admin Bundle的List视图中添加新Button相关的知识,希望对你有一定的参考价值。

也许问题太容易回答,但我在sonata管理包的文档中搜索,我没有找到我需要的东西。当您在sonata admin Bundle中导航到模型的List视图时,您会在右上角找到Action Button,并在其下面找到add new action。在我的情况下,我需要添加新动作直接在视图中显示在此截图中:

有人可以帮我吗?

答案

我知道这是一个老问题,但我会留下这个答案以供将来参考。

我必须做类似的事情,这就是我做的。

在您的管理类中重写configureActionButtons()方法

class YourAdmin extends AbstractAdmin
{
    //...
    /**
     * Overriden from (AbstractAdmin)
     */
    public function configureActionButtons($action, $object = null)
    {
        $list = parent::configureActionButtons($action,$object);

        $list['custom_action'] = array(
                'template' =>  'AcmeBundle:YourAdmin:custom_button.html.twig',
        );

        return $list;
    }
    //...

}

然后在AcmeBundle / Resources / views / YourAdmin / custom_button.html.twig中创建按钮

{# custom_button.html.twig #}    
<a class="sonata-action-element" href="{{ admin.generateUrl('your_route') }}">
   <i class="fa fa-plus-circle"></i>Custom Action
</a>

当然,您可以在之后添加权限检查(为清楚起见,省略了它们)

希望它对某人有帮助

另一答案

您使用哪种Sonata版本?你的例子的版本是什么?

我的是2.3,看起来你不能在参数上播放,但你可以覆盖布局,只显示创建按钮。

如果您需要为所有管理员使用它,则最好从配置中覆盖布局。如果只需要列表,或显示或删除它,那么只会覆盖这些模板。在config.yml中:

sonata_admin:
    templates:
        layout:    AppBundle:Layouts:standard_layout_override.html.twig
        show:      AppBundle:Layouts:show.html.twig
        list:      AppBundle:Layouts:list.html.twig
        delete:    AppBundle:Layouts:delete.html.twig
        edit:      AppBundle:Layouts:edit.html.twig

在该文件中覆盖该块:

{% block sonata_page_content_header %}
    {% block sonata_page_content_nav %}
        {% if _tab_menu is not empty or _actions is not empty %}
            <nav class="navbar navbar-default" role="navigation">
                {% block tab_menu_navbar_header %}
                    {% if _navbar_title is not empty %}
                        <div class="navbar-header">
                            <span class="navbar-brand">{{ _navbar_title|raw }}</span>
                        </div>
                    {% endif %}
                {% endblock %}
                <div class="container-fluid">
                    <div class="navbar-left">
                        {% if _tab_menu is not empty %}
                            {{ _tab_menu|raw }}
                        {% endif %}
                    </div>

                    {% if _actions|replace({ '<li>': '', '</li>': '' })|trim is not empty %}
                        <ul class="nav navbar-nav navbar-right">
                            <li class="dropdown sonata-actions">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ 'link_actions'|trans({}, 'SonataAdminBundle') }} <b class="caret"></b></a>
                                <ul class="dropdown-menu" role="menu">
                                    {{ _actions|raw }}
                                </ul>
                            </li>
                        </ul>
                    {% endif %}
                </div>
            </nav>
        {% endif %}
    {% endblock sonata_page_content_nav %}
{% endblock sonata_page_content_header %}

您还应该能够为某些管理员执行此操作,仅覆盖为服务定义上的管理员定义特定模板,例如:

app.admin.product:
        class: AppBundleAdminProductAdmin
        arguments: [~, AppBundleEntityProduct, AppBundle:AdminProduct]
        tags:
            - {name: sonata.admin, manager_type: orm, group: Products, label: Products}
        calls:
            - [ setTemplate, [edit, AppBundle:Product:edit.html.twig]]

但我无法得到“AppBundle:Product:edit.html.twig”模板来删除覆盖同一块的列表操作。

希望这对你有所帮助。

另一答案

在SonataAdmin ~3中,您可以直接在YourEntityAdmin::configureListFields()方法中配置显示操作模板的模板。

这样做you first

在任何地方创建新模板,扩展奏鸣曲布局并使用sonata_admin_content块。

“任何地方”的确意味着“随处可见”:这让我有点困惑。

基本上,您可以在ResourcesCRUDlist__action_your_action.html.twig中创建一个模板,然后从YourEntityAdmin::configureListFields()中的配置中调用它:

class YourEntityAdmin
{
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper

             // other fields...

            ->add('_action', null, array(
                'actions' => array(

                    // ...

                    'clone' => array(
                        'template' => 'AppBundle:CRUD:list__your_action.html.twig'
                    )
                )
            ))
        ;
    }
}

记住在这个模板中写一些东西,也就像一个简单的字符串一样

{# ResourcesCRUDlist__action_your_action.html.twig #}
your action button template

“您的操作按钮模板”将在“操作”列中呈现,基本上是按钮的标签:使用模板,您可以根据需要操作它。这真的很难理解,因为在我的专栏中没有任何动作,因为我将模板留空而不渲染任何东西!

无论如何,您可以在有关CREATING A CUSTOM ADMIN ACTION的文档中找到添加新按钮(以及相关路线/操作)的完整过程。

以上是关于在sonata admin Bundle的List视图中添加新Button的主要内容,如果未能解决你的问题,请参考以下文章

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

Sonata Admin Bundle + Sonata User Bundle:覆盖登录表单

sonata-project/user-bundle dev-master 与 sonata-project/doctrine-orm-admin-bundle 冲突

Sonata admin-bundle - 没有注销导航栏

Sonata Media Bundle 与 Sonata Admin Bundle 3.0(或 2.4)

Sonata Admin Bundle - 自定义模板