Browse Source

Fix #140 - Exception Semantical Error (list) and missing Method id (create)

Thomas Rabaix 14 years ago
parent
commit
02c4fe2871

+ 17 - 0
Admin/Admin.php

@@ -527,6 +527,7 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
                 'sortable' => false
             ));
 
+            $fieldDescription->setAdmin($this);
             $fieldDescription->setTemplate('SonataAdminBundle:CRUD:list__batch.html.twig');
             $this->listFieldDescriptions = array( '_batch' => $fieldDescription ) + $this->listFieldDescriptions;
         }
@@ -2060,4 +2061,20 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
     {
         return $this->securityHandler->isGranted($name, $this);
     }
+
+    public function getNormalizedIdentifier($entity)
+    {
+        return $this->getModelManager()->getNormalizedIdentifier($entity);
+    }
+
+    /**
+     * Shorthand method for templating
+     *
+     * @param object $entity
+     * @return
+     */
+    public function id($entity)
+    {
+        return $this->getNormalizedIdentifier($entity);
+    }
 }

+ 3 - 3
Builder/ORM/DatagridBuilder.php

@@ -136,8 +136,8 @@ class DatagridBuilder implements DatagridBuilderInterface
      */
     public function getChoices(FieldDescriptionInterface $fieldDescription)
     {
-        $targets = $fieldDescription->getAdmin()->getModelManager()
-            ->getEntityManager()
+        $modelManager = $fieldDescription->getAdmin()->getModelManager();
+        $targets = $modelManager->getEntityManager()
             ->createQueryBuilder()
             ->select('t')
             ->from($fieldDescription->getTargetEntity(), 't')
@@ -149,7 +149,7 @@ class DatagridBuilder implements DatagridBuilderInterface
             // todo : puts this into a configuration option and use reflection
             foreach (array('getTitle', 'getName', '__toString') as $getter) {
                 if (method_exists($target, $getter)) {
-                    $choices[$target->getId()] = $target->$getter();
+                    $choices[$modelManager->getNormalizedIdentifier($target)] = $target->$getter();
                     break;
                 }
             }

+ 11 - 3
Controller/CRUDController.php

@@ -199,7 +199,10 @@ class CRUDController extends Controller
                 $this->admin->update($object);
 
                 if ($this->isXmlHttpRequest()) {
-                   return $this->renderJson(array('result' => 'ok', 'objectId' => $object->getId()));
+                    return $this->renderJson(array(
+                        'result'    => 'ok',
+                        'objectId'  => $this->admin->getNormalizedIdentifier($object)
+                    ));
                 }
 
                 // redirect to edit mode
@@ -235,7 +238,9 @@ class CRUDController extends Controller
         }
 
         if (!$url) {
-            $url = $this->admin->generateUrl('edit', array('id' => $object->getId()));
+            $url = $this->admin->generateUrl('edit', array(
+                'id' => $this->admin->getNormalizedIdentifier($object),
+            ));
         }
 
         return new RedirectResponse($url);
@@ -294,7 +299,10 @@ class CRUDController extends Controller
                 $this->admin->create($object);
 
                 if ($this->isXmlHttpRequest()) {
-                   return $this->renderJson(array('result' => 'ok', 'objectId' => $object->getId()));
+                    return $this->renderJson(array(
+                        'result' => 'ok',
+                        'objectId' => $this->admin->getNormalizedIdentifier($object)
+                    ));
                 }
 
                 // redirect to edit mode

+ 13 - 0
Model/ORM/ModelManager.php

@@ -32,6 +32,7 @@ class ModelManager implements ModelManagerInterface
     {
         $this->entityManager = $entityManager;
     }
