Przeglądaj źródła

Added optional preview mode for editing and creating entities

Thanos Polymeneas 13 lat temu
rodzic
commit
a58ea9da6e

+ 30 - 0
Admin/Admin.php

@@ -381,6 +381,15 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
     protected $extensions = array();
 
     protected $labelTranslatorStrategy;
+    
+    /**
+     * Setting to true will enable preview mode for
+     * the entity and show a preview button in the
+     * edit/create forms
+     * 
+     * @var boolean	
+     */
+    protected $supportsPreviewMode = false;
 
     /**
      * Roles and permissions per role
@@ -2404,4 +2413,25 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
     {
         return $this->labelTranslatorStrategy;
     }
+    
+    /**
+     * Returning true will enable preview mode for
+     * the target entity and show a preview button
+     * when editing/creating an entity
+     * 
+     * @return boolean
+     */
+    public function supportsPreviewMode()
+    {
+        return $this->supportsPreviewMode;
+    }
+    
+    /**
+     * Enables the preview template for the create/edit actions
+     */
+    public function enablePreviewTemplate()
+    {
+        $this->setTemplate('edit', $this->getTemplate('preview'));
+        $this->setTemplate('create', $this->getTemplate('preview'));
+    }
 }

+ 45 - 6
Controller/CRUDController.php

