2016-07-15 4 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 Сонаты. И когда я делаю это, я получаю сообщение об ошибке;

Исключение было брошено во время рендеринга шаблона («Там нет _sonata_admin определен для контроллера Path\To\Controller\PmodOrderController и текущий маршрут` `»)

И я также знаю, что я на самом деле предполагаю использовать возврат, как return new RedirectResponse($this->admin->generateUrl('show'));

На данный момент я не знаю, что делать дальше. Если кто-нибудь может пожалуйста, руководство меня, как правильно проходить от CRUDController в моем случае, это было бы действительно оценили

+0

Вы должны расширить SonataAdmin: CRUD контроллер и сказать сонатную администратора класс, чтобы использовать его. Вы создали надлежащее обслуживание? –

+0

Просто прочитайте документ https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_custom_action.html – pbenard

ответ

1

Вот пример, я не знаю, если это лучшее решение, но я надеюсь, что может помочь вам:

1- Создание пользовательского CRUDcontroller:

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

# 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 (только полицейский у и паста оригинального шаблона 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- Затем указывают на ваш adminController для отображения шаблона custom_show когда текущий маршрут «шоу» (вместо шаблона base_show.html.twig по умолчанию):

# 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

Спасибо за ответ, но я не понимаю. Должен ли я поместить свою собственную логику (мое новое дополнительное действие) внутри действия show, где строка комментария '// Делаем вашу логику в методе, например:' стоит? –

+0

Да, но просто вызовите метод (где я написал «doTheJob()») или метод службы, содержащий вашу логику, когда ваш параметр указан в запросе, например. –

+0

А теперь я понимаю, я попробую это сейчас. Благодарю. Есть ли конкретное место, где можно поместить мой метод (что вы назвали doTheJob() в образце)? –