2012-09-11 3 views
2

나는이 공통 지금까지 내가 해왔습니다, 나는 SonataAdmin에서 떨어져 softdeletable과 유사한 필터를 필요 물어 확신 :언제 Doctrine 필터를 SonataAdmin 워크 플로우에서 비활성화해야합니까?

문제, 하나의 숫자를 야기
use Sonata\AdminBundle\Admin\Admin as BaseAdmin; 

class Admin extends BaseAdmin 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function configure() 
    { 
     /** 
     * This executes everywhere in the admin and disables softdelete for everything, if you need something cleverer this should be rethought. 
     */ 
     $filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters(); 

     if (array_key_exists('approvable', $filters->getEnabledFilters())) { 
      $filters->disable('approvable'); 
     } 

     if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) { 
      $filters->disable('softdeleteable'); 
     } 
    } 
} 

, 그것은 조건문이 필요합니다 admin 클래스는 두 번 구성 되었기 때문에 한 번 nav을 빌드하고 두 번째 인터페이스를 빌드하기 때문에 admin 클래스는 콜드 (APC 어쩌면?) 캐시에서 인스턴스화 된 프론트 엔드입니다.

이 논리를 어디에 넣으려고하십니까?

+0

나는 최근이 프로젝트에 근무 한 적이없는,하지만 난 아마에 대한 사용자 지정 관리 컨트롤러를 추가하여이를 수 있으리라 생각합니다 해당 관리자. 또한 이제 특정 엔터티에 대한 필터를 사용하지 않도록 설정할 수 있습니다. 필터를 전역 적으로 사용하지 않도록 설정하는 것보다 더 나은 계획 일 수 있습니다. – Steve

+0

특정 엔터티에 대한 필터를 사용하지 않도록 설정하는 모든 코드 예제 @Steve? – webDEVILopers

답변

1

이벤트 리스너를 사용할 수 있습니다. 예를 들면 :

서비스 :

filter.configurator: 
class: AppBundle\Filter\Configurator 
arguments: ["@doctrine.orm.entity_manager"] 
tags: 
    - { name: kernel.event_listener, event: kernel.controller } 

리스너 클래스 :

namespace AppBundle\Filter; 

use Doctrine\Bundle\DoctrineBundle\Registry; 
use Doctrine\ORM\EntityManagerInterface; 
use Sonata\AdminBundle\Controller\CoreController; 
use Sonata\AdminBundle\Controller\CRUDController; 
use Sonata\AdminBundle\Controller\HelperController; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 

/** 
* Class Configurator 
* 
* @author Andrey Nilov <[email protected]> 
*/ 
class Configurator 
{ 
    /** 
    * @var Registry 
    */ 
    private $em; 

    /** 
    * @param EntityManagerInterface $em 
    */ 
    public function __construct(EntityManagerInterface $em) 
    { 
     $this->em = $em; 
    } 

    /** 
    * onKernelRequest 
    */ 
    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 
     $controllerClass = $controller[0]; 

     $isAdminController = 
      $controllerClass instanceof CRUDController || 
      $controllerClass instanceof CoreController || 
      $controllerClass instanceof HelperController 
     ; 

     if ($isAdminController) { 
      $this->em->getFilters()->disable('softdeleteable'); 
     } 
    } 
} 
관련 문제