Ver código fonte

Add list sub entities.

Romain Geissler 13 anos atrás
pai
commit
507217a3bf

+ 29 - 0
Admin/FieldDescription.php

@@ -67,6 +67,27 @@ class FieldDescription extends BaseFieldDescription
         $this->fieldName    = $this->fieldName ?: $fieldMapping['fieldName'];
     }
 
+    /**
+     * set the parent association mappings information
+     *
+     * @param array $parentAssociationMappings
+     * @return void
+     */
+    public function setParentAssociationMappings($parentAssociationMappings)
+    {
+        if (!is_array($parentAssociationMappings)) {
+            throw new \RuntimeException('The parent association mappings must be an array of association mappings');
+        }
+
+        foreach ($parentAssociationMappings as $parentAssociationMapping) {
+            if (!is_array($parentAssociationMapping)) {
+                throw new \RuntimeException('An association mapping must be an array');
+            }
+        }
+
+        $this->parentAssociationMappings=$parentAssociationMappings;
+    }
+
     /**
      * return true if the FieldDescription is linked to an identifier field
      *
@@ -76,4 +97,12 @@ class FieldDescription extends BaseFieldDescription
     {
         return isset($this->fieldMapping['id']) ? $this->fieldMapping['id'] : false;
     }
+
+    public function getValue($object){
+        foreach ($this->parentAssociationMappings as $parentAssociationMapping) {
+            $object = $this->getFieldValue($object, $parentAssociationMapping['fieldName']);
+        }
+
+        return $this->getFieldValue($object, $this->fieldName);
+    }
 }

+ 9 - 6
Builder/ListBuilder.php

@@ -94,19 +94,22 @@ class ListBuilder implements ListBuilderInterface
         $fieldDescription->setAdmin($admin);
 
         if ($admin->getModelManager()->hasMetadata($admin->getClass())) {
-            $metadata = $admin->getModelManager()->getMetadata($admin->getClass());
+            list($metadata, $lastPropertyName, $parentAssociationMappings) = $admin->getModelManager()->getParentMetadataForProperty($admin->getClass(), $fieldDescription->getName());
+            $fieldDescription->setParentAssociationMappings($parentAssociationMappings);
 
             // set the default field mapping
-            if (isset($metadata->fieldMappings[$fieldDescription->getName()])) {
-                $fieldDescription->setFieldMapping($metadata->fieldMappings[$fieldDescription->getName()]);
+            if (isset($metadata->fieldMappings[$lastPropertyName])) {
+                $fieldDescription->setFieldMapping($metadata->fieldMappings[$lastPropertyName]);
                 if ($fieldDescription->getOption('sortable') !== false) {
-                    $fieldDescription->setOption('sortable', $fieldDescription->getOption('sortable', $fieldDescription->getName()));
+                    $fieldDescription->setOption('sortable', $fieldDescription->getOption('sortable', true));
+                    $fieldDescription->setOption('sort_parent_association_mappings', $fieldDescription->getOption('sort_parent_association_mappings', $fieldDescription->getParentAssociationMappings()));
+                    $fieldDescription->setOption('sort_field_mapping', $fieldDescription->getOption('sort_field_mapping', $fieldDescription->getFieldMapping()));
                 }
             }
 
             // set the default association mapping
-            if (isset($metadata->associationMappings[$fieldDescription->getName()])) {
-                $fieldDescription->setAssociationMapping($metadata->associationMappings[$fieldDescription->getName()]);
+            if (isset($metadata->associationMappings[$lastPropertyName])) {
+                $fieldDescription->setAssociationMapping($metadata->associationMappings[$lastPropertyName]);
             }
 
             $fieldDescription->setOption('_sort_order', $fieldDescription->getOption('_sort_order', 'ASC'));

+ 4 - 2
Datagrid/ProxyQuery.php

@@ -88,6 +88,7 @@ class ProxyQuery implements ProxyQueryInterface
             if (strpos($sortBy, '.') === false) { // add the current alias
                 $sortBy = $queryBuilderId->getRootAlias().'.'.$sortBy;
             }
+            $sortBy .= ' AS __order_by';
             $queryBuilderId->addSelect($sortBy);
         }
 
@@ -113,9 +114,10 @@ class ProxyQuery implements ProxyQueryInterface
         return call_user_func_array(array($this->queryBuilder, $name), $args);
     }
 
-    public function setSortBy($sortBy)
+    public function setSortBy($parentAssociationMappings, $fieldMapping)
     {
-        $this->sortBy = $sortBy;
+        $alias = $this->entityJoin($parentAssociationMappings);
+        $this->sortBy = $alias.'.'.$fieldMapping['fieldName'];
     }
 
     public function getSortBy()

+ 3 - 2
Model/ModelManager.php

@@ -114,6 +114,7 @@ class ModelManager implements ModelManagerInterface
         $fieldDescription = new FieldDescription;
         $fieldDescription->setName($name);
         $fieldDescription->setOptions($options);
+        $fieldDescription->setParentAssociationMappings($parentAssociationMappings);
 
         if (isset($metadata->associationMappings[$propertyName])) {
             $fieldDescription->setAssociationMapping($metadata->associationMappings[$propertyName]);
@@ -418,7 +419,7 @@ class ModelManager implements ModelManagerInterface
     {
         $values = $datagrid->getValues();
 
-        if ($fieldDescription->getOption('sortable') == $values['_sort_by']) {
+        if ($fieldDescription->getName() == $values['_sort_by']) {
             if ($values['_sort_order'] == 'ASC') {
                 $values['_sort_order'] = 'DESC';
             } else {
@@ -426,7 +427,7 @@ class ModelManager implements ModelManagerInterface
             }
         } else {
             $values['_sort_order']  = 'ASC';
-            $values['_sort_by']     = $fieldDescription->getOption('sortable');
+            $values['_sort_by']     = $fieldDescription->getName();
         }
 
         return array('filter' => $values);