src/AppBundle/Controller/BaseController.php line 32

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Controller;
  3. use AppBundle\Component\PageBuilder\PageBuilder;
  4. use AppBundle\Component\Util\ParameterCollection;
  5. use AppBundle\Event\PageBuilderFormLoadedEvent;
  6. use AppBundle\Event\PageBuilderInitializedEvent;
  7. use Doctrine\ORM\Query\FilterCollection;
  8. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  12. use Doctrine\ORM\Tools\Pagination\Paginator;
  13. use Symfony\Component\EventDispatcher\EventDispatcher;
  14. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  15. class BaseController extends Controller
  16. {
  17.     /** @var EventDispatcher */
  18.     protected $dispatcher;
  19.     /** @var ParameterCollection */
  20.     protected $view_params;
  21.     public function before(FilterControllerEvent $event)
  22.     {
  23.         $request $event->getRequest();
  24.         $this->dispatcher $this->get('event_dispatcher');
  25.         $em $this->getDoctrine()->getManager();
  26.         $em->getFilters()->enable('public');
  27.         $lang $request->attributes->get('_locale'null);
  28.         if ($lang) {
  29.             $em $this->getDoctrine()->getManager();
  30.             $filter $em->getFilters()->enable('language');
  31.             $filter->setParameter('language'$lang);
  32.             $this->view_params->set('cms__lang'$lang);
  33.         } else {
  34.             $this->view_params->set('cms__lang'null);
  35.         }
  36.         $mediaManager $this->container->get('app.media_manager');
  37.         $mediaManager->setBaseUrl($request->getSchemeAndHttpHost() . $request->getBasePath());
  38.     }
  39.     public function __construct()
  40.     {
  41.         $this->view_params = new ParameterCollection();
  42.     }
  43.     protected function render($view, array $parameters = array(), Response $response null)
  44.     {
  45.         $parameters array_merge($this->view_params->all(), $parameters);
  46.         return parent::render($view$parameters$response);
  47.     }
  48.     // ルート直下の php テンプレートを表示する
  49.     public function renderFront($template$data=array())
  50.     {
  51.         $rootDir $this->get('kernel')->getRootDir();
  52.         $file realpath($rootDir '/../../../') . '/' ltrim($template'/');
  53.         if (CMS__IS_FRONT_ROUTING){
  54.             return array_merge($this->view_params->all(), $data);
  55.         } else {
  56.             return $this->render($file$data);
  57.         }
  58.     }
  59.     /**
  60.      * 項目を取得する
  61.      *
  62.      * @param Request $request
  63.      * @param string $class
  64.      * @param array $criteria
  65.      * @return mixed
  66.      */
  67.     protected function findItemBy(Request $request$class$criteria=[])
  68.     {
  69.         $repository $this->getDoctrine()->getRepository($class);
  70.         $em $this->getDoctrine()->getManager();
  71.         $mode '';
  72.         $queryToken '';
  73.         $previewTarget $request->query->get('preview_target');
  74.         if(defined($class '::NAME')) {
  75.             $entityName constant($class '::NAME');
  76.         } else {
  77.             $entityName null;
  78.         }
  79.         if(!empty($previewTarget) && $previewTarget !== $entityName){
  80.             $mode 'default';
  81.         } elseif (!is_null($request)) {
  82.             $mode $request->query->get('cms_mode''default');
  83.             $queryToken $request->query->get('cms_token');
  84.         }
  85.         if(!empty($queryToken)){
  86.             $criteria['access_token'] = $queryToken;
  87.         }
  88.         // 無関係のプレビューは無視
  89.         if($entityName !== $request->query->get('preview_target')){
  90.             $mode 'default';
  91.         }
  92.         if ('preview' === $mode) {
  93.             // 非公開制限を無視して取得
  94.             /** @var FilterCollection $filters */
  95.             $filters $em->getFilters();
  96.             $filters->disable('public');
  97.             $filters->disable('post_type');
  98.             $languageFilter = ($filters->isEnabled('language')) ? $filters->getFilter('language') : null;
  99.             if($languageFilter) {
  100.                 $languageFilterState $languageFilter->isActive();
  101.                 $languageFilter->deactivate();
  102.             } else {
  103.                 $languageFilterState false;
  104.             }
  105.             $item $repository->findOneBy($criteria, ['id' => 'DESC']);
  106.             $filters->enable('public');
  107.             $filters->enable('post_type');
  108.             if ($languageFilter && $languageFilterState) {
  109.                 $languageFilter->activate();
  110.             }
  111.             if(empty($item->getAccessToken()) || $queryToken !== $item->getAccessToken()) {
  112.                 throw new AccessDeniedHttpException('Access token does not match.');
  113.             }
  114.         } elseif ('tmp_preview' === $mode) {
  115.             // 編集画面から一時的プレビュー画面
  116.             $id $request->query->get('preview_id');
  117.             $item $this->getPreviewBy(['id' => $id], $class);
  118.             if (empty($item->getAccessToken()) || $queryToken !== $item->getAccessToken()) {
  119.                 throw new AccessDeniedHttpException('Access token does not match.');
  120.             }
  121.         } else {
  122.             $item $repository->findOneBy($criteria);
  123.         }
  124.         return $item;
  125.     }
  126.     
  127.     public function paginate($query$page 1$limit 5)
  128.     {
  129.         $paginator  $this->container->get('knp_paginator');
  130.         $pagination $paginator->paginate(
  131.             $query$page$limit
  132.         );
  133.         
  134.         return $pagination;
  135.     }
  136.     /**
  137.      * @param string $form
  138.      * @param null $entity
  139.      * @param array $options
  140.      * @return PageBuilder
  141.      */
  142.     protected function createPageBuilder($form$entity null$options=[])
  143.     {
  144.         $builder = new PageBuilder($this->container);
  145.         $language = isset($options['language']) ? $options['language'] : null;
  146.         $this->dispatcher->dispatch(PageBuilderInitializedEvent::NAME, new PageBuilderInitializedEvent($builder, ['language' => $language]));
  147.         $builder->loadForm($form$options);
  148.         $this->dispatcher->dispatch(PageBuilderFormLoadedEvent::NAME, new PageBuilderFormLoadedEvent($builder, ['language' => $language]));
  149.         if($entity){
  150.             $builder->readEntityData($entity);
  151.         }
  152.         $builder->setThemeDirectory('CustomBundle:Default:page-builder/themes');
  153.         return $builder;
  154.     }
  155.     protected function getDefaultParameter($name)
  156.     {
  157.         $container $this->container;
  158.         if ($container->hasParameter($name)) {
  159.             return $container->getParameter($name);
  160.         }
  161.         return [];
  162.     }
  163.     protected function getPaginationParams($paginator$options = [])
  164.     {
  165.         $data $paginator->getPaginationData();
  166.         $total $data['totalCount'];
  167.         $page $data['current'];
  168.         $limit $data['numItemsPerPage'];
  169.         $offset = ($page 1) * $limit;
  170.         $pages $data['pageCount'];
  171.         $start $data['firstPageInRange'];
  172.         $end $data['lastPageInRange'];
  173.         $from $data['firstItemNumber'];
  174.         $to $data['lastItemNumber'];
  175.         $params = [
  176.             'total' => $total,
  177.             'per_page' => $limit,
  178.             'current_page' => $page,
  179.             'last_page' => $pages,
  180.             'page_start' => $start,
  181.             'page_end' => $end,
  182.             'from' => $from,
  183.             'to' => $to,
  184.         ];
  185.         return $params;
  186.     }
  187. }