Parcourir la source

Added a functionality to edit boolean properties in list view with Ajax.
It is used with new type 'boolean_edit':
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('published', 'boolean_edit')
;
}

Tomasz Ignatiuk il y a 13 ans
Parent
commit
2f4d728983

+ 41 - 0
Controller/HelperController.php

@@ -14,6 +14,7 @@ namespace Sonata\AdminBundle\Controller;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Form\Util\PropertyPath;
 
 class HelperController extends Controller
 {
@@ -145,4 +146,44 @@ class HelperController extends Controller
 
         return new Response($description);
     }
+    
+    /**
+     * Toggle boolean value of property in list
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function setBooleanListFieldValueAction()
+    {
+        $field      = $this->get('request')->query->get('field');
+        $code       = $this->get('request')->query->get('code');
+        $objectId   = $this->get('request')->query->get('objectId');
+        $uniqid     = $this->get('request')->query->get('uniqid');
+        $value      = $this->get('request')->query->get('value');
+
+        $admin  = $this->container->get('sonata.admin.pool')->getInstance($code);
+        if ($uniqid) {
+            $admin->setUniqid($uniqid);
+        }
+
+        $object = $admin->getObject($objectId);
+
+        if (!$object) {
+            $response = new Response(json_encode(array('status' => 'Error')));
+            return $response;
+        }
+        
+        $propertyPath = new PropertyPath($field);
+        $propertyPath->setValue($object, $value);
+        $admin->update($object);
+
+        // render the widget
+        // todo : fix this, the twig environment variable is not set inside the extension ...
+        $twig = $this->get('twig');
+        $extension = $twig->getExtension('sonata_admin');
+        $extension->initRuntime($this->get('twig'));
+        
+        $html = strip_tags($extension->renderListElement($object, $admin->getListFieldDescription($field)), '<a><img>');
+
+        $response = new Response(json_encode(array('status' => 'OK', 'html' => $html)));
+        return $response;
+    }
 }

+ 1 - 0
DependencyInjection/Configuration.php

@@ -89,6 +89,7 @@ class Configuration implements ConfigurationInterface
                         ->scalarNode('list')->defaultValue('SonataAdminBundle:CRUD:list.html.twig')->cannotBeEmpty()->end()
                         ->scalarNode('show')->defaultValue('SonataAdminBundle:CRUD:show.html.twig')->cannotBeEmpty()->end()
                         ->scalarNode('edit')->defaultValue('SonataAdminBundle:CRUD:edit.html.twig')->cannotBeEmpty()->end()
+                        ->scalarNode('boolean_edit')->defaultValue('SonataAdminBundle:CRUD:list_boolean_edit.html.twig')->cannotBeEmpty()->end()
                     ->end()
                 ->end()
             ->end()

+ 5 - 0
Resources/config/routing/sonata_admin.xml

@@ -19,4 +19,9 @@
     <route id="sonata_admin_short_object_information" pattern="/core/get-short-object-description">
         <default key="_controller">SonataAdminBundle:Helper:getShortObjectDescription</default>
     </route>
+
+    <route id="sonata_admin_set_boolean_list_field_value" pattern="/core/set-boolean-list-field-value">
+        <default key="_controller">SonataAdminBundle:Helper:setBooleanListFieldValue</default>
+    </route>
+      
 </routes>

+ 36 - 1
Resources/public/base.js

@@ -113,4 +113,39 @@ var Admin = {
            jQuery('div.filter_container', jQuery(event.target).parent()).toggle();
         });
     }
-}
+}
+
+/**
+ * toggle list boolean property state (value))
+ * @param MouseEvent
+ */
+function sonata_admin_set_boolean_list_field_value(event)
+{
+    var targetElement = Admin.stopEvent(event);
+    var a = jQuery(targetElement).closest('a');
+
+    var linkId = a.attr('id');
+    var aParams = linkId.split("-");
+
+
+    jQuery.ajax({
+        url: a.attr('href'),
+        type: 'GET',
+        data: "field=" + aParams[0] + "&objectId=" + aParams[1] + "&value=" + aParams[2] + "&code=" + aParams[3] + "&uniqid=" + aParams[4],
+        success: function(json) {
+            var jObj = jQuery.parseJSON(json);
+
+            Admin.log('['+aParams[1]+']|set_boolean_list_field_value] setting new boolean value: ' + aParams[2] + ' of field: ' + aParams[0] + ' for object with id: ' + aParams[1]);
+  
+            if(jObj.status === "OK")
+            {
+                var td = jQuery(a).parent();
+                td.children().remove();
+                td.html(jObj.html);
+                td.effect("highlight", {'color' : '#57A957'}, 2000);
+            }
+            else
+                jQuery(a).parent().effect("highlight", {'color' : '#C43C35'}, 2000);
+        }
+    });
+};

+ 45 - 0
Resources/views/CRUD/list_boolean_edit.html.twig

@@ -0,0 +1,45 @@
+{#
+
+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.
+
+#}
+
+{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
+
+{% block field %}
+{% spaceless %}
+{% if admin.isGranted('EDIT') %}
+    {% if value %}
+        <a
+            href="{{ url('sonata_admin_set_boolean_list_field_value') }}" class="sonata-ba-action"
+            onclick="sonata_admin_set_boolean_list_field_value(event)" id="{{ field_description.name }}-{{ object.id }}-0-{{ admin.code(object) }}-{{ admin.uniqid(object) }}"
+            >
+            <img 
+                src="{{ asset('bundles/sonataadmin/famfamfam/accept.png') }}" 
+                alt="{%- trans from 'SonataAdminBundle' %}label_type_yes{% endtrans -%}" 
+                />
+        </a>
+    {% else %}
+        <a
+            href="{{ url('sonata_admin_set_boolean_list_field_value') }}"
+            onclick="sonata_admin_set_boolean_list_field_value(event)" id="{{ field_description.name }}-{{ object.id }}-1-{{ admin.code(object) }}-{{ admin.uniqid(object) }}"
+            >
+            <img 
+                src="{{ asset('bundles/sonataadmin/famfamfam/exclamation.png') }}" 
+                alt="{%- trans from 'SonataAdminBundle' %}label_type_no{% endtrans -%}" />
+        </a>
+    {% endif %}
+{% else %}
+    {% if value %}
+        <img src="{{ asset('bundles/sonataadmin/famfamfam/accept.png') }}" alt="{%- trans from 'SonataAdminBundle' %}label_type_yes{% endtrans -%}" />
+    {% else %}
+        <img src="{{ asset('bundles/sonataadmin/famfamfam/exclamation.png') }}" alt="{%- trans from 'SonataAdminBundle' %}label_type_no{% endtrans -%}" />
+    {% endif %}  
+{% endif %}
+{% endspaceless %}
+{% endblock %}