Browse Source

Add check for route existance, add unit test

Thomas Rabaix 14 years ago
parent
commit
807e164dbe

+ 7 - 0
Admin/Admin.php

@@ -808,6 +808,13 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
         return $this->routes->get($name);
     }
 
+    public function hasRoute($name)
+    {
+        $this->buildRoutes();
+
+        return $this->routes->has($name);
+    }
+
     /**
      * generate the url with the given $name
      *

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

@@ -14,10 +14,10 @@ file that was distributed with this source code.
 {% block actions %}
     <div class="sonata-actions">
         <ul>
-            {% if admin.isGranted('CREATE')%}
+            {% if admin.hasRoute('create') and admin.isGranted('CREATE')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('create') }}">{% trans from 'SonataAdminBundle' %}link_action_create{% endtrans %}</a></li>
             {% endif %}
-            {% if admin.isGranted('LIST')%}
+            {% if admin.hasRoute('list') and  admin.isGranted('LIST')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('list') }}">{% trans from 'SonataAdminBundle' %}link_action_list{% endtrans %}</a></li>
             {% endif %}
         </ul>

+ 52 - 46
Resources/views/CRUD/base_edit.html.twig

@@ -14,13 +14,13 @@ file that was distributed with this source code.
 {% block actions %}
     <div class="sonata-actions">
         <ul>
-            {% if admin.id(object) and admin.isGranted('VIEW') and admin.show|length > 0 %}
+            {% if admin.hasroute('show') and admin.id(object) and admin.isGranted('VIEW') and admin.show|length > 0 %}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('show', {'id' : admin.id(object)}) }}">{% trans from 'SonataAdminBundle' %}link_action_show{% endtrans %}</a></li>
             {% endif %}
-            {% if admin.isGranted('CREATE')%}
+            {% if admin.hasroute('create') and admin.isGranted('CREATE')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('create') }}">{% trans from 'SonataAdminBundle' %}link_action_create{% endtrans %}</a></li>
             {% endif %}
-            {% if admin.isGranted('LIST')%}
+            {% if admin.hasroute('list') and admin.isGranted('LIST')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('list') }}">{% trans from 'SonataAdminBundle' %}link_action_list{% endtrans %}</a></li>
             {% endif %}
         </ul>
@@ -37,55 +37,61 @@ file that was distributed with this source code.
         {% set url = 'create' %}
     {% endif %}
 
-    <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">
-                {{ form_errors(form) }}
-            </div>
-        {% endif %}
-
-        {% for name, form_group in admin.formgroups %}
-            {% if name %}
-                <fieldset>
-                    <legend>
-                        {{ name|trans({}, admin.translationdomain) }}
-                        {% if form_group.collapsed %}
-                            <a href="" class="sonata-ba-collapsed">{% trans from 'SonataAdminBundle' %}link_expand{% endtrans %}</a>
-                        {% endif %}
-                    </legend>
-
-                    <div class="sonata-ba-collapsed-fields">
+    {% if not admin.hasRoute(url)%}
+        <div>
+            {{ "form_not_available"|trans({}, "SonataAdminBundle") }}
+        </div>
+    {% else %}
+        <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">
+                    {{ form_errors(form) }}
+                </div>
             {% endif %}
 
-            {% for field_name in form_group.fields %}
-                {% if admin.formfielddescriptions[field_name] is defined %}
-                    {{ form_row(form[field_name])}}
+            {% for name, form_group in admin.formgroups %}
+                {% if name %}
+                    <fieldset>
+                        <legend>
+                            {{ name|trans({}, admin.translationdomain) }}
+                            {% if form_group.collapsed %}
+                                <a href="" class="sonata-ba-collapsed">{% trans from 'SonataAdminBundle' %}link_expand{% endtrans %}</a>
+                            {% endif %}
+                        </legend>
+
+                        <div class="sonata-ba-collapsed-fields">
                 {% endif %}
-            {% endfor %}
 
-            {% if name %}
-                    </div>
-                </fieldset>
-            {% endif %}
-        {% endfor %}
+                {% for field_name in form_group.fields %}
+                    {% if admin.formfielddescriptions[field_name] is defined %}
+                        {{ form_row(form[field_name])}}
+                    {% endif %}
+                {% endfor %}
 
-        {{ form_rest(form) }}
+                {% if name %}
+                        </div>
+                    </fieldset>
+                {% endif %}
+            {% endfor %}
 
-        {% if app.request.isxmlhttprequest %}
-            {% 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 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 %}"/>
+            {{ form_rest(form) }}
+
+            {% if app.request.isxmlhttprequest %}
+                {% 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 %}
-                <input type="submit" name="btn_create_and_edit" value="{% trans from 'SonataAdminBundle' %}btn_create_and_edit_again{% endtrans %}"/>
-                <input type="submit" name="btn_create_and_create" value="{% trans from 'SonataAdminBundle' %}btn_create_and_create_a_new_one{% endtrans %}"/>
+                {% 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 %}
+                    <input type="submit" name="btn_create_and_edit" value="{% trans from 'SonataAdminBundle' %}btn_create_and_edit_again{% endtrans %}"/>
+                    <input type="submit" name="btn_create_and_create" value="{% trans from 'SonataAdminBundle' %}btn_create_and_create_a_new_one{% endtrans %}"/>
+                {% endif %}
             {% endif %}
-        {% endif %}
-    </form>
+        </form>
+    {% endif%}
 {% endblock %}

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

@@ -14,7 +14,7 @@ file that was distributed with this source code.
 {% block actions %}
     <div class="sonata-actions">
         <ul>
-            {% if admin.isGranted('CREATE')%}
+            {% if admin.hasRoute('create') and admin.isGranted('CREATE')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('create') }}">{% trans from 'SonataAdminBundle' %}link_action_create{% endtrans %}</a></li>
             {% endif %}
         </ul>

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

@@ -12,9 +12,9 @@ file that was distributed with this source code.
 <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', 'SHOW']) %}
 
-        {% if admin.isGranted('EDIT') %}
+        {% if admin.hasroute('edit') and admin.isGranted('EDIT') %}
             <a href="{{ admin.generateUrl('edit', {'id': admin.id(object)}) }}">
-        {% else %}
+        {% elseif admin.hasroute('show') %}
             <a href="{{ admin.generateUrl('show', {'id': admin.id(object)}) }}">
         {% endif %}
 

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

@@ -14,11 +14,11 @@ file that was distributed with this source code.
 {% block actions %}
     <div class="sonata-actions">
         <ul>
-            {% if admin.isGranted('EDIT')%}
+            {% if admin.hasRoute('edit') and admin.isGranted('EDIT')%}
                 <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')%}
+            {% if admin.hasRoute('create') and admin.isGranted('CREATE')%}
                 <li class="sonata-action-element"><a href="{{ admin.generateUrl('create') }}">{% trans from 'SonataAdminBundle' %}link_action_create{% endtrans %}</a></li>
             {% endif %}
         </ul>

+ 12 - 11
Resources/views/CRUD/edit_orm_many_to_many.html.twig

@@ -16,17 +16,18 @@ file that was distributed with this source code.
         </span>
 
         <span id="field_actions_{{ id }}" >
-            <a
-                href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
-                onclick="start_field_dialog_form_add_{{ id }}(event)"
-                class="sonata-ba-action"
-                style="{% if not sonata_admin.field_description.associationadmin.isGranted('CREATE')%}display:none{% endif %}"
-                >
-                    <img
-                        src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
-                        alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
-                    />
-            </a>
+            {% sonata_admin.field_description.associationadmin.hasRoute('create') and sonata_admin.field_description.associationadmin.isGranted('CREATE') %}
+                <a
+                    href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
+                    onclick="start_field_dialog_form_add_{{ id }}(event)"
+                    class="sonata-ba-action"
+                    >
+                        <img
+                            src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
+                            alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
+                        />
+                </a>
+            {% endif %}
         </span>
 
         <div style="display: none" id="field_dialog_{{ id }}">

+ 9 - 11
Resources/views/CRUD/edit_orm_many_to_one.html.twig

@@ -41,11 +41,10 @@ file that was distributed with this source code.
 
         <span id="field_actions_{{ id }}" >
 
-            {% if sonata_admin.edit == 'list' %}
+            {% if sonata_admin.edit == 'list' and sonata_admin.field_description.associationadmin.hasRoute('list') and sonata_admin.field_description.associationadmin.isGranted('LIST') %}
                 <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('list') }}"
                     onclick="start_field_dialog_form_list_{{ id }}(event)"
                     class="sonata-ba-action"
-                    style="{% if not sonata_admin.field_description.associationadmin.isGranted('LIST')%}display:none{% endif %}"
                     >
                     <img src="{{ asset('bundles/sonataadmin/famfamfam/application_view_list.png') }}"
                          alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
@@ -53,15 +52,14 @@ file that was distributed with this source code.
                 </a>
             {% endif %}
 
-            <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
-                onclick="start_field_dialog_form_add_{{ id }}(event)"
-                class="sonata-ba-action"
-                style="{% if not sonata_admin.field_description.associationadmin.isGranted('CREATE')%}display:none{% endif %}"
-                >
-                    <img src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
-                        alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
-                    />
-            </a>
+            {% if sonata_admin.field_description.associationadmin.hasRoute('create') and sonata_admin.field_description.associationadmin.isGranted('CREATE') %}
+                <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
+                    onclick="start_field_dialog_form_add_{{ id }}(event)"
+                    class="sonata-ba-action"
+                    >
+                        <img src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}" alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}" />
+                </a>
+            {% endif %}
         </span>
 
         <div class="container sonata-ba-modal sonata-ba-modal-edit-one-to-one" style="display: none" id="field_dialog_{{ id }}">

+ 27 - 24
Resources/views/CRUD/edit_orm_one_to_many.html.twig

@@ -60,19 +60,21 @@ file that was distributed with this source code.
         </span>
 
         {% if sonata_admin.edit == 'inline' %}
-            <span id="field_actions_{{ id }}" >
-                <a
-                    href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
-                    onclick="start_field_retrieve_{{ id }}(event)"
-                    class="sonata-ba-action"
-                    style="{% if not sonata_admin.field_description.associationadmin.isGranted('CREATE')%}display:none{% endif %}"
-                    >
-                    <img
-                        src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
-                        alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
-                     />
-                </a>
-            </span>
+
+            {% if sonata_admin.field_description.associationadmin.hasroute('create') and sonata_admin.field_description.associationadmin.isGranted('CREATE') %}
+                <span id="field_actions_{{ id }}" >
+                    <a
+                        href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
+                        onclick="start_field_retrieve_{{ id }}(event)"
+                        class="sonata-ba-action"
+                        >
+                        <img
+                            src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
+                            alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
+                         />
+                    </a>
+                </span>
+            {% endif %}
 
             {# add code for the sortable options #}
             {% if sonata_admin.field_description.options.sortable is defined %}
@@ -114,17 +116,18 @@ file that was distributed with this source code.
 
         {% else %}
             <span id="field_actions_{{ id }}" >
-                <a
-                    href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
-                    onclick="start_field_dialog_form_add_{{ id }}(event)"
-                    class="sonata-ba-action"
-                    style="{% if not sonata_admin.field_description.associationadmin.isGranted('CREATE')%}display:none{% endif %}"
-                    >
-                    <img
-                        src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
-                        alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
-                     />
-                </a>
+                {% if sonata_admin.field_description.associationadmin.hasroute('create') and sonata_admin.field_description.associationadmin.isGranted('CREATE') %}
+                    <a
+                        href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
+                        onclick="start_field_dialog_form_add_{{ id }}(event)"
+                        class="sonata-ba-action"
+                        >
+                        <img
+                            src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
+                            alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
+                         />
+                    </a>
+                {% endif %}
             </span>
 
             <div style="display: none" id="field_dialog_{{ id }}">

+ 13 - 12
Resources/views/CRUD/edit_orm_one_to_one.html.twig

@@ -39,11 +39,11 @@ file that was distributed with this source code.
         {% endif %}
         <span id="field_actions_{{ id }}" >
 
-            {% if sonata_admin.edit == 'list' %}
+            {% if sonata_admin.edit == 'list' and sonata_admin.field_description.associationadmin.hasroute('list') and sonata_admin.field_description.associationadmin.isGranted('LIST') %}
+
                 <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('list') }}"
                     onclick="start_field_dialog_form_list_{{ id }}(event)"
                     class="sonata-ba-action"
-                    style="{% if not sonata_admin.field_description.associationadmin.isGranted('LIST') %}display:none{% endif %}"
                     >
                         <img
                             src="{{ asset('bundles/sonataadmin/famfamfam/application_view_list.png') }}"
@@ -52,16 +52,17 @@ file that was distributed with this source code.
                 </a>
             {% endif %}
 
-            <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
-                onclick="start_field_dialog_form_add_{{ id }}(event)"
-                class="sonata-ba-action"
-                style="{% if not sonata_admin.field_description.associationadmin.isGranted('CREATE')%}display:none{% endif %}"
-                >
-                    <img
-                        src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
-                        alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
-                    />
-            </a>
+            {% if sonata_admin.field_description.associationadmin.hasroute('create') and sonata_admin.field_description.associationadmin.isGranted('CREATE') %}
+                <a  href="{{ sonata_admin.field_description.associationadmin.generateUrl('create') }}"
+                    onclick="start_field_dialog_form_add_{{ id }}(event)"
+                    class="sonata-ba-action"
+                    >
+                        <img
+                            src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}"
+                            alt="{% trans from 'SonataAdminBundle' %}btn_add{% endtrans %}"
+                        />
+                </a>
+            {% endif %}
         </span>
 
         <div class="container sonata-ba-modal sonata-ba-modal-edit-one-to-one" style="display: none" id="field_dialog_{{ id }}">

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

@@ -1,4 +1,4 @@
-{% if admin.isGranted('DELETE')%}
+{% if admin.isGranted('DELETE') and admin.hasRoute('delete') %}
     <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>

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

@@ -1,4 +1,4 @@
-{% if admin.isGranted('EDIT')%}
+{% if admin.isGranted('EDIT') and admin.hasRoute('edit') %}
     <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>

+ 5 - 3
Resources/views/CRUD/list__action_view.html.twig

@@ -1,3 +1,5 @@
-<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>
+{% if admin.hasRoute('show') %}
+    <a href="{{ admin.generateUrl('show', {'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>
+{% endif %}

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

@@ -12,7 +12,7 @@ file that was distributed with this source code.
 {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
 
 {% block field%}
-    {% if field_description.hasassociationadmin%}
+    {% if field_description.hasassociationadmin and field_description.associationadmin.hasRoute('edit') and field_description.associationadmin.isGranted('edit')%}
         {% for element in value%}
             <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': field_description.associationadmin.id(element)}) }}">{{ element|render_relation_element(field_description) }}</a>
         {% endfor %}

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

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

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

@@ -12,7 +12,7 @@ file that was distributed with this source code.
 {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
 
 {% block field%}
-    {% if field_description.hasassociationadmin%}
+    {% if field_description.hasassociationadmin and field_description.associationadmin.isGranted('EDIT') and field_description.associationadmin.hasRoute('edit') %}
         {% for element in value%}
             <a href="{{ field_description.associationadmin.generateUrl('edit', {'id': field_description.associationadmin.id(element)}) }}">{{ element|render_relation_element(field_description) }}</a>
         {% endfor %}

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

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

+ 2 - 2
Resources/views/Core/dashboard.html.twig

@@ -28,12 +28,12 @@ file that was distributed with this source code.
                     <tr>
                         <td class="sonata-ba-list-label">{{ admin.label|trans({}, admin.translationdomain) }}</td>
                         <td>
-                            {% if admin.isGranted('CREATE') %}
+                            {% if admin.hasroute('create') and admin.isGranted('CREATE') %}
                                 <a href="{{ admin.generateUrl('create')}}"><img src="{{ asset('bundles/sonataadmin/famfamfam/add.png') }}" /> {% trans from 'SonataAdminBundle' %}link_add{% endtrans %}</a>
                             {% endif %}
                         </td>
                         <td>
-                            {% if admin.isGranted('LIST') %}
+                            {% if admin.hasroute('list') and admin.isGranted('LIST') %}
                                 <a href="{{ admin.generateUrl('list')}}"><img src="{{ asset('bundles/sonataadmin/famfamfam/application_view_list.png') }}" />{% trans from 'SonataAdminBundle' %}link_list{% endtrans %}</a>
                             {% endif %}
                         </td>

+ 62 - 13
Route/RouteCollection.php

@@ -14,7 +14,6 @@ use Symfony\Component\Routing\Route;
 
 class RouteCollection
 {
-
     protected $elements = array();
 
     protected $baseCodeRoute;
@@ -28,6 +27,7 @@ class RouteCollection
     /**
      * @param string $baseCodeRoute
      * @param string $baseRouteName
+     * @param string $baseRoutePattern
      * @param string $baseControllerName
      */
     public function __construct($baseCodeRoute, $baseRouteName, $baseRoutePattern, $baseControllerName)