+
     /**
      * Returns the related model's metadata
      *
@@ -178,6 +179,18 @@ class ModelManager implements ModelManagerInterface
         return $this->getMetadata($class)->getIdentifierFieldNames();
     }
 
+    public function getNormalizedIdentifier($entity)
+    {
+        // the entities is not managed
+        if (!$this->getEntityManager()->getUnitOfWork()->isInIdentityMap($entity)) {
+            return null;
+        }
+
+        $values = $this->getIdentifierValues($entity);
+
+        return implode('-', $values);
+    }
+
     /**
      * Deletes a set of $class identified by the provided $idx array
      *

+ 6 - 6
Resources/views/CRUD/base_edit.html.twig

@@ -14,8 +14,8 @@ file that was distributed with this source code.
 {% block actions %}
     <div class="sonata-actions">
         <ul>
-            {% if admin.isGranted('VIEW')%}
-                <li class="sonata-action-element"><a href="{{ admin.generateUrl('view', {'id' : object.id}) }}">{% trans from 'SonataAdminBundle' %}link_action_view{% endtrans %}</a></li>
+            {% if admin.id(object) and admin.isGranted('VIEW')%}
+                <li class="sonata-action-element"><a href="{{ admin.generateUrl('view', {'id' : admin.id(object)}) }}">{% trans from 'SonataAdminBundle' %}link_action_view{% endtrans %}</a></li>
             {% endif %}
             {% if admin.isGranted('CREATE')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('create') }}">{% trans from 'SonataAdminBundle' %}link_action_create{% endtrans %}</a></li>
@@ -31,13 +31,13 @@ file that was distributed with this source code.
 
 {% block form %}
 
-    {% if object.id > 0 %}
+    {% if admin.id(object) > 0 %}
         {% set url = 'edit' %}
     {% else %}
         {% set url = 'create' %}
     {% endif %}
 
-    <form action="{{ admin.generateUrl(url, {'id': object.id, 'uniqid': admin.uniqid}) }}" {{ form_enctype(form) }} method="POST">
+    <form action="{{ admin.generateUrl(url, {'id': admin.id(object), 'uniqid': admin.uniqid}) }}" {{ form_enctype(form) }} method="POST">
 
         {% if form.vars.errors|length > 0 %}
             <div class="sonata-ba-form-error">
@@ -74,13 +74,13 @@ file that was distributed with this source code.
         {{ form_rest(form) }}
 
         {% if app.request.isxmlhttprequest %}
-            {% if object.id %}
+            {% if admin.id(object) %}
                 <input type="submit" name="btn_update" value="{% trans from 'SonataAdminBundle' %}btn_update{% endtrans %}"/>
             {% else %}
                 <input type="submit" name="btn_create" value="{% trans from 'SonataAdminBundle' %}btn_create{% endtrans %}"/>
             {% endif %}
         {% else %}
-            {% if object.id %}
+            {% if admin.id(object) %}
                 <input type="submit" name="btn_update_and_edit" value="{% trans from 'SonataAdminBundle' %}btn_update_and_edit_again{% endtrans %}"/>
                 <input type="submit" name="btn_update_and_list" value="{% trans from 'SonataAdminBundle' %}btn_update_and_return_to_list{% endtrans %}"/>
             {% else %}

+ 3 - 3
Resources/views/CRUD/base_list_field.html.twig

@@ -9,13 +9,13 @@ file that was distributed with this source code.
 
 #}
 
-<td class="sonata-ba-list-field sonata-ba-list-field-{{ field_description.type }}" objectId="{{ object.id }}">
+<td class="sonata-ba-list-field sonata-ba-list-field-{{ field_description.type }}" objectId="{{ admin.id(object) }}">
     {% if field_description.options.identifier is defined and admin.isGranted(['EDIT', 'VIEW']) %}
 
         {% if admin.isGranted('EDIT') %}
-            <a href="{{ admin.generateUrl('edit', {'id': object.id}) }}">
+            <a href="{{ admin.generateUrl('edit', {'id': admin.id(object)}) }}">
         {% else %}
-            <a href="{{ admin.generateUrl('view', {'id': object.id}) }}">
+            <a href="{{ admin.generateUrl('view', {'id': admin.id(object)}) }}">
         {% endif %}
 
             {% block field %}{{ value }}{% endblock %}

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

@@ -15,7 +15,7 @@ file that was distributed with this source code.
     <div class="sonata-actions">
         <ul>
             {% if admin.isGranted('EDIT')%}
-                <li class="sonata-action-element"><a href="{{ admin.generateUrl('edit', {'id' : object.id}) }}">{% trans from 'SonataAdminBundle' %}link_action_edit{% endtrans %}</a></li>
+                <li class="sonata-action-element"><a href="{{ admin.generateUrl('edit', {'id' : admin.id(object)}) }}">{% trans from 'SonataAdminBundle' %}link_action_edit{% endtrans %}</a></li>
             {% endif %}
 
             {% if admin.isGranted('CREATE')%}

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

@@ -222,7 +222,7 @@ This code manage the many-to-[one|many] association field popup
                         jQuery('#field_widget_{{ field_element.vars.id }}').closest('form').ajaxSubmit({
                             url: '{{ url('sonata_admin_retrieve_form_element', {
                                 'elementId': field_element.vars.id,
-                                'objectId':  admin.root.subject.id,
+                                'objectId':  admin.root.id(admin.root.subject),
                                 'uniqid':    admin.root.uniqid,
                                 'code':      admin.root.code
                             }) }}',

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

@@ -26,10 +26,10 @@ file that was distributed with this source code.
 
             {% if field_description.options.edit == 'list' %}
                 <span id="field_widget_{{ field_element.vars.id }}" >
-                    {% if value.id %}
+                    {% if admin.id(value) %}
                         {% render 'SonataAdminBundle:Helper:getShortObjectDescription' with {
                             'code': field_description.associationadmin.code,
-                            'objectId': value.id,
+                            'objectId': admin.id(value),
                             'uniqid':  field_description.associationadmin.uniqid
                         }%}
                     {% endif %}

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

@@ -25,10 +25,10 @@ file that was distributed with this source code.
 
             {% if field_description.options.edit == 'list' %}
                 <span id="field_widget_{{ field_element.vars.id }}" >
-                    {% if value.id %}
+                    {% if admin.id(value) %}
                         {% render 'SonataAdminBundle:Helper:getShortObjectDescription' with {
                             'code': field_description.associationadmin.code,
-                            'objectId': value.id,
+                            'objectId': admin.id(value),
                             'uniqid':  field_description.associationadmin.uniqid
                         }%}
                     {% endif %}

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

@@ -1,5 +1,5 @@
 {% if admin.isGranted('DELETE')%}
-    <a href="{{ admin.generateUrl('delete', {'id': object.id}) }}" class="delete_link" title="{% trans from 'SonataAdminBundle' %}action_delete{% endtrans %}">
+    <a href="{{ admin.generateUrl('delete', {'id': admin.id(object)}) }}" class="delete_link" title="{% trans from 'SonataAdminBundle' %}action_delete{% endtrans %}">
         <img src="{{ asset('bundles/sonataadmin/famfamfam/delete.png') }}" alt="{% trans from 'SonataAdminBundle' %}action_delete{% endtrans %}" />
     </a>
 {% endif %}

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

@@ -1,5 +1,5 @@
 {% if admin.isGranted('EDIT')%}
-    <a href="{{ admin.generateUrl('edit', {'id': object.id}) }}" class="edit_link" title="{% trans from 'SonataAdminBundle' %}action_edit{% endtrans %}">
+    <a href="{{ admin.generateUrl('edit', {'id': admin.id(object)}) }}" class="edit_link" title="{% trans from 'SonataAdminBundle' %}action_edit{% endtrans %}">
         <img src="{{ asset('bundles/sonataadmin/famfamfam/page_white_edit.png') }}" alt="{% trans from 'SonataAdminBundle' %}action_edit{% endtrans %}" />
     </a>
 {% endif %}

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

@@ -1,3 +1,3 @@
-<a href="{{ admin.generateUrl('view', {'id': object.id}) }}" class="view_link" title="{% trans from 'SonataAdminBundle' %}action_view{% endtrans %}">
+<a href="{{ admin.generateUrl('view', {'id': admin.id(object)}) }}" class="view_link" title="{% trans from 'SonataAdminBundle' %}action_view{% endtrans %}">
     <img src="{{ asset('bundles/sonataadmin/famfamfam/magnifier.png') }}" alt="{% trans from 'SonataAdminBundle' %}action_view{% endtrans %}" />
 </a>

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

@@ -10,5 +10,5 @@ file that was distributed with this source code.
 #}
 
 <td class="sonata-ba-list-field sonata-ba-list-field-batch">
-  <input type="checkbox" name="idx[]" value="{{ object.id }}" />
+  <input type="checkbox" name="idx[]" value="{{ admin.id(object) }}" />
 </td>

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

@@ -14,7 +14,7 @@ file that was distributed with this source code.
 {% block field%}
     {% if value %}
         {% if field_description.hasAssociationAdmin and field_description.associationadmin.isGranted('EDIT')%}
-            <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': value.id}) }}">{{ value }}</a>
+            <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': field_description.associationadmin.id(value)}) }}">{{ value }}</a>
         {% else %}
             {{ value }}
         {% endif %}

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

@@ -13,9 +13,9 @@ file that was distributed with this source code.
 
 {% block field%}
 
-    {% if value.id %}
+    {% if field_description.hasAssociationAdmin and field_description.associationadmin.id(value) %}
         {% if field_description.hasAssociationAdmin and field_description.associationadmin.isGranted('EDIT')%}
-            <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': value.id}) }}">{{ value }}</a>
+            <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': field_description.associationadmin.id(value)}) }}">{{ value }}</a>
         {% else %}
             {{ value }}
         {% endif %}