浏览代码

Merge pull request #3559 from core23/action-buttons

Customize action buttons in admin class
Oskar Stark 9 年之前
父节点
当前提交
3294a3aec7

+ 66 - 0
Admin/Admin.php

@@ -2963,4 +2963,70 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
             }
         }
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureActionButtons($action, $object = null)
+    {
+        $list = array();
+
+        if (in_array($action, array('show', 'edit', 'delete', 'list', 'batch'))) {
+            $list['create'] = array(
+                'template' => 'SonataAdminBundle:Button:create_button.html.twig',
+            );
+        }
+
+        if (in_array($action, array('show', 'delete', 'acl', 'history')) && $object) {
+            $list['edit'] = array(
+                'template' => 'SonataAdminBundle:Button:edit_button.html.twig',
+            );
+        }
+
+        if (in_array($action, array('show', 'edit', 'acl')) && $object) {
+            $list['history'] = array(
+                'template' => 'SonataAdminBundle:Button:history_button.html.twig',
+            );
+        }
+
+        if (in_array($action, array('edit', 'history')) && $object) {
+            $list['acl'] = array(
+                'template' => 'SonataAdminBundle:Button:acl_button.html.twig',
+            );
+        }
+
+        if (in_array($action, array('edit', 'history', 'acl')) && $object) {
+            $list['show'] = array(
+                'template' => 'SonataAdminBundle:Button:show_button.html.twig',
+            );
+        }
+
+        if (in_array($action, array('show', 'edit', 'delete', 'acl', 'batch'))) {
+            $list['list'] = array(
+                'template' => 'SonataAdminBundle:Button:list_button.html.twig',
+            );
+        }
+
+        return $list;
+    }
+
+    /**
+     * @param string $action
+     * @param mixed  $object
+     *
+     * @return array
+     */
+    public function getActionButtons($action, $object = null)
+    {
+        $list = $this->configureActionButtons($action, $object);
+
+        foreach ($this->getExtensions() as $extension) {
+            // TODO: remove method check in next major release
+            if (method_exists($extension, 'configureActionButtons')) {
+                $list = $extension->configureActionButtons($this, $list, $action, $object);
+            }
+        }
+
+        return $list;
+    }
 }

+ 8 - 0
Admin/AdminExtension.php

@@ -180,4 +180,12 @@ abstract class AdminExtension implements AdminExtensionInterface
     public function postRemove(AdminInterface $admin, $object)
     {
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function configureActionButtons(AdminInterface $admin, $list, $action, $object)
+    {
+        return $list;
+    }
 }

+ 13 - 0
Admin/AdminExtensionInterface.php

@@ -181,4 +181,17 @@ interface AdminExtensionInterface
      * @param mixed          $object
      */
     public function postRemove(AdminInterface $admin, $object);
+
+    /*
+     * Get all action buttons for an action
+     *
+     * @param AdminInterface $admin
+     * @param array          $list
+     * @param string         $action
+     * @param mixed          $object
+     *
+     * @return array
+     */
+    // TODO: Uncomment in next major release
+    // public function configureActionButtons(AdminInterface $admin, $list, $action, $object);
 }

+ 9 - 0
Admin/AdminInterface.php

@@ -1015,4 +1015,13 @@ interface AdminInterface
      * @param object $object
      */
     public function checkAccess($action, $object = null);
+
+    /*
+     * Configure buttons for an action
+     *
+     * @param string $action
+     * @param object $object
+     *
+     */
+    // public function configureActionButtons($action, $object = null);
 }

+ 1 - 2
Resources/views/CRUD/action.html.twig

@@ -12,8 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}

+ 17 - 0
Resources/views/CRUD/action_buttons.html.twig

@@ -0,0 +1,17 @@
+{#
+
+This file is part of the Sonata package.
+
+(c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+
+For the full copyright and license information, please view the LICENSE
+file that was distributed with this source code.
+
+#}
+{% spaceless %}
+    {% for item in admin.getActionButtons(action, object|default(null)) %}
+        {% if item.template is defined %}
+            <li>{% include item.template %}</li>
+        {% endif %}
+    {% endfor %}
+{% endspaceless %}

+ 1 - 4
Resources/views/CRUD/base_acl.html.twig

@@ -12,10 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:edit_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:history_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:show_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% import 'SonataAdminBundle:CRUD:base_acl_macro.html.twig' as acl %}

+ 1 - 5
Resources/views/CRUD/base_edit.html.twig

@@ -24,11 +24,7 @@ file that was distributed with this source code.
 {% endblock %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:show_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:history_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:acl_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}{% endblock %}

+ 1 - 4
Resources/views/CRUD/base_history.html.twig

@@ -12,10 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:edit_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:acl_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:show_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block content %}

+ 1 - 5
Resources/views/CRUD/base_list.html.twig

@@ -12,11 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-{% spaceless %}
-    {% if admin.hasRoute('create') and admin.isGranted('CREATE')%}
-        <li>{% include 'SonataAdminBundle:Core:create_button.html.twig' %}</li>
-    {% endif %}
-{% endspaceless %}
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}{% endblock %}

+ 1 - 4
Resources/views/CRUD/base_show.html.twig

@@ -12,10 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:edit_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:history_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}{% endblock %}

+ 1 - 2
Resources/views/CRUD/batch_confirmation.html.twig

@@ -12,8 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}{% endblock %}

+ 1 - 3
Resources/views/CRUD/delete.html.twig

@@ -12,9 +12,7 @@ file that was distributed with this source code.
 {% extends base_template %}
 
 {% block actions %}
-    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:edit_button.html.twig' %}</li>
-    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
+    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %}
 {% endblock %}
 
 {% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active', 'template': sonata_admin.adminPool.getTemplate('tab_menu_template')}, 'twig') }}{% endblock %}

+ 16 - 0
Tests/Admin/AdminTest.php

@@ -1632,6 +1632,22 @@ class AdminTest extends \PHPUnit_Framework_TestCase
         $admin->setRequest(new Request(array('id' => '0779ca8d-e2be-11e4-ac58-0242ac11000b')));
         $this->assertSame($entity, $admin->getSubject());
     }
+
+    /**
+     * @covers Sonata\AdminBundle\Admin\Admin::configureActionButtons
+     */
+    public function testGetActionButtonsList()
+    {
+        $expected = array(
+            'create' => array(
+                'template' => 'SonataAdminBundle:Button:create_button.html.twig',
+            ),
+        );
+
+        $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
+
+        $this->assertSame($expected, $admin->getActionButtons('list', null));
+    }
 }
 
 class DummySubject