@@ -49,8 +49,8 @@ class RouteCollection
     public function add($name, $pattern = null, array $defaults = array(), array $requirements = array(), array $options = array())
     {
         $pattern    = sprintf('%s/%s', $this->baseRoutePattern, $pattern ?: $name);
-        $code       = sprintf('%s.%s', $this->baseCodeRoute, $name);
-        $name       = sprintf('%s_%s', $this->baseRouteName, $name);
+        $code       = $this->getCode($name);
+        $routeName  = sprintf('%s_%s', $this->baseRouteName, $name);
 
         if (!isset($defaults['_controller'])) {
             $defaults['_controller'] = sprintf('%s:%s', $this->baseControllerName, $this->actionify($code));
@@ -60,18 +60,26 @@ class RouteCollection
             $defaults['_sonata_admin'] = $this->baseCodeRoute;
         }
 
-        $defaults['_sonata_name'] = $name;
+        $defaults['_sonata_name'] = $routeName;
+
+        $this->elements[$this->getCode($name)] = new Route($pattern, $defaults, $requirements, $options);
+    }
 
-        $this->elements[$code] = new Route($pattern, $defaults, $requirements, $options);;
+    public function getCode($name)
+    {
+        if (strrpos($name, '.') !== false) {
+            return $name;
+        }
+        return sprintf('%s.%s', $this->baseCodeRoute, $name);
     }
 
     /**
-     * @param RouteCollection
+     * @param RouteCollection $collection
      */
     public function addCollection(RouteCollection $collection)
     {
-        foreach ($collection->getElements() as $name => $route) {
-            $this->elements[$name] = $route;
+        foreach ($collection->getElements() as $code => $route) {
+            $this->elements[$code] = $route;
         }
     }
 
@@ -89,7 +97,7 @@ class RouteCollection
      */
     public function has($name)
     {
-        return array_key_exists($name, $this->elements);
+        return array_key_exists($this->getCode($name), $this->elements);
     }
 
     /**
@@ -99,25 +107,66 @@ class RouteCollection
     public function get($name)
     {
         if ($this->has($name)) {
-            return $this->elements[$name];
+            return $this->elements[$this->getCode($name)];
         }
 
         throw new \InvalidArgumentException(sprintf('Element "%s" does not exist.', $name));
     }
 
+    /**
+     * @param $name
+     * @return void
+     */
+    public function remove($name)
+    {
+        unset($this->elements[$this->getCode($name)]);
+    }
+
     /**
      * Convert a word in to the format for a symfony action action_name => actionName
      *
-     * @param string  $word Word to actionify
-     * @return string $word Actionified word
+     * @param string $action Word to actionify
+     * @return string Actionified word
      */
     public function actionify($action)
     {
         if (($pos = strrpos($action, '.')) !== false) {
 
-          $action = substr($action, $pos + 1);
+            $action = substr($action, $pos + 1);
         }
 
         return lcfirst(str_replace(' ', '', ucwords(strtr($action, '_-', '  '))));
     }
+
+    /**
+     * @return string
+     */
+    public function getBaseCodeRoute()
+    {
+        return $this->baseCodeRoute;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBaseControllerName()
+    {
+        return $this->baseControllerName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBaseRouteName()
+    {
+        return $this->baseRouteName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBaseRoutePattern()
+    {
+        return $this->baseRoutePattern;
+    }
 }

+ 17 - 1
Tests/Admin/AdminTest.php

@@ -12,6 +12,7 @@
 namespace Sonata\AdminBundle\Tests\Admin;
 
 use Sonata\AdminBundle\Admin\Admin;
+use Sonata\AdminBundle\Route\RouteCollection;
 
 class PostAdmin extends Admin
 {
@@ -43,6 +44,11 @@ class CommentAdmin extends Admin
     {
         $this->classnameLabel = $label;
     }
+
+    public function configureRoutes(RouteCollection $collection)
+    {
+        $collection->remove('edit');
+    }
 }
 
 class AdminTest extends \PHPUnit_Framework_TestCase
@@ -153,10 +159,20 @@ class AdminTest extends \PHPUnit_Framework_TestCase
     public function testGetBaseRouteNameWithChildAdmin()
     {
         $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
+        $postAdmin->configure();
         $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
-        $commentAdmin->setParent($postAdmin);
+        $commentAdmin->configure();
+        $postAdmin->addChild($commentAdmin);
+
 
         $this->assertEquals('admin_sonata_news_post_comment', $commentAdmin->getBaseRouteName());
+
+        $this->assertTrue($postAdmin->hasRoute('show'));
+        $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post.show'));
+        $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.show'));
+
+        $this->assertFalse($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.edit'));
+        $this->assertFalse($commentAdmin->hasRoute('edit'));
     }
 
     /**

+ 91 - 0
Tests/Route/RouteCollectionTest.php

@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * 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.
+ */
+
+namespace Sonata\AdminBundle\Tests\Route;
+
+use Sonata\AdminBundle\Route\RouteCollection;
+
+class RouteCollectionTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetter()
+    {
+        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+
+        $this->assertEquals('base.Code.Route', $routeCollection->getBaseCodeRoute());
+        $this->assertEquals('baseRouteName', $routeCollection->getBaseRouteName());
+        $this->assertEquals('baseRoutePattern', $routeCollection->getBaseRoutePattern());
+        $this->assertEquals('baseControllerName', $routeCollection->getBaseControllerName());
+    }
+
+    public function testActionify()
+    {
+        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+
+        $this->assertEquals('fooBar', $routeCollection->actionify('Foo bar'));
+        $this->assertEquals('bar', $routeCollection->actionify('Foo.bar'));
+    }
+
+    public function testCode()
+    {
+        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+
+        $this->assertEquals('base.Code.Route.test', $routeCollection->getCode('test'));
+        $this->assertEquals('base.Code.Route.test', $routeCollection->getCode('base.Code.Route.test'));
+    }
+
+    public function testCollection()
+    {
+        $routeCollection = new RouteCollection('base.Code.Route', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+
+        $routeCollection->add('view');
+        $this->assertTrue($routeCollection->has('view'));
+
+        $routeCollection->remove('view');
+        $this->assertFalse($routeCollection->has('view'));
+
+        $routeCollection->add('create');
+        $route = $routeCollection->get('create');
+
+        $this->assertInstanceOf('Symfony\Component\Routing\Route', $route);
+    }
+
+    public function testChildCollection()
+    {
+        $childCollection = new RouteCollection('baseCodeRouteChild', 'baseRouteNameChild', 'baseRoutePatternChild', 'baseControllerNameChild');
+        $childCollection->add('view');
+        $childCollection->add('create');
+
+        $parentCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+        $parentCollection->add('view');
+        $parentCollection->add('edit');
+
+        $parentCollection->addCollection($childCollection);
+
+        $this->assertTrue($parentCollection->has('view'));
+        $this->assertTrue($parentCollection->has('edit'));
+        $this->assertFalse($parentCollection->has('create'));
+
+        $this->assertFalse($parentCollection->has('baseCodeRouteChild.edit'));
+    }
+
+    public function testRoute()
+    {
+        $routeCollection = new RouteCollection('baseCodeRoute', 'baseRouteName', 'baseRoutePattern', 'baseControllerName');
+
+        $routeCollection->add('view');
+
+        $route = $routeCollection->get('view');
+
+        $this->assertEquals('baseControllerName:view', $route->getDefault('_controller'));
+        $this->assertEquals('baseCodeRoute', $route->getDefault('_sonata_admin'));
+        $this->assertEquals('baseRouteName_view', $route->getDefault('_sonata_name'));
+    }
+}