Browse Source

Merge pull request #2617 from Wharenn/helper_fix

Allow to specify admin when using urlsafeid twig helper
Thomas 10 years ago
parent
commit
1c604dc38a

+ 2 - 2
Resources/doc/cookbook/recipe_customizing_a_mosaic_list.rst

@@ -63,9 +63,9 @@ The ``list_outer_rows_mosaic.html.twig`` is the name of one mosaic's tile. You s
 
     {% block sonata_mosaic_description %}
         {% if admin.isGranted('EDIT', object) and admin.hasRoute('edit') %}
-            <a href="{{ admin.generateUrl('edit', {'id' : object|sonata_urlsafeid }) }}">{{ meta.title|truncate(40) }}</a>
+            <a href="{{ admin.generateUrl('edit', {'id' : object|sonata_urlsafeid(admin) }) }}">{{ meta.title|truncate(40) }}</a>
         {% elseif admin.isGranted('SHOW', object) and admin.hasRoute('show') %}
-            <a href="{{ admin.generateUrl('show', {'id' : object|sonata_urlsafeid }) }}">{{ meta.title|truncate(40) }}</a>
+            <a href="{{ admin.generateUrl('show', {'id' : object|sonata_urlsafeid(admin) }) }}">{{ meta.title|truncate(40) }}</a>
         {% else %}
             {{ meta.title|truncate(40) }}
         {% endif %}

+ 1 - 2
Resources/doc/cookbook/recipe_sortable_listing.rst

@@ -22,8 +22,7 @@ Pre-requisites
 - you already have SonataAdmin and DoctrineORM up and running
 - you already have an Entity class for which you want to implement a sortable feature. For the purpose of the example we are going to call it ``Client``.
 - you already have an Admin set up, in this example we will call it ``ClientAdmin``
-- you already have gedmo/doctrine-extensions bundle in your project (check stof/doctrine-extensions-bundle
-for easier integration in your project) with the sortable feature enabled
+- you already have gedmo/doctrine-extensions bundle in your project (check stof/doctrine-extensions-bundle for easier integration in your project) with the sortable feature enabled
 - you already have pixassociates/sortable-behavior-bundle bundle in your project
 
 The recipe

+ 2 - 2
Resources/views/CRUD/list_outer_rows_mosaic.html.twig

@@ -59,9 +59,9 @@ This template can be customized to match your needs. You should only extends the
 
                             {% block sonata_mosaic_description %}
                                 {% if admin.isGranted('EDIT', object) and admin.hasRoute('edit') %}
-                                    <a class="mosaic-inner-link" href="{{ admin.generateUrl('edit', {'id' : object|sonata_urlsafeid }) }}">{{ meta.title|truncate(40) }}</a>
+                                    <a class="mosaic-inner-link" href="{{ admin.generateUrl('edit', {'id' : object|sonata_urlsafeid(admin) }) }}">{{ meta.title|truncate(40) }}</a>
                                 {% elseif admin.isGranted('SHOW', object) and admin.hasRoute('show') %}
-                                    <a class="mosaic-inner-link" href="{{ admin.generateUrl('show', {'id' : object|sonata_urlsafeid }) }}">{{ meta.title|truncate(40) }}</a>
+                                    <a class="mosaic-inner-link" href="{{ admin.generateUrl('show', {'id' : object|sonata_urlsafeid(admin) }) }}">{{ meta.title|truncate(40) }}</a>
                                 {% else %}
                                     {{ meta.title|truncate(40) }}
                                 {% endif %}

+ 57 - 2
Tests/Twig/Extension/SonataAdminExtensionTest.php

@@ -50,6 +50,11 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
      */
     private $admin;
 
+    /**
+     * @var AdminInterface
+     */
+    private $adminBar;
+
     /**
      * @var FieldDescriptionInterface
      */
@@ -138,14 +143,26 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
                 return $id;
             }));
 
