2016-07-15 14 views
2

Ich habe eine benutzerdefinierte Aktion erstellt, die ein kleines Formular am unteren Rand meiner Showvorlage für Aufträge rendert. Das Formular ist ein einfaches Kontrollkästchen und ein Auswahlfeld mit zwei Schaltflächen. Es funktioniert perfekt, aber das Rendering ist nicht richtig.Hinzufügen einer benutzerdefinierten Aktion zu Sonata Admin

Ich weiß, dass die Art, wie ich die Show-Vorlage rende, nicht zu 100% korrekt ist, denn wenn es gerendert wird, funktioniert das Menü auf der linken Seite nicht mehr.

Hier ist mein benutzerdefinierter Controller mit Aktion;

Was mich stört ist die Tatsache, dass ich eigentlich von Sonata CRUDController verlängern soll. Und wenn ich das tue, bekomme ich einen Fehler;

Eine Ausnahme während der Wiedergabe einer Vorlage geworfen wurde („Es gibt keine _sonata_admin für den Controller definiert Path\To\Controller\PmodOrderController und die aktuelle Route` `“)

Und ich bin mir auch bewusst dass ich eigentlich eine Rückkehr wie return new RedirectResponse($this->admin->generateUrl('show'));

verwenden soll An diesem Punkt weiß ich nicht mehr, was ich tun soll. Wenn jemand kann mir bitte führen, wie in meinem Szenario richtig von CRUDController zu verlängern, wäre es wirklich

+0

Sie sollten die SonataAdmin erweitern: CRUD-Controller und sonata Admin-Klasse sagen, es zu benutzen. Haben Sie einen richtigen Service erstellt? –

+0

Lesen Sie einfach das Dokument https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_custom_action.html – pbenard

Antwort

1

Hier ein Beispiel zu erkennen ist, ich weiß nicht, ob es die beste Lösung, aber ich hoffe, dass Sie helfen können:

1- einen benutzerdefinierten CRUDcontroller erstellen:

# CustomCRUDcontroller.php : 
class CustomCRUDDController extends Controller 
{ 
    /** 
    * Show action. 
    * 
    * @param int|string|null $id 
    * @param Request   $request 
    * 
    * @return Response 
    * 
    * @throws NotFoundHttpException If the object does not exist 
    * @throws AccessDeniedException If access is not granted 
    */ 
    public function showAction($id = null) 
    { 
     $request = $this->getRequest(); 
     // DO YOUR LOGIC IN THE METHOD, for example : 
     if(isset($request->get('yourFormParam'))){ 
      $this->doTheJob(); 
     } 

     $id = $request->get($this->admin->getIdParameter()); 

     $object = $this->admin->getObject($id); 

     if (!$object) { 
      throw $this->createNotFoundException(sprintf('unable to find the object with id : %s', $id)); 
     } 

     $this->admin->checkAccess('show', $object); 

     $preResponse = $this->preShow($request, $object); 
     if ($preResponse !== null) { 
      return $preResponse; 
     } 

     $this->admin->setSubject($object); 

     return $this->render($this->admin->getTemplate('show'), array(
      'action' => 'show', 
      'object' => $object, 
      'elements' => $this->admin->getShow(), 
     ), null); 
    } 
} 

2- es in admin.yml registrieren:

# admin.yml : 
x.admin.x: 
     class: Namespace\YourAdminClass 
     arguments: [~, Namespace\Entity, Namespace:CustomCRUD] 
     tags: 
      - {name: sonata.admin, manager_type: orm, group: X, label: X} 

3- Ihre eigenen custom_show.html.twig erstellen (nur ein Cop y und Paste der ursprünglichen Vorlage base_show.html.twig in dem Sonate-admin-Ordner), hier können Sie zusätzliche Elemente zur Ansicht anzuzeigen:

# custom_show.html.twig : 

{% extends base_template %} 

{% import 'SonataAdminBundle:CRUD:base_show_macro.html.twig' as show_helper %} 

{% block actions %} 
    {% include 'SonataAdminBundle:CRUD:action_buttons.html.twig' %} 
{% endblock %} 

{% block tab_menu %} 
    {{ knp_menu_render(admin.sidemenu(action), { 
     'currentClass' : 'active', 
     'template': sonata_admin.adminPool.getTemplate('tab_menu_template') 
    }, 'twig') }} 
{% endblock %} 

{% block show %} 
    <div class="sonata-ba-view"> 

     {{ sonata_block_render_event('sonata.admin.show.top', { 'admin': admin, 'object': object }) }} 

     {% set has_tab = (admin.showtabs|length == 1 and admin.showtabs|keys[0] != 'default') or admin.showtabs|length > 1 %} 

     {% if has_tab %} 
      <div class="nav-tabs-custom"> 
       <ul class="nav nav-tabs" role="tablist"> 
        {% for name, show_tab in admin.showtabs %} 
         <li{% if loop.first %} class="active"{% endif %}> 
          <a href="#tab_{{ admin.uniqid }}_{{ loop.index }}" data-toggle="tab"> 
           <i class="fa fa-exclamation-circle has-errors hide"></i> 
           {{ admin.trans(name, {}, show_tab.translation_domain) }} 
          </a> 
         </li> 
        {% endfor %} 
       </ul> 

       <div class="tab-content"> 
        {% for code, show_tab in admin.showtabs %} 
         <div 
           class="tab-pane fade{% if loop.first %} in active{% endif %}" 
           id="tab_{{ admin.uniqid }}_{{ loop.index }}" 
         > 
          <div class="box-body container-fluid"> 
           <div class="sonata-ba-collapsed-fields"> 
            {% if show_tab.description != false %} 
             <p>{{ show_tab.description|raw }}</p> 
            {% endif %} 

            {{ show_helper.render_groups(admin, object, elements, show_tab.groups, has_tab) }} 
           </div> 
          </div> 
         </div> 
        {% endfor %} 
       </div> 
      </div> 
     {% elseif admin.showtabs is iterable %} 
      {{ show_helper.render_groups(admin, object, elements, admin.showtabs.default.groups, has_tab) }} 
     {% endif %} 

    </div> 

    {{ sonata_block_render_event('sonata.admin.show.bottom', { 'admin': admin, 'object': object }) }} 
{% endblock %} 

4- Dann zeigen auf Ihren Admincontroller Ihre custom_show Vorlage anzuzeigen wenn die aktuelle Route „Show“ (anstelle der Standardvorlage base_show.html.twig) ist:

# YourEntityAdminController.php : 
class YourEntityAdminController extends Controller 
{ 
    // allows you to chose your custom showAction template : 
    public function getTemplate($name){ 
     if ($name == "show") 
      return 'YourBundle:Admin:custom_show.html.twig' ; 
     return parent::getTemplate($name); 
    } 

} 
+0

Danke für die Antwort, aber ich verstehe nicht. Muss ich meine eigene Logik (meine neue Extra-Aktion) in die Show-Aktion einfügen, in der die Kommentarzeile '// IHREN LOGIK IN DER METHODE, zum Beispiel:' steht? –

+0

Ja, aber rufen Sie einfach eine Methode (wo ich "doTheJob()" geschrieben hat) oder eine Service-Methode, die Ihre Logik enthält, wenn Ihr Parameter zum Beispiel in der Anfrage ist. –

+0

Ahh jetzt verstehe ich, ich werde das jetzt versuchen. Vielen Dank. Gibt es einen bestimmten Ort, an den ich meine Methode setzen kann (was du in der Probe doTheJob() genannt hast)? –

Verwandte Themen