@@ -257,7 +257,20 @@ class CRUDController extends Controller
         if ($this->get('request')->getMethod() == 'POST') {
             $form->bindRequest($this->get('request'));
 
-            if ($form->isValid()) {
+            // preview mode was requested
+            $isPreviewRequested = $this->get('request')->get('btn_preview') !== null;
+            // preview-approved was clicked
+            $isPreviewApproved = $this->get('request')->get('btn_preview_approve') !== null;
+            // preview-decline was clicked
+            $isPreviewDeclined = $this->get('request')->get('btn_preview_decline') !== null;
+            
+            // call it preview mode if one of the preview buttons was clicked
+            $inPreviewMode = ($isPreviewRequested || $isPreviewApproved || $isPreviewDeclined);
+            
+            $isFormValid = $form->isValid(); 
+            
+             // persist if the form was valid and if in preview mode the preview was approved
+            if ($isFormValid && (!$inPreviewMode || $isPreviewApproved)) {
                 $this->admin->update($object);
                 $this->get('session')->setFlash('sonata_flash_success', 'flash_edit_success');
 
@@ -271,8 +284,14 @@ class CRUDController extends Controller
                 // redirect to edit mode
                 return $this->redirectTo($object);
             }
-
-            $this->get('session')->setFlash('sonata_flash_error', 'flash_edit_error');
+            
+            // show an error message if the form failed validation
+            if (!$isFormValid) {
+                $this->get('session')->setFlash('sonata_flash_error', 'flash_edit_error');
+            } elseif ($isPreviewRequested) {
+                // enable the preview template if the form was valid and preview was requested
+                $this->admin->enablePreviewTemplate();
+            }
         }
 
         $view = $form->createView();
@@ -422,8 +441,21 @@ class CRUDController extends Controller
 
         if ($this->get('request')->getMethod() == 'POST') {
             $form->bindRequest($this->get('request'));
-
-            if ($form->isValid()) {
+            
+            // preview mode was requested
+            $isPreviewRequested = $this->get('request')->get('btn_preview') !== null;
+            // preview-approved was clicked
+            $isPreviewApproved = $this->get('request')->get('btn_preview_approve') !== null;
+            // preview-decline was clicked
+            $isPreviewDeclined = $this->get('request')->get('btn_preview_decline') !== null;
+            
+            // call it preview mode if one of the preview buttons was clicked
+            $inPreviewMode = ($isPreviewRequested || $isPreviewApproved || $isPreviewDeclined);
+            
+            $isFormValid = $form->isValid(); 
+            
+            // persist if the form was valid and if in preview mode the preview was approved
+            if ($isFormValid && (!$inPreviewMode || $isPreviewApproved)) {
                 $this->admin->create($object);
 
                 if ($this->isXmlHttpRequest()) {
@@ -437,7 +469,14 @@ class CRUDController extends Controller
                 // redirect to edit mode
                 return $this->redirectTo($object);
             }
-            $this->get('session')->setFlash('sonata_flash_error', 'flash_create_error');
+            
+            // show an error message if the form failed validation
+            if (!$isFormValid) {
+                $this->get('session')->setFlash('sonata_flash_error', 'flash_create_error');
+            } elseif ($isPreviewRequested) {
+                // enable the preview template if the form was valid and preview was requested
+                $this->admin->enablePreviewTemplate();
+            }
         }
 
         $view = $form->createView();

+ 1 - 0
DependencyInjection/Configuration.php

@@ -132,6 +132,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('preview')->defaultValue('SonataAdminBundle:CRUD:preview.html.twig')->cannotBeEmpty()->end()
                         ->scalarNode('history')->defaultValue('SonataAdminBundle:CRUD:history.html.twig')->cannotBeEmpty()->end()
                         ->scalarNode('history_revision')->defaultValue('SonataAdminBundle:CRUD:history_revision.html.twig')->cannotBeEmpty()->end()
                         ->scalarNode('action')->defaultValue('SonataAdminBundle:CRUD:action.html.twig')->cannotBeEmpty()->end()

+ 4 - 0
Resources/public/css/layout.css

@@ -266,3 +266,7 @@ body.sonata-bc {
     content: '- ';
     padding-left: 5px;
 }
+
+.sonata-preview-form-container fieldset {
+    display: none;
+}

+ 13 - 0
Resources/translations/SonataAdminBundle.ca.xliff

@@ -315,6 +315,19 @@
                 <source>loading_information</source>
                 <target>S'està carregant informació…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.cs.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Načítání informací…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.de.xliff

@@ -313,6 +313,19 @@
                 <source>loading_information</source>
                 <target>Informationen werden geladen…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.en.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Loading information…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>Preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>Approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>Decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.es.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Cargando información...</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.fr.xliff

@@ -311,6 +311,19 @@
                 <source>loading_information</source>
                 <target>Chargement des informations…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.hr.xliff

@@ -314,6 +314,19 @@
                 <source>loading_information</source>
                 <target>Učitavam podatke...</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.it.xliff

@@ -311,6 +311,19 @@
                 <source>loading_information</source>
                 <target>Caricamento informazioni…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.ja.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>情報を読み込んでいます…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.lb.xliff

@@ -255,6 +255,19 @@
                 <source>loading_information</source>
                 <target>loading_information …</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.nl.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Laden van informatie…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>Voorvertoning</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>Goedkeuren</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>Afkeuren</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.pl.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Ładowanie informacji…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.pt_BR.xliff

@@ -247,6 +247,19 @@
                 <source>loading_information</source>
                 <target>Carregando informações…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.pt_PT.xliff

@@ -247,6 +247,19 @@
                 <source>loading_information</source>
                 <target>Carregando informações…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.ru.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Загрузка информации…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.sk.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Načítavajú sa informácie…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.sl.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Nalaganje informacij…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 13 - 0
Resources/translations/SonataAdminBundle.uk.xliff

@@ -317,6 +317,19 @@
                 <source>loading_information</source>
                 <target>Завантаження інформації…</target>
             </trans-unit>
+
+            <trans-unit id="btn_preview">
+                <source>btn_preview</source>
+                <target>btn_preview</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_approve">
+                <source>btn_preview_approve</source>
+                <target>btn_preview_approve</target>
+            </trans-unit>
+            <trans-unit id="btn_preview_decline">
+                <source>btn_preview_decline</source>
+                <target>btn_preview_decline</target>
+            </trans-unit>
         </body>
     </file>
 </xliff>

+ 3 - 66
Resources/views/CRUD/base_edit.html.twig

@@ -40,71 +40,8 @@ file that was distributed with this source code.
 
 {% block side_menu %}{{ knp_menu_render(admin.sidemenu(action), {}, 'list') }}{% endblock %}
 
-{% block form %}
-
-    {% set url = admin.id(object) ? 'edit' : 'create' %}
-
-    {% 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 %}
-
-            {% block sonata_pre_fieldsets %}{% endblock %}
+{% use 'SonataAdminBundle:CRUD:base_edit_form.html.twig' with form as parentForm %}
 
-            {% for name, form_group in admin.formgroups %}
-                <fieldset {% if form_group.collapsed %}class="sonata-ba-fielset-collapsed"{% endif %}>
-                    <legend>
-                        {% if form_group.collapsed %}
-                            <a href="" class="sonata-ba-collapsed" title="{% trans from 'SonataAdminBundle' %}link_expand{% endtrans %}">{{ name|trans({}, admin.translationdomain) }}</a>
-                        {% else %}
-                            {{ name|trans({}, admin.translationdomain) }}
-                        {% endif %}
-                    </legend>
-
-                    <div class="sonata-ba-collapsed-fields">
-                        {% for field_name in form_group.fields %}
-                            {% if admin.formfielddescriptions[field_name] is defined %}
-                                {{ form_row(form[field_name])}}
-                            {% endif %}
-                        {% endfor %}
-                    </div>
-                </fieldset>
-            {% endfor %}
-
-            {% block sonata_post_fieldsets %}{% endblock %}
-
-            {{ form_rest(form) }}
-
-            <div class="actions">
-                {% if app.request.isxmlhttprequest %}
-                    {% if admin.id(object) %}
-                        <input type="submit" class="btn primary" name="btn_update" value="{% trans from 'SonataAdminBundle' %}btn_update{% endtrans %}"/>
-                    {% else %}
-                        <input type="submit" class="btn" name="btn_create" value="{% trans from 'SonataAdminBundle' %}btn_create{% endtrans %}"/>
-                    {% endif %}
-                {% else %}
-                    {% if admin.id(object) %}
-                        <input type="submit" class="btn primary" name="btn_update_and_edit" value="{% trans from 'SonataAdminBundle' %}btn_update_and_edit_again{% endtrans %}"/>
-                        <input type="submit" class="btn" name="btn_update_and_list" value="{% trans from 'SonataAdminBundle' %}btn_update_and_return_to_list{% endtrans %}"/>
-
-                        {% if admin.hasroute('delete') and admin.isGranted('DELETE', object) %}
-                            {% trans from 'SonataAdminBundle' %}delete_or{% endtrans %}
-                            <a class="btn danger" href="{{ admin.generateObjectUrl('delete', object) }}">{% trans from 'SonataAdminBundle' %}link_delete{% endtrans %}</a>
-                        {% endif %}
-                    {% else %}
-                        <input class="btn primary" type="submit" name="btn_create_and_edit" value="{% trans from 'SonataAdminBundle' %}btn_create_and_edit_again{% endtrans %}"/>
-                        <input class="btn" type="submit" name="btn_create_and_create" value="{% trans from 'SonataAdminBundle' %}btn_create_and_create_a_new_one{% endtrans %}"/>
-                    {% endif %}
-                {% endif %}
-            </div>
-        </form>
-    {% endif%}
+{% block form %}
+    {{block('parentForm')}}
 {% endblock %}