2016-07-15 16 views
2

注文用にショーテンプレートの下部に小さなフォームをレンダリングするカスタムアクションを作成しました。フォームは、基本的なチェックボックスとトウボタン付きの選択フィールドです。それは完璧に動作しますが、レンダリングは正しくありません。Sonata Adminにカスタムアクションを追加する

表示テンプレートが100%正しくないレンダリング方法を知っています。レンダリング時に、左側のメニューがもう機能しないためです。

ここに私のカスタムコントローラがあります。

namespace Qi\Bss\FrontendBundle\Controller; 

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Qi\Bss\FrontendBundle\Crud\Crud; 
use Qi\Bss\BaseBundle\Entity\Business\PmodOrder; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class PmodOrderController extends Controller 
{ 
    /** 
    * @Route("/{id}/approve", name = "order_approve") 
    * @Security("is_granted('IS_AUTHENTICATED_FULLY')") 
    * @Method({"GET", "POST"}) 
    */ 
    public function approveAction(Request $request, $id){ 
     $em = $this->getDoctrine()->getManager(); 
     $order = $em->getRepository('QiBssBaseBundle:PmodOrder')->find($id); 
     $approveForm = $this->createFormBuilder($order) 
      ->add('requireApproval', 'checkbox', array('label' => 'Require second Approval', 'required' => false, 'mapped' => false)) 
      ->add('secondApprover', 'choice', array('choices' => Crud::enumStatus(), 'label' => 'User', 'required' => false)) 
      ->getForm(); 

     $approveForm->handleRequest($request); 

     if ($approveForm->isSubmitted() && $approveForm->isValid()) { 
      $secondApproval = $request->request->get('form'); 
      $approval = $approveForm->getData(); 

      if (isset($secondApproval['requireApproval'])) { 
       $approval->setStatus(PmodOrder::STATUS_PARTLY_APPROVED); 

       $em->persist($approval); 
       $em->flush(); 

       return new RedirectResponse($this->container->get('router')->generate('admin_bss_base_business_pmodorder_show', array('id' => $order->getId()))); 
      } else { 
       $approval->setSecondApprover(NULL); 
       $approval->setStatus(PmodOrder::STATUS_APPROVED); 

       $em->persist($approval); 
       $em->flush(); 

       return new RedirectResponse($this->container->get('router')->generate('admin_bss_base_business_pmodorder_show', array('id' => $order->getId()))); 
      }    

     } 

     return $this->render('QiBssFrontendBundle:PmodOrder:order_approve.html.twig', array(
      'order' => $order, 
      'form' => $approveForm->createView(), 
     )); 
    } 
} 

私が実際にソナタのCRUDControllerから拡張すると考えていることは、私にとって気になることです。そして私がそれをするとき、私は誤りを得る。

例外はテンプレート のレンダリング中にスローされた

(「コントローラ Path\To\Controller\PmodOrderControllerと現在の ルート ``に定義された_sonata_adminはありません」)

そして私も承知しています私は実際に戻り値を使用すると仮定していますreturn new RedirectResponse($this->admin->generateUrl('show'));

この時点で私はもう何をすべきか分かりません。誰かが私のシナリオではCRUDControllerから正しく拡張する方法を私を導いてくださいすることができた場合、それは本当にここでは例を

+0

SonataAdmin:CRUDコントローラを拡張し、それを使用するにはsonataadminクラスを拡張する必要があります。適切なサービスを作りましたか? –

+0

https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_custom_action.html – pbenard

答えて

1

をいただければ幸いそれが最善の解決策だが、私はそれはあなたを助けることを願っている場合、私は知らない。

1 - カスタムCRUDcontroller作成:admin.ymlに登録

# 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-:

# 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 - あなた自身のcustom_show.html.twig(単に警官を作成します。 Yとソナタ-adminのフォルダにあるオリジナルのテンプレートbase_show.html.twigのペースト)、ここにあなたがビューに余分な要素を表示することができます

# 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-その後、あなたのcustom_showテンプレートを表示するには、あなたのadminControllerに指示します現在のルートが(デフォルトテンプレートbase_show.html.twigの代わりに)「show」である場合:

# 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

答えていただきありがとうございますが、わかりません。私は自分のロジック(私の新しい余分なアクション)をショーアクションの中に入れなければならないのですか?コメント行がメソッド内であなたのロジックを実行します。 –

+0

はい、ただ単にメソッドを呼び出すだけです(ここでは "doTheJob()"と書いています)。 –

+0

ああ今、私は理解しています、私は今これを試してみます。ありがとう。私のメソッド(doTheJob()をサンプルに入れたもの)を置く特定の場所はありますか? –

関連する問題