Bläddra i källkod

Define a new FieldDescription if _sort_by is not a displayed field.

Romain Geissler 13 år sedan
förälder
incheckning
9380f75522
3 ändrade filer med 40 tillägg och 8 borttagningar
  1. 18 1
      Admin/Admin.php
  2. 21 6
      Datagrid/Datagrid.php
  3. 1 1
      Resources/views/CRUD/base_list.html.twig

+ 18 - 1
Admin/Admin.php

@@ -691,8 +691,25 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
             return;
         }
 
+        $filterParameters = $this->getFilterParameters();
+
+        // transform _sort_by from a string to a FieldDescriptionInterface for the datagrid.
+        if (isset($filterParameters['_sort_by']) && is_string($filterParameters['_sort_by'])) {
+            if ($this->hasListFieldDescription($filterParameters['_sort_by'])) {
+                $filterParameters['_sort_by'] = $this->getListFieldDescription($filterParameters['_sort_by']);
+            } else {
+                $filterParameters['_sort_by'] = $this->getModelManager()->getNewFieldDescriptionInstance(
+                    $this->getClass(),
+                    $filterParameters['_sort_by'],
+                    array()
+                );
+
+                $this->getListBuilder()->buildField(null, $filterParameters['_sort_by'], $this);
+            }
+        }
+
         // initialize the datagrid
-        $this->datagrid = $this->getDatagridBuilder()->getBaseDatagrid($this, $this->getFilterParameters());
+        $this->datagrid = $this->getDatagridBuilder()->getBaseDatagrid($this, $filterParameters);
 
         $this->datagrid->getPager()->setMaxPerPage($this->maxPerPage);
         $this->datagrid->getPager()->setMaxPageLinks($this->maxPageLinks);

+ 21 - 6
Datagrid/Datagrid.php

@@ -15,8 +15,11 @@ use Sonata\AdminBundle\Datagrid\PagerInterface;
 use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
 use Sonata\AdminBundle\Filter\FilterInterface;
 use Sonata\AdminBundle\Admin\FieldDescriptionCollection;
+use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
 
 use Symfony\Component\Form\FormBuilder;
+use Symfony\Component\Form\Exception\UnexpectedTypeException;
+use Symfony\Component\Form\CallbackTransformer;
 
 class Datagrid implements DatagridInterface
 {
@@ -97,6 +100,18 @@ class Datagrid implements DatagridInterface
         }
 
         $this->formBuilder->add('_sort_by', 'hidden');
+        $this->formBuilder->get('_sort_by')->appendClientTransformer(new CallbackTransformer(
+            function($value) {
+                return $value;
+            },
+            function($value) {
+                if ($value instanceof FieldDescriptionInterface) {
+                    return $value->getName();
+                } else {
+                    return $value;
+                }
+            }
+        ));
         $this->formBuilder->add('_sort_order', 'hidden');
         $this->formBuilder->add('_page', 'hidden');
 
@@ -111,13 +126,13 @@ class Datagrid implements DatagridInterface
         }
 
         if (isset($this->values['_sort_by'])) {
-            foreach ($this->getColumns()->getElements() as $fieldDescription){
-                if ($fieldDescription->isSortable() && $fieldDescription->getName() == $this->values['_sort_by']) {
-                    $this->query->setSortBy($fieldDescription->getParentAssociationMappings(), $fieldDescription->getSortFieldMapping());
-                    $this->query->setSortOrder(isset($this->values['_sort_order']) ? $this->values['_sort_order'] : null);
+            if (!$this->values['_sort_by'] instanceof FieldDescriptionInterface) {
+                throw new UnexpectedTypeException($this->values['_sort_by'],'FieldDescriptionInterface');
+            }
 
-                    break;
-                }
+            if ($this->values['_sort_by']->isSortable()) {
+                $this->query->setSortBy($this->values['_sort_by']->getParentAssociationMappings(), $this->values['_sort_by']->getSortFieldMapping());
+                $this->query->setSortOrder(isset($this->values['_sort_order']) ? $this->values['_sort_order'] : null);
             }
         }
 

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

@@ -40,7 +40,7 @@ file that was distributed with this source code.
                                     {% set sortable = false %}
                                     {% if field_description.options.sortable is defined and field_description.options.sortable%}
                                         {% set sortable             = true %}
-                                        {% set current              = admin.datagrid.values._sort_by == field_description.name %}
+                                        {% set current              = admin.datagrid.values._sort_by == field_description %}
                                         {% set sort_parameters      = admin.modelmanager.sortparameters(field_description, admin.datagrid) %}
                                         {% set sort_active_class    = current ? 'sonata-ba-list-field-order-active' : '' %}
                                         {% set sort_by              = current ? admin.datagrid.values._sort_order : field_description.options._sort_order %}