+        $this->adminBar = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
+        $this->adminBar->expects($this->any())
+            ->method('isGranted')
+            ->will($this->returnValue(true));
+        $this->adminBar->expects($this->any())
+            ->method('getNormalizedIdentifier')
+            ->with($this->equalTo($this->object))
+            ->will($this->returnValue(12345));
+
         // for php5.3 BC
-        $admin = $this->admin;
+        $admin    = $this->admin;
+        $adminBar = $this->adminBar;
 
         $container->expects($this->any())
             ->method('get')
-            ->will($this->returnCallback(function ($id) use ($admin) {
+            ->will($this->returnCallback(function ($id) use ($admin, $adminBar) {
                 if ($id == 'sonata_admin_foo_service') {
                     return $admin;
+                } elseif ($id == 'sonata_admin_bar_service') {
+                    return $adminBar;
                 }
 
                 return null;
@@ -686,4 +703,42 @@ class SonataAdminExtensionTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals(1234567, $this->twigExtension->getUrlsafeIdentifier($entity));
     }
+
+    public function testGetUrlsafeIdentifier_GivenAdmin_Foo()
+    {
+        $entity = new \stdClass();
+
+        // set admin to pool
+        $this->pool->setAdminServiceIds(array('sonata_admin_foo_service', 'sonata_admin_bar_service'));
+        $this->pool->setAdminClasses(array('stdClass'=> array('sonata_admin_foo_service', 'sonata_admin_bar_service')));
+
+        $this->admin->expects($this->once())
+            ->method('getUrlsafeIdentifier')
+            ->with($this->equalTo($entity))
+            ->will($this->returnValue(1234567));
+
+        $this->adminBar->expects($this->never())
+            ->method('getUrlsafeIdentifier');
+
+        $this->assertEquals(1234567, $this->twigExtension->getUrlsafeIdentifier($entity, $this->admin));
+    }
+
+    public function testGetUrlsafeIdentifier_GivenAdmin_Bar()
+    {
+        $entity = new \stdClass();
+
+        // set admin to pool
+        $this->pool->setAdminServiceIds(array('sonata_admin_foo_service', 'sonata_admin_bar_service'));
+        $this->pool->setAdminClasses(array('stdClass'=> array('sonata_admin_foo_service', 'sonata_admin_bar_service')));
+
+        $this->admin->expects($this->never())
+            ->method('getUrlsafeIdentifier');
+
+        $this->adminBar->expects($this->once())
+            ->method('getUrlsafeIdentifier')
+            ->with($this->equalTo($entity))
+            ->will($this->returnValue(1234567));
+
+        $this->assertEquals(1234567, $this->twigExtension->getUrlsafeIdentifier($entity, $this->adminBar));
+    }
 }

+ 9 - 5
Twig/Extension/SonataAdminExtension.php

@@ -12,6 +12,7 @@
 namespace Sonata\AdminBundle\Twig\Extension;
 
 use Doctrine\Common\Util\ClassUtils;
+use Sonata\AdminBundle\Admin\AdminInterface;
 use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
 use Sonata\AdminBundle\Exception\NoValueException;
 use Sonata\AdminBundle\Admin\Pool;
@@ -298,15 +299,18 @@ class SonataAdminExtension extends \Twig_Extension
     /**
      * Get the identifiers as a string that is save to use in an url.
      *
-     * @param object $model
+     * @param object         $model
+     * @param AdminInterface $admin
      *
      * @return string string representation of the id that is save to use in an url
      */
-    public function getUrlsafeIdentifier($model)
+    public function getUrlsafeIdentifier($model, AdminInterface $admin = null)
     {
-        $admin = $this->pool->getAdminByClass(
-            ClassUtils::getClass($model)
-        );
+        if (is_null($admin)) {
+            $admin = $this->pool->getAdminByClass(
+                ClassUtils::getClass($model)
+            );
+        }
 
         return $admin->getUrlsafeIdentifier($model);
     }