src/AppBundle/Controller/Admin/Base/FacilityBaseController.php line 27

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Controller\Admin\Base;
  3. use AppBundle\Component\PageBuilder\Event\OnCommitEvent;
  4. use AppBundle\Component\Util\ButtonSection;
  5. use AppBundle\Entity\Approval\ApprovalRequest;
  6. use AppBundle\Entity\Approval\ApprovalRequestCollection;
  7. use AppBundle\Entity\Master\Language;
  8. use AppBundle\Event\Approval\RequestCreatedEvent;
  9. use AppBundle\Event\PageBuilderFormLoadedEvent;
  10. use AppBundle\Event\PageBuilderInitializedEvent;
  11. use AppBundle\Repository\ApprovalRequestRepository;
  12. use Doctrine\ORM\Query\FilterCollection;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\DependencyInjection\Container;
  18. use AppBundle\Controller\Admin\Base\BaseController;
  19. use AppBundle\Component\PageBuilder\PageBuilder;
  20. use AppBundle\Entity\Master\Facility;
  21. use Doctrine\ORM\EntityNotFoundException;
  22. use Symfony\Component\HttpFoundation\RedirectResponse;
  23. use Symfony\Component\Form\Extension\Core\Type;
  24. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  25. class FacilityBaseController extends BaseController {
  26.     /** @var Facility */
  27.     public $facility null;
  28.     /** @var string */
  29.     public $facility_code 'master';
  30.     /**
  31.      * @param FilterControllerEvent $event
  32.      * @throws EntityNotFoundException
  33.      */
  34.     public function before(FilterControllerEvent $event)
  35.     {
  36.         $request $event->getRequest();
  37.         $facility_code $request->attributes->get('facility''master');
  38.         $this->facility_code $facility_code;
  39.         $this->base_route_params['facility'] = $facility_code;
  40.         parent::before($event);
  41.         // ログイン前に呼ばれる可能性に注意
  42.         if ($this->getUser()) {
  43.             // 担当外の施設へのアクセスはリダイレクト
  44.             $user_facility $this->getUser()->getFacility();
  45.             if ($user_facility && $user_facility->getCode() !== $facility_code) {
  46.                 $redirect_url $this->get('router')->generate('admin_facility_home', ['facility' => $user_facility->getCode()]);
  47.                 $event->setController(function() use ($redirect_url) {
  48.                     return new RedirectResponse($redirect_url);
  49.                 });
  50.             }
  51.         }
  52.         // 施設フィルタ設定
  53.         $em $this->getDoctrine()->getManager();
  54.         if('master' === $facility_code || is_null($facility_code)){
  55.             $facility null;
  56.             $filter $em->getFilters()->enable('facility');
  57.         } else {
  58.             $facility $this->getFacilityByCode($facility_code);
  59.             if(!$facility){
  60.                 throw new EntityNotFoundException('Facility "' $facility_code '" not found.');
  61.             }
  62.             $filter $em->getFilters()->enable('facility');
  63.             $filter->setParameter('facility_id'$facility->getId());
  64.         }
  65.         $this->facility $facility;
  66.         $this->facility_code $facility_code;
  67.         $this->global->set('facility'$facility);
  68.     }
  69.     /**
  70.      * 施設に応じて入力項目を変更する
  71.      *
  72.      * @param $builder
  73.      * @param $facility_code
  74.      * @param $entity
  75.      */
  76.     protected function initForm($builder$facility_code$entity null) {}
  77.     /**
  78.      * @param Request $request
  79.      * @param $facility
  80.      * @return RedirectResponse|Response
  81.      */
  82.     public function indexAction(Request $request$facility)
  83.     {
  84.         $settings $this->entity_settings;
  85.         if ($settings->get('single')) {
  86.             $entity $this->findOneEntity($this->models['item'], $this->base_criteria);
  87.             $langParent = ($entity && method_exists($entity'getLanguageParent')) ? $entity->getLanguageParent() : null;
  88.             if($entity && !empty($langParent)){
  89.                 $entity $this->findOneEntity($this->models['item'], ['id' => $langParent]);
  90.             }
  91.             if ($entity) {
  92.                 return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, ['id' => $entity->getId()]));
  93.             } else {
  94.                 return $this->redirectToRoute($this->routes['new'], $this->base_route_params);
  95.             }
  96.         }
  97.         $data_table_options $this->getListDataTableOptions();
  98.         $criteria $request->query->get('criteria', []);
  99.         if(isset($data_table_options['ajax']['url']) && !empty($criteria)){
  100.             $data_table_options['ajax']['url'] = $this->appendParamsToUrl($data_table_options['ajax']['url'],
  101.                 ['criteria' => $criteria]);
  102.         }
  103.         return $this->render($this->views['index'], [
  104.             'meta' => $this->meta('INDEX'),
  105.             'data_table_options' => $data_table_options,
  106.             'search_form' => $this->buildSearchForm([], [
  107.                 'criteria' => $criteria
  108.             ])->createView(),
  109.             'entity_settings' => $this->entity_settings,
  110.             'button_sections' => isset($this->button_sections['index']) ? $this->button_sections['index'] : [],
  111.         ]);
  112.     }
  113.     /**
  114.      * @param Request $request
  115.      * @return RedirectResponse|Response
  116.      */
  117.     public function sortAction(Request $request$facility)
  118.     {
  119.         $meta $this->meta('INDEX');
  120.         if ($this->entity_settings->isMultilingual()) {
  121.             $languages $this->getMasterLanguages();
  122.             $data = [];
  123.             $builder $this->get('form.factory')
  124.                 ->createNamedBuilder('criteria'Type\FormType::class, $data, [
  125.                     'csrf_protection' => false
  126.                 ]);
  127.             $builder->setMethod('GET');
  128.             $form $builder->getForm();
  129.             $langList = [];
  130.             foreach ($languages as $language) {
  131.                 $langList[$language->getTitle()] = $language->getAlias();
  132.             }
  133.             $form->add('language'Type\ChoiceType::class, [
  134.                 'label' => '言語:',
  135.                 'choices' => $langList,
  136.                 'attr' => [
  137.                     'class' => 'form-control form-control-inline'
  138.                 ]
  139.             ]);
  140.             $this->view_params->set('search_form'$form->createView());
  141.         }
  142.         if ($request->isMethod('post')) {
  143.             $order $request->get('order''');
  144.             $idList preg_split('/,/'$order, -1, \PREG_SPLIT_NO_EMPTY);
  145.             $em $this->getDoctrine()->getManager();
  146.             $options = [
  147.                 'reverse' => false
  148.             ];
  149.             $this->updateOrder($idList$this->models['item'], $options);
  150.             $em->flush();
  151.             // フラッシュメッセージ
  152.             $this->addFlash('success'$this->title MSG_SORT_END);
  153.             return $this->redirect($this->base_path 'sort/');
  154.         }
  155.         $data_table_options $this->getSortDataTableOptions();
  156.         return $this->render($this->views['sort'], [
  157.             'meta' => $meta,
  158.             'data_table_options' => $data_table_options,
  159.             'button_sections' => isset($this->button_sections['sort']) ? $this->button_sections['sort'] : [],
  160.         ]);
  161.     }
  162.     /**
  163.      * @param Request $request
  164.      * @param $facility
  165.      * @return RedirectResponse|Response
  166.      */
  167.     public function newAction(Request $request$facility)
  168.     {
  169.         $settings $this->entity_settings;
  170.         if ($settings->isMultilingual()) {
  171.             return $this->multiLingualNewAction($request$facility);
  172.         }
  173.         if ($settings->get('single')) {
  174.             $entity $this->findOneEntity($this->models['item'], $this->base_criteria);
  175.             $langParent = ($entity && method_exists($entity'getLanguageParent')) ? $entity->getLanguageParent() : null;
  176.             if($entity && !empty($langParent)){
  177.                 $entity $this->findOneEntity($this->models['item'], ['id' => $langParent]);
  178.             }
  179.             if ($entity) {
  180.                 return $this->redirectToRoute(
  181.                     $this->entity_settings->get('base_route') . "_edit",
  182.                     ['facility' => $facility'id' => $entity->getId()]
  183.                 );
  184.             }
  185.         }
  186.         if($this->isGranted('approval_request_edit')){
  187.             $approval_required false;
  188.         } else {
  189.             $approval_required $settings->get('approval_required'false);
  190.         }
  191.         $preview_url null;
  192.         $em $this->getDoctrine()->getManager();
  193.         $entity = new $this->models['item']();
  194.         $entity->setFacility($this->facility);
  195.         $builder $this->createPageBuilder($this->form_classnull'new');
  196.         $this->pageBuilderOnLoad($builder);
  197.         $buttonAction $request->request->get('_button_action''default');
  198.         if ($request->isMethod('post')) {
  199.             $referer $request->headers->get('referer');
  200.             $builder->initMediaUsageTracker();
  201.             $violations $builder->handleRequest($request);
  202.             // エラーがないとき
  203.             if(empty($violations)){
  204.                 $repo $em->getRepository($this->models['item']);
  205.                 $max = (method_exists($entity'getSortNum')) ? $repo->getMaxSortNum() : 0;
  206.                 if($buttonAction === 'preview'){
  207.                     // プレビューの作成
  208.                     $preview $this->duplicateEntity($entity);
  209.                     $preview->setRevisionParent(null);
  210.                     $preview->setPostType('preview');
  211.                     $blocks2 array_map(function($block){
  212.                         return clone $block;
  213.                     }, $builder->getBlocks());
  214.                     $builder->setBlocks($blocks2);
  215.                     $builder->commit(OnCommitEvent::MODE_PREVIEW);
  216.                     $formData $builder->getData();
  217.                     $formData $this->filterFormData($formData'new');
  218.                     $preview->bindFormData($formData);
  219.                     $token $this->generateAccessToken();
  220.                     $preview->setAccessToken($token);
  221.                     $this->save($em$preview$formDataself::SAVE_MODE_PREVIEW);
  222.                     $facility $preview->getFacility();
  223.                     if($this->entity_settings->isRevisable()) {
  224.                         $previewParams = [
  225.                             'id' => $preview->getId()
  226.                         ];
  227.                         if($facility){
  228.                             $previewParams['facility'] = $facility->getCode();
  229.                         }
  230.                         $preview_url $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params$previewParams));
  231.                     } else {
  232.                         $previewParams = [
  233.                             'preview_id' => $preview->getId(),
  234.                             'cms_token' => $token,
  235.                             'cms_mode' => 'tmp_preview'
  236.                         ];
  237.                         $preview_url $this->getPreviewPageUrl($facility$preview->getId(), $previewParams);
  238.                     }
  239.                 } else {
  240.                     $builder->commit();
  241.                     $formData $builder->getData();
  242.                     $formData $this->filterFormData($formData'new');
  243.                     $entity->bindFormData($formData);
  244.                     $post_type = ('draft' === $buttonAction) ? 'master:draft' 'master';
  245.                     if(method_exists($entity'setPostType')){
  246.                         if($approval_required && 'master' === $post_type){
  247.                             $post_type 'master:unapproved';
  248.                         }
  249.                         $entity->setPostType($post_type);
  250.                     }
  251.                     if(method_exists($entity'setSortNum')){
  252.                         $entity->setSortNum($max 1);
  253.                     }
  254.                     if (method_exists($entity'setLanguageAlias')) {
  255.                         $default_lang $this->container->getParameter('language.default''jp');
  256.                         $entity->setLanguageAlias($default_lang);
  257.                     }
  258.                     if (method_exists($entity'setLanguageActive')) {
  259.                         $entity->setLanguageActive(true);
  260.                     }
  261.                     $this->save($em$entity$formDataself::SAVE_MODE_NEW, [
  262.                         'flash_message' => $this->title MSG_NEW_END
  263.                     ]);
  264.                     $this->saveMediaUsages($entity);
  265.                     if ($this->entity_settings->isRevisable()) {
  266.                         $revision $this->generateRevision($entity);
  267.                         $revision->setPostType(('draft' === $buttonAction) ? 'draft' 'revision');
  268.                         $em->persist($revision);
  269.                         $em->flush();
  270.                         if($approval_required && $revision){
  271.                             $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_CREATE$this->getUser());
  272.                             $approval_request->setFacility($this->facility);
  273.                             $em->persist($approval_request);
  274.                             $em->flush();
  275.                             $this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
  276.                         }
  277.                         $this->saveMediaUsages($revision);
  278.                     }
  279.                     if($settings->get('single'false)){
  280.                         return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
  281.                             'facility' => $facility,
  282.                             'id' => $entity->getId(),
  283.                             'disable_redirect_suggestion' => true
  284.                         ]));
  285.                     } else {
  286.                         return $this->redirect($this->base_path);
  287.                     }
  288.                 }
  289.             }
  290.         }
  291.         return $this->render($this->views['edit'], [
  292.             'meta' => $this->meta('NEW'),
  293.             'builder' => $builder,
  294.             'preview_url' => $preview_url,
  295.             'redirect_url' => null,
  296.             'redirect_message' => null,
  297.             'entity' => null,
  298.             'master_entity' => null,
  299.             'post_type' => null,
  300.             'approval_required' => $approval_required,
  301.             'revisions' => [],
  302.             'revision_history' => [],
  303.             'approval_history' => [],
  304.             'button_sections' => isset($this->button_sections['new']) ? $this->button_sections['new'] : [],
  305.             '_pageBuilderParams' => $builder->getSharedParams(),
  306.             '_routes' => $this->routes,
  307.             '_base_route_params' => $this->base_route_params,
  308.         ]);
  309.     }
  310.     public function multiLingualNewAction(Request $request$facility)
  311.     {
  312.         $translator $this->container->get('translator');
  313.         $this->get('app.helper.script_loader')
  314.             ->register('language-edit'CMS__ADMIN_PATH 'js/pages/language-edit.js');
  315.         $settings $this->entity_settings;
  316.         if($this->isGranted('approval_request_edit')){
  317.             $approval_required false;
  318.         } else {
  319.             $approval_required $settings->get('approval_required'false);
  320.         }
  321.         $languages $this->getMasterLanguages();
  322.         $em $this->getDoctrine()->getManager();
  323.         $default_lang $this->container->getParameter('language.default''jp');
  324.         $selected_languages $request->request->get('select_lang', []);
  325.         $active_language $request->request->get('_active-language'null);
  326.         $violations = [];
  327.         $languageHeading $this->getLanguagesHeading($languages);
  328.         // 言語ごとのbuilderを設定
  329.         $builders $this->createPageBuilderLanguages($languages);
  330.         $preview_url null;
  331.         $buttonAction $request->request->get('_button_action''default');
  332.         $_pageBuilderParams = [];
  333.         foreach ($builders as $builder) {
  334.             $_pageBuilderParams += $builder->getSharedParams();
  335.         }
  336.         if ($request->isMethod('post')) {
  337.             $violations $this->validateLanguages($request$builders$selected_languages$buttonAction);
  338.             // エラーなし
  339.             if (empty($violations)) {
  340.                 $parentEntity null;
  341.                 $revisionParentEntity null;
  342.                 /** @var Language $language */
  343.                 foreach ($languages as $language) {
  344.                     $alias $language->getAlias();
  345.                     $isParent $language->isParent();
  346.                     $prefix $language->getTranslateKey() . '_';
  347.                     $entity = new $this->models['item']();
  348.                     $entity->setFacility($this->facility);
  349.                     $builder $builders[$alias];
  350.                     $repo $em->getRepository($this->models['item']);
  351.                     if($buttonAction === 'preview'){
  352.                         if ($alias !== $active_language) {
  353.                             continue;
  354.                         }
  355.                         $defaults = [
  356.                             'language' => $language,
  357.                             'parentEntity' => $parentEntity,
  358.                             'alias' => $alias,
  359.                         ];
  360.                         // プレビューの作成
  361.                         $preview $this->duplicateEntity($entity);
  362.                         $preview->setRevisionParent(null);
  363.                         $preview->setPostType('preview');
  364.                         $this->setLanguageEntityDefault($preview$defaults);
  365.                         $blocks2 array_map(function($block){
  366.                             return clone $block;
  367.                         }, $builder->getBlocks());
  368.                         $builder->setBlocks($blocks2);
  369.                         $builder->commit(OnCommitEvent::MODE_PREVIEW);
  370.                         $formData $builder->getData();
  371.                         $formData $this->filterFormDataLanguage($formData'new'$prefix);
  372.                         $preview->bindFormData($formData);
  373.                         $token $this->generateAccessToken();
  374.                         $preview->setAccessToken($token);
  375.                         $this->save($em$preview$formDataself::SAVE_MODE_PREVIEW);
  376.                         $facility $preview->getFacility();
  377.                         if($this->entity_settings->isRevisable()){
  378.                             $previewParams = [
  379.                                 'id' => $preview->getId()
  380.                             ];
  381.                             if($facility){
  382.                                 $previewParams['facility'] = $facility->getCode();
  383.                             }
  384.                             $preview_url $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params$previewParams));
  385.                         } else {
  386.                             $previewParams = [
  387.                                 'preview_id' => $preview->getId(),
  388.                                 'cms_token' => $token,
  389.                                 'cms_mode' => 'tmp_preview',
  390.                                 '_locale' => $preview->getLanguageAlias()
  391.                             ];
  392.                             if($facility){
  393.                                 $previewParams['facility'] = $facility->getCode();
  394.                             }
  395.                             $preview_url $this->getPreviewPageUrl($facility$preview->getId(), $previewParams);
  396.                         }
  397.                     } else {
  398.                         $builder->commit();
  399.                         $formData $builder->getData();
  400.                         $formData $this->filterFormDataLanguage($formData'new'$prefix);
  401.                         // 項目がない場合は日本語の入力値をセットする
  402.                         if ($parentEntity) {
  403.                             $this->setEntityParentLanguage($entity$parentEntity$this->form_class);
  404.                         }
  405.                         $entity->bindFormData($formData);
  406.                         $post_type = ('draft' === $buttonAction) ? 'master:draft' 'master';
  407.                         $max = (method_exists($entity'getSortNum')) ? $repo->getMaxSortNumForLanguage($language$isParent) : 0;
  408.                         $defaults = [
  409.                             'max' => $max,
  410.                             'buttonAction' => $buttonAction,
  411.                             'language' => $language,
  412.                             'parentEntity' => $parentEntity,
  413.                             'alias' => $alias,
  414.                             'selected_languages' => $selected_languages
  415.                         ];
  416.                         $this->setLanguageEntityDefault($entity$defaults);
  417.                         if(method_exists($entity'setPostType')){
  418.                             if($approval_required && 'master' === $post_type){
  419.                                 $post_type 'master:unapproved';
  420.                             }
  421.                             $entity->setPostType($post_type);
  422.                         }
  423.                         $this->save($em$entity$formDataself::SAVE_MODE_NEW, [
  424.                             'builder' => $builder,
  425.                             'language' => $language
  426.                         ]);
  427.                         $this->saveMediaUsages($entity);
  428.                         if ($isParent) {
  429.                             $parentEntity $entity;
  430.                         }
  431.                         if ($this->entity_settings->isRevisable()) {
  432.                             $revision $this->generateRevision($entity);
  433.                             $revision->setPostType('revision');
  434.                             if (is_null($revisionParentEntity)) {
  435.                                 $revision->setLanguageParent(null);
  436.                                 $revisionParentEntity $revision;
  437.                             }
  438.                             else {
  439.                                 $revision->setLanguageParent($revisionParentEntity->getId());
  440.                             }
  441.                             $em->persist($revision);
  442.                             $em->flush();
  443.                             if($approval_required && $revision && $language->getAlias() === $default_lang){
  444.                                 $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_CREATE$this->getUser());
  445.                                 $approval_request->setFacility($this->facility);
  446.                                 $em->persist($approval_request);
  447.                                 $em->flush();
  448.                                 $this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
  449.                             }
  450.                         }
  451.                     }
  452.                 }
  453.                 if('preview' !== $buttonAction) {
  454.                     $flash_message $translator->trans('message.entry_saved', [], 'admin');
  455.                     $this->addFlash('success'$flash_message);
  456.                     if ($settings->get('single'false)) {
  457.                         return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
  458.                             'facility' => $facility,
  459.                             'id' => ($parentEntity) ? $parentEntity->getId() : $entity->getId(),
  460.                             'disable_redirect_suggestion' => true
  461.                         ]));
  462.                     } else {
  463.                         return $this->redirect($this->base_path);
  464.                     }
  465.                 }
  466.             }
  467.         }
  468.         return $this->render($this->views['multilingual_edit'], [
  469.             'meta' => $this->meta('NEW'),
  470.             '_languages' => $languages,
  471.             'selected_languages' => $selected_languages,
  472.             'active_language' => $active_language,
  473.             'violations' => $violations,
  474.             'builders' => $builders,
  475.             'preview_url' => $preview_url,
  476.             'redirect_url' => null,
  477.             'redirect_message' => null,
  478.             'entity' => null,
  479.             'master_entity' => null,
  480.             'post_type' => null,
  481.             'approval_required' => $approval_required,
  482.             'revisions' => [],
  483.             'revision_history' => [],
  484.             'approval_history' => [],
  485.             'button_sections' => isset($this->button_sections['new']) ? $this->button_sections['new'] : [],
  486.             '_pageBuilderParams' => $_pageBuilderParams,
  487.             '_routes' => $this->routes,
  488.             '_base_route_params' => $this->base_route_params,
  489.             'languages_heading' => $languageHeading
  490.         ]);
  491.     }
  492.     /**
  493.      * @param Request $request
  494.      * @param $facility
  495.      * @param $id
  496.      * @return RedirectResponse|Response
  497.      */
  498.     public function editAction(Request $request$facility$id)
  499.     {
  500.         $translator $this->container->get('translator');
  501.         $settings $this->entity_settings;
  502.         if ($this->entity_settings->isMultilingual()) {
  503.             return $this->multiLingualEditAction($request$facility$id);
  504.         }
  505.         $em $this->getDoctrine()->getManager();
  506.         $repo $this->getDoctrine()->getRepository($this->models['item']);
  507.         // new でも見えるようにフィルターを外す
  508.         $filters $em->getFilters();
  509.         if($filters->isEnabled('post_type')){
  510.             $filters->disable('post_type');
  511.             $entity $this->findEntity($id);
  512.             $filters->enable('post_type');
  513.         } else {
  514.             $entity $this->findEntity($id);
  515.         }
  516.         if (!$entity) {
  517.             throw new NotFoundHttpException();
  518.         }
  519.         $master_entity $entity;
  520.         if($this->isGranted('approval_request_edit')){
  521.             $approval_required false;
  522.         } else {
  523.             $approval_required $settings->get('approval_required'false);
  524.         }
  525.         $preview_url null;
  526.         $redirect_url null;
  527.         $redirect_message null;
  528.         $post_type method_exists($entity'getPostType') ? $entity->getPostType() : 'master';
  529.         $suggestion_disabled $request->query->getBoolean('disable_redirect_suggestion'false);
  530.         if($settings->isRevisable()){
  531.             $master_entity $repo->findMasterEntity($entity);
  532.             $revisions $this->getRevisions($entity);
  533.             $revision_history $this->getRevisionHistory($entity);
  534.             if($settings->get('approval_required'false)) {
  535.                 $approval_history $this->getApprovalHistory($master_entity);
  536.             } else {
  537.                 $approval_history = [];
  538.             }
  539.             if(!$suggestion_disabled) {
  540.                 // 新しいリビジョンがあるか調べる
  541.                 foreach ($revision_history as $value) {
  542.                     if ($value['version'] > $master_entity->getRevisionVersion() && $entity->getId() !== $value['id']) {
  543.                         $redirect_url $value['edit_url'];
  544.                         $redirect_message '新しい項目があります。表示を切り替えますか?';
  545.                         break;
  546.                     }
  547.                 }
  548.                 // 新しい下書きがあるか調べる
  549.                 foreach ($revisions as $revision) {
  550.                     if ('draft' === $revision->getPostType() && $revision->getRevisionVersion() > $entity->getRevisionVersion() && $entity->getId() !== $revision->getId()) {
  551.                         $redirect_url $this->get('router')->generate($this->routes['edit'], array_merge($this->base_route_params, [
  552.                             'facility' => $facility'id' => $revision->getId(),
  553.                             'disable_redirect_suggestion' => 1
  554.                         ]));
  555.                         $redirect_message '編集中の下書きがあります。表示を切り替えますか?';
  556.                         break;
  557.                     }
  558.                 }
  559.             }
  560.             /** @var ButtonSection $topRightButtons */
  561.             $topRightButtons $this->button_sections['edit']['top_right'];
  562.             if($this->entity_settings->get('revisable'false)) {
  563.                 $topRightButtons->addButton('revision_history''<i class="fa fa-history" aria-hidden="true"></i> 変更履歴', [
  564.                     'id' => 'btn-revision-history',
  565.                     'class' => 'btn btn-default',
  566.                     'href' => '#revision-history-modal',
  567.                     'data-toggle' => 'modal',
  568.                     'data-target' => '#revision-history-modal'
  569.                 ], 1000);
  570.             }
  571.             if($this->entity_settings->get('approval_required'false)) {
  572.                 $topRightButtons->addButton('approval_history''<i class="fa fa-check-circle" aria-hidden="true"></i> 承認履歴', [
  573.                     'id' => 'btn-approval-history',
  574.                     'class' => 'btn btn-default',
  575.                     'href' => '#approval-history-modal',
  576.                     'data-toggle' => 'modal',
  577.                     'data-target' => '#approval-history-modal'
  578.                 ]);
  579.             }
  580.         } else {
  581.             $revisions = [];
  582.             $revision_history = [];
  583.             $approval_history = [];
  584.         }
  585.         $buttonAction $request->request->get('_button_action''default');
  586.         $builder $this->createPageBuilder($this->form_class$entity'edit');
  587.         $this->pageBuilderOnLoad($builder);
  588.         if ($request->isMethod('post')) {
  589.             $referer $request->headers->get('referer');
  590.             $builder->initMediaUsageTracker();
  591.             $violations $builder->handleRequest($request);
  592.             // エラーがないとき
  593.             if(empty($violations)){
  594.                 if($buttonAction === 'preview'){
  595.                     $previews $repo->findChildRevisions($entity, ['preview']);
  596.                     if($previews){
  597.                         $preview $previews[0];
  598.                     } else {
  599.                         // プレビューの作成
  600.                         $preview $this->duplicateEntity($entity);
  601.                         $preview->setRevisionParent($entity->getId());
  602.                         $preview->setPostType('preview');
  603.                     }
  604.                     $token $this->generateAccessToken();
  605.                     $blocks2 array_map(function($block){
  606.                         return clone $block;
  607.                     }, $builder->getBlocks());
  608.                     $builder->setBlocks($blocks2);
  609.                     $builder->commit(OnCommitEvent::MODE_PREVIEW);
  610.                     $formData $builder->getData();
  611.                     $formData $this->filterFormData($formData'edit');
  612.                     $preview->bindFormData($formData);
  613.                     $preview->setAccessToken($token);
  614.                     $this->save($em$preview$formDataself::SAVE_MODE_PREVIEW);
  615.                     $facility $preview->getFacility();
  616.                     if($this->entity_settings->isRevisable()) {
  617.                         $previewParams = [
  618.                             'id' => $preview->getId()
  619.                         ];
  620.                         if($facility){
  621.                             $previewParams['facility'] = $facility->getCode();
  622.                         }
  623.                         $preview_url $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params$previewParams));
  624.                     } else {
  625.                         $previewParams = [
  626.                             'preview_id' => $preview->getId(),
  627.                             'cms_token' => $token,
  628.                             'cms_mode' => 'tmp_preview'
  629.                         ];
  630.                         $preview_url $this->getPreviewPageUrl($facility$preview->getId(), $previewParams);
  631.                     }
  632.                 } else {
  633.                     $revisionParent null;
  634.                     $revision null;
  635.                     $targetEntity $entity;
  636.                     if ($this->entity_settings->isRevisable()) {
  637.                         $blocks2 array_map(function($block){
  638.                             return clone $block;
  639.                         }, $builder->getBlocks());
  640.                         $builder->setBlocks($blocks2);
  641.                         $builder->commit(OnCommitEvent::MODE_REVISION);
  642.                         $formData $builder->getData();
  643.                         $formData $this->filterFormData($formData'edit');
  644.                         // 一度もリビジョンが作られていない場合
  645.                         if(=== $repo->countRevisions($entity) && 'draft' !== $entity->getPostType()){
  646.                             $firstRevision $this->generateRevision($entity);
  647.                             $firstRevision->setPostType('revision');
  648.                             $em->persist($firstRevision);
  649.                         }
  650.                         // 更新
  651.                         $revision $this->generateRevision($entity);
  652.                         $revision->setPostType(('draft' === $buttonAction) ? 'draft' 'revision');
  653.                         $maxVersion = (int)$repo->getMaxRevisionVersion($entity);
  654.                         $revision->setRevisionVersion($maxVersion 1);
  655.                         $em->persist($revision);
  656.                         $targetEntity $revision;
  657.                         // 不要になった下書きを削除
  658.                         $drafts = ($master_entity) ? $this->getRelatedDrafts($master_entity) : [];
  659.                         foreach ($drafts as $draft) {
  660.                             if($targetEntity->getId() === $draft->getId()){
  661.                                 continue;
  662.                             }
  663.                             $em->remove($draft);
  664.                         }
  665.                     } else {
  666.                         $builder->commit();
  667.                         $formData $builder->getData();
  668.                         $formData $this->filterFormData($formData'edit');
  669.                     }
  670.                     if (method_exists($targetEntity'setLanguageAlias')) {
  671.                         $default_lang $this->container->getParameter('language.default''jp');
  672.                         $targetEntity->setLanguageAlias($default_lang);
  673.                     }
  674.                     if (method_exists($targetEntity'setLanguageActive')) {
  675.                         $targetEntity->setLanguageActive(true);
  676.                     }
  677.                     $targetEntity->bindFormData($formData);
  678.                     $flash_message $translator->trans('message.entry_saved', [], 'admin');
  679.                     $this->save($em$targetEntity$formDataself::SAVE_MODE_EDIT);
  680.                     if ($this->entity_settings->isRevisable() && $revision) {
  681.                         $approval_request null;
  682.                         if('draft' === $buttonAction){
  683.                             // 下書きの再編集
  684.                             if('master:draft' === $master_entity->getPostType()){
  685.                                 $this->applyRevision($master_entity$revision);
  686.                             }
  687.                         } else {
  688.                             if($approval_required){
  689.                                 if('master:draft' === $master_entity->getPostType()){
  690.                                     $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_CREATE$this->getUser());
  691.                                 } else {
  692.                                     $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_UPDATE$this->getUser());
  693.                                 }
  694.                                 $approval_request->setFacility($this->facility);
  695.                                 $em->persist($approval_request);
  696.                                 // 下書き、または承認前なら即時反映
  697.                                 if(in_array($master_entity->getPostType(), ['master:draft''master:unapproved''master:rejected'])){
  698.                                     $this->applyRevision($master_entity$revision);
  699.                                     $master_entity->setPostType('master:unapproved');
  700.                                 }
  701.                             } else {
  702.                                 if (in_array($master_entity->getPostType(), ['master:draft''master:unapproved''master:rejected'])) {
  703.                                     $master_entity->setPostType('master');
  704.                                 }
  705.                                 $this->applyRevision($master_entity$revision);
  706.                                 $this->cancelRelatedApprovalRequests($master_entity);
  707.                             }
  708.                         }
  709.                         $em->flush();
  710.                         if($approval_request){
  711.                             $this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
  712.                         }
  713.                         $this->saveMediaUsages($revision);
  714.                     }
  715.                     $this->saveMediaUsages($master_entity);
  716.                     $this->addFlash('success'$flash_message);
  717.                     if($settings->get('single'false)){
  718.                         return $this->redirectToRoute($this->routes['edit'], [
  719.                             'facility' => $facility,
  720.                             'id' => $targetEntity->getId(),
  721.                             'disable_redirect_suggestion' => true
  722.                         ]);
  723.                     } else {
  724.                         return $this->redirect($this->base_path);
  725.                     }
  726.                 }
  727.             }
  728.         }
  729.         if('' !== (string)$preview_url){
  730.             $redirect_url null;
  731.             $redirect_message null;
  732.         }
  733.         return $this->render($this->views['edit'], [
  734.             'meta' => $this->meta('EDIT'),
  735.             'builder' => $builder,
  736.             'preview_url' => $preview_url,
  737.             'redirect_url' => $redirect_url,
  738.             'redirect_message' => $redirect_message,
  739.             'entity' => $entity,
  740.             'master_entity' => $master_entity,
  741.             'post_type' => $post_type,
  742.             'approval_required' => $approval_required,
  743.             'revisions' => $revisions,
  744.             'revision_history' => $revision_history,
  745.             'approval_history' => $approval_history,
  746.             'drafts' => [],
  747.             'button_sections' => isset($this->button_sections['edit']) ? $this->button_sections['edit'] : [],
  748.             '_pageBuilderParams' => $builder->getSharedParams(),
  749.             '_routes' => $this->routes,
  750.             '_base_route_params' => $this->base_route_params,
  751.         ]);
  752.     }
  753.     public function multiLingualEditAction(Request $request$facility$id)
  754.     {
  755.         $this->get('app.helper.script_loader')
  756.             ->register('language_edit'CMS__ADMIN_PATH 'js/pages/language-edit.js');
  757.         $translator $this->container->get('translator');
  758.         $settings $this->entity_settings;
  759.         $languages $this->getMasterLanguages();
  760.         $em $this->getDoctrine()->getManager();
  761.         $repo $this->getDoctrine()->getRepository($this->models['item']);
  762.         $default_lang $this->container->getParameter('language.default''jp');
  763.         $languageHeading $this->getLanguagesHeading($languages);
  764.         $revision_parent $request->query->get('revision_parent'null);
  765.         if (empty($revision_parent)) {
  766.             $revision_parent $id;
  767.         }
  768.         $revision_lang $request->query->get('revision_lang'null);
  769.         $active_language $request->request->get('_active-language'null);
  770.         if (!empty($revision_lang)) {
  771.             $active_language $revision_lang;
  772.         }
  773.         // new でも見えるようにフィルターを外す
  774.         /** @var FilterCollection $filters */
  775.         $filters $em->getFilters();
  776.         if($filters->isEnabled('post_type')){
  777.             $postTypeFilter $filters->getFilter('post_type');
  778.             $postTypeFilter->saveState();
  779.             $postTypeFilter->deactivate();
  780.         } else {
  781.             $postTypeFilter null;
  782.         }
  783.         $entities $repo->getEntitiesForLanguage($id$revision_parent$revision_lang);
  784.         $trunk $repo->findTrunkLanguageEntry($id$default_lang);
  785.         if($postTypeFilter){
  786.             $postTypeFilter->restoreState();
  787.         }
  788.         $defaultSelected = [];
  789.         foreach ($entities as $k => $entity) {
  790.             if ($entity->isLanguageActive()) {
  791.                 $defaultSelected[] = $k;
  792.             }
  793.         }
  794.         $selected_languages $request->request->get('select_lang'$defaultSelected);
  795.         if (!is_null($active_language) && !in_array($active_language$selected_languages)) {
  796.             $selected_languages[] = $active_language;
  797.         }
  798.         $master_entity $trunk;
  799.         if($this->isGranted('approval_request_edit')){
  800.             $approval_required false;
  801.         } else {
  802.             $approval_required $settings->get('approval_required'false);
  803.         }
  804.         $violations = [];
  805.         // 言語ごとのbuilderを設定
  806.         $builders $this->createPageBuilderLanguages($languages$entities'edit');
  807.         $preview_url null;
  808.         $redirect_url null;
  809.         $redirect_message null;
  810.         $post_type null;
  811.         $suggestion_disabled $request->query->getBoolean('disable_redirect_suggestion'false);
  812.         $revisions = [];
  813.         $first_entity = isset($entities[$active_language]) ? $entities[$active_language] : reset($entities);
  814.         if($settings->isRevisable()) {
  815.             $master_entity = ($trunk) ? $repo->findMasterEntity($trunk) : null;
  816.             $revision_history $this->getRevisionHistory($trunk);
  817.             if($settings->get('approval_required'false)) {
  818.                 $approval_history $this->getApprovalHistory($trunk);
  819.             } else {
  820.                 $approval_history = [];
  821.             }
  822.             if(!$suggestion_disabled) {
  823.                 // 新しい下書きがあるか調べる
  824.                 foreach ($revisions as $revision) {
  825.                     if ('draft' === $revision->getPostType() && $revision->getRevisionVersion() > $entity->getRevisionVersion() && $entity->getId() !== $revision->getId()) {
  826.                         $redirect_url $this->get('router')->generate($this->routes['edit'], array_merge($this->base_route_params, [
  827.                             'facility' => $facility'id' => $revision->getId(),
  828.                             'disable_redirect_suggestion' => 1
  829.                         ]));
  830.                         $redirect_message '編集中の下書きがあります。表示を切り替えますか?';
  831.                         break;
  832.                     }
  833.                 }
  834.                 // 新しいリビジョンがあるか調べる
  835.                 foreach ($revision_history as $value) {
  836.                     if ($value['version'] > $master_entity->getRevisionVersion() && $entity->getId() !== $value['id']) {
  837.                         $redirect_url $value['edit_url'];
  838.                         $redirect_message '新しい項目があります。表示を切り替えますか?';
  839.                         break;
  840.                     }
  841.                 }
  842.             }
  843.             /** @var ButtonSection $topRightButtons */
  844.             $topRightButtons $this->button_sections['edit']['top_right'];
  845.             if($this->entity_settings->get('revisable'false)) {
  846.                 $topRightButtons->addButton('revision_history''<i class="fa fa-history" aria-hidden="true"></i> 変更履歴', [
  847.                     'id' => 'btn-revision-history',
  848.                     'class' => 'btn btn-default',
  849.                     'href' => '#revision-history-modal',
  850.                     'data-toggle' => 'modal',
  851.                     'data-target' => '#revision-history-modal'
  852.                 ], 1000);
  853.             }
  854.             if($this->entity_settings->get('approval_required'false)) {
  855.                 $topRightButtons->addButton('approval_history''<i class="fa fa-check-circle" aria-hidden="true"></i> 承認履歴', [
  856.                     'id' => 'btn-approval-history',
  857.                     'class' => 'btn btn-default',
  858.                     'href' => '#approval-history-modal',
  859.                     'data-toggle' => 'modal',
  860.                     'data-target' => '#approval-history-modal'
  861.                 ]);
  862.             }
  863.         } else {
  864.             $revisions = [];
  865.             $revision_history = [];
  866.             $approval_history = [];
  867.         }
  868.         $buttonAction $request->request->get('_button_action''default');
  869.         $_pageBuilderParams = [];
  870.         foreach ($builders as $builder) {
  871.             $_pageBuilderParams += $builder->getSharedParams();
  872.         }
  873.         if ($request->isMethod('post')) {
  874.             $violations $this->validateLanguages($request$builders$selected_languages$buttonAction);
  875.             if (empty($violations)) {
  876.                 // 不足言語分のEntityを先に作成
  877.                 foreach ($languages as $language) {
  878.                     $formData = [];
  879.                     $alias $language->getAlias();
  880.                     if (!isset($entities[$alias])) {
  881.                         $entity = new $this->models['item']();
  882.                         if (method_exists($entity'setFacility')) {
  883.                             $entity->setFacility($this->facility);
  884.                         }
  885.                         $max = (method_exists($entity'getSortNum')) ? $repo->getMaxSortNumForLanguage($language$language->isParent()) : 0;
  886.                         $defaults = [
  887.                             'max' => $max,
  888.                             'buttonAction' => $buttonAction,
  889.                             'language' => $language,
  890.                             'parentEntity' => $entities[$default_lang],
  891.                             'alias' => $alias,
  892.                             'selected_languages' => []
  893.                         ];
  894.                         $this->setLanguageEntityDefault($entity$defaults);
  895.                         $entity->bindFormData($formData);
  896.                         $em->persist($entity);
  897.                         $em->flush();
  898.                         $entities[$alias] = $entity;
  899.                     }
  900.                 }
  901.                 $parentEntity null;
  902.                 $parentMasterEntity null;
  903.                 $parentFirstRevisionEntity null;
  904.                 /** @var Language $language */
  905.                 foreach ($languages as $language) {
  906.                     $alias $language->getAlias();
  907.                     $isParent $language->isParent();
  908.                     $prefix $language->getTranslateKey() . '_';
  909.                     $builder $builders[$alias];
  910.                     $builder->initMediaUsageTracker();
  911.                     $entity $entities[$alias];
  912.                     if ($buttonAction === 'preview') {
  913.                         if ($alias !== $active_language) {
  914.                             continue;
  915.                         }
  916.                         $previews $repo->findChildRevisions($entity, ['preview']);
  917.                         if($previews){
  918.                             $preview $previews[0];
  919.                         } else {
  920.                             // プレビューの作成
  921.                             $preview $this->duplicateEntity($entity);
  922.                             $preview->setPostType('preview');
  923.                         }
  924.                         $preview->setRevisionParent($entity->getId());
  925.                         $token $this->generateAccessToken();
  926.                         $defaults = [
  927.                             'language' => $language,
  928.                             'parentEntity' => $parentEntity,
  929.                             'alias' => $alias,
  930.                         ];
  931.                         $this->setLanguageEntityDefault($preview$defaults);
  932.                         $blocks2 array_map(function($block){
  933.                             return clone $block;
  934.                         }, $builder->getBlocks());
  935.                         $builder->setBlocks($blocks2);
  936.                         $builder->commit(OnCommitEvent::MODE_PREVIEW);
  937.                         $formData $builder->getData();
  938.                         $formData $this->filterFormDataLanguage($formData'edit'$prefix);
  939.                         $formData $this->filterFormData($formData'edit');
  940.                         $preview->bindFormData($formData);
  941.                         $preview->setAccessToken($token);
  942.                         $this->save($em$preview$formDataself::SAVE_MODE_PREVIEW);
  943.                         $facility $preview->getFacility();
  944.                         if($this->entity_settings->isRevisable()) {
  945.                             $previewParams = [
  946.                                 'id' => $preview->getId()
  947.                             ];
  948.                             if($facility){
  949.                                 $previewParams['facility'] = $facility->getCode();
  950.                             }
  951.                             $preview_url $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params$previewParams));
  952.                         } else {
  953.                             $previewParams = [
  954.                                 'preview_id' => $preview->getId(),
  955.                                 'cms_token' => $token,
  956.                                 'cms_mode' => 'tmp_preview',
  957.                                 '_locale' => $preview->getLanguageAlias()
  958.                             ];
  959.                             $preview_url $this->getPreviewPageUrl($facility$preview->getId(), $previewParams);
  960.                         }
  961.                     } else {
  962.                         $revisionParent null;
  963.                         $revision null;
  964.                         $targetEntity $entity;
  965.                         if ($this->entity_settings->isRevisable()) {
  966.                             $blocks2 array_map(function($block){
  967.                                 return clone $block;
  968.                             }, $builder->getBlocks());
  969.                             $builder->setBlocks($blocks2);
  970.                             $builder->commit(OnCommitEvent::MODE_REVISION);
  971.                             $formData $builder->getData();
  972.                             $formData $this->filterFormDataLanguage($formData'edit'$prefix);
  973.                             $languageMaster $repo->findMasterEntity($entity);
  974.                             $parentId $entity->getRevisionParent();
  975.                             $revisionParent = ($parentId) ? $repo->findRevision($parentId) : null;
  976.                             if ('draft' === $entity->getPostType()) {
  977.                                 $targetEntity $entity;
  978.                                 if($revisionParent){
  979.                                     // 既存下書き
  980.                                     $revision $entity;
  981.                                     $revision->setPostType(('draft' === $buttonAction) ? 'draft' 'revision');
  982.                                 } else {
  983.                                     // 新規下書き
  984.                                     $targetEntity->setPostType(('draft' === $buttonAction) ? 'draft' 'master');
  985.                                 }
  986.                             } else {
  987.                                 // 一度もリビジョンが作られていない場合
  988.                                 if(=== $repo->countRevisions($entity) && 'draft' !== $entity->getPostType()){
  989.                                     $firstRevision $this->generateRevision($entity);
  990.                                     $firstRevision->setPostType('revision');
  991.                                     if (is_null($parentFirstRevisionEntity)) {
  992.                                         $firstRevision->setLanguageParent(null);
  993.                                         $parentFirstRevisionEntity $firstRevision;
  994.                                     }
  995.                                     else {
  996.                                         $firstRevision->setLanguageParent($parentFirstRevisionEntity->getId());
  997.                                     }
  998.                                     $em->persist($firstRevision);
  999.                                 }
  1000.                                 // 更新
  1001.                                 $revision $this->generateRevision($entity);
  1002.                                 $revision->setPostType(('draft' === $buttonAction) ? 'draft' 'revision');
  1003.                                 $maxVersion = (int)$repo->getMaxRevisionVersion($entity);
  1004.                                 $revision->setRevisionVersion($maxVersion 1);
  1005.                                 $em->persist($revision);
  1006.                                 $targetEntity $revision;
  1007.                             }
  1008.                             // 不要になった下書きを削除
  1009.                             $drafts = ($languageMaster) ? $this->getRelatedDrafts($languageMaster) : [];
  1010.                             foreach ($drafts as $draft) {
  1011.                                 if($targetEntity->getId() === $draft->getId()){
  1012.                                     continue;
  1013.                                 }
  1014.                                 $em->remove($draft);
  1015.                             }
  1016.                         } else {
  1017.                             $languageMaster $entity;
  1018.                             $builder->commit();
  1019.                             $formData $builder->getData();
  1020.                             $formData $this->filterFormDataLanguage($formData'edit'$prefix);
  1021.                         }
  1022.                         if ($parentEntity) {
  1023.                             $this->setEntityParentLanguage($targetEntity$parentEntity$this->form_class);
  1024.                         }
  1025.                         $targetEntity->bindFormData($formData);
  1026.                         $defaults = [
  1027.                             'language' => $language,
  1028.                             'alias' => $alias,
  1029.                             'selected_languages' => $selected_languages,
  1030.                             'parentEntity' => $parentEntity,
  1031.                         ];
  1032.                         $this->setLanguageEntityDefault($targetEntity$defaults);
  1033.                         $this->save($em$targetEntity$formDataself::SAVE_MODE_EDIT, [
  1034.                             'builder' => $builder,
  1035.                             'language' => $language
  1036.                         ]);
  1037.                         if ($isParent) {
  1038.                             $parentEntity $targetEntity;
  1039.                         }
  1040.                         if ($this->entity_settings->isRevisable() && $revision) {
  1041.                             $approval_request null;
  1042.                             if('draft' === $buttonAction){
  1043.                                 // 下書きの再編集
  1044.                                 if('master:draft' === $languageMaster->getPostType()){
  1045.                                     $this->applyRevision($languageMaster$revision);
  1046.                                 }
  1047.                             } else {
  1048.                                 if($approval_required){
  1049.                                     if($language->getAlias() !== $default_lang){
  1050.                                         $approval_request null;
  1051.                                     } elseif('master:draft' === $master_entity->getPostType()){
  1052.                                         $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_CREATE$this->getUser());
  1053.                                     } else {
  1054.                                         $approval_request $this->createApprovalRequest($revisionApprovalRequest::REQUEST_TYPE_UPDATE$this->getUser());
  1055.                                     }
  1056.                                     if($approval_request) {
  1057.                                         $approval_request->setFacility($this->facility);
  1058.                                         $em->persist($approval_request);
  1059.                                     }
  1060.                                     // 下書き、または承認前なら即時反映
  1061.                                     if(in_array($languageMaster->getPostType(), ['master:draft''master:unapproved''master:rejected'])){
  1062.                                         $this->applyRevision($languageMaster$revision);
  1063.                                         $master_entity->setPostType('master:unapproved');
  1064.                                     }
  1065.                                 } else {
  1066.                                     if (in_array($languageMaster->getPostType(), ['master:draft''master:unapproved''master:rejected'])) {
  1067.                                         $languageMaster->setPostType('master');
  1068.                                     }
  1069.                                     $this->applyRevision($languageMaster$revision);
  1070.                                     $this->cancelRelatedApprovalRequests($languageMaster);
  1071.                                 }
  1072.                             }
  1073.                             $em->flush();
  1074.                             if($approval_request){
  1075.                                 $this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
  1076.                             }
  1077.                             $this->saveMediaUsages($revision);
  1078.                         }
  1079.                     }
  1080.                 }
  1081.                 if ($buttonAction !== 'preview') {
  1082.                     $this->saveMediaUsages($master_entity);
  1083.                     $flash_message $translator->trans('message.entry_saved', [], 'admin');
  1084.                     $this->addFlash('success'$flash_message);
  1085.                     if ($settings->get('single'false)) {
  1086.                         return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
  1087.                             'facility' => $facility,
  1088.                             'id' => $trunk->getId(),
  1089.                             'disable_redirect_suggestion' => true
  1090.                         ]));
  1091.                     } else {
  1092.                         return $this->redirect($this->base_path);
  1093.                     }
  1094.                 }
  1095.             }
  1096.         }
  1097.         if('' !== (string)$preview_url){
  1098.             $redirect_url null;
  1099.             $redirect_message null;
  1100.         }
  1101.         return $this->render($this->views['multilingual_edit'], [
  1102.             'meta' => $this->meta('EDIT'),
  1103.             'builders' => $builders,
  1104.             'preview_url' => $preview_url,
  1105.             'redirect_url' => $redirect_url,
  1106.             'redirect_message' => $redirect_message,
  1107.             '_languages' => $languages,
  1108.             'selected_languages' => $selected_languages,
  1109.             'active_language' => $active_language,
  1110.             'violations' => $violations,
  1111.             'entity' => $first_entity,
  1112.             'master_entity' => $master_entity,
  1113.             'post_type' => $post_type,
  1114.             'approval_required' => $approval_required,
  1115.             'revisions' => $revisions,
  1116.             'revision_history' => $revision_history,
  1117.             'approval_history' => $approval_history,
  1118.             'button_sections' => isset($this->button_sections['edit']) ? $this->button_sections['edit'] : [],
  1119.             '_pageBuilderParams' => $_pageBuilderParams,
  1120.             '_routes' => $this->routes,
  1121.             '_base_route_params' => $this->base_route_params,
  1122.             'revision_parent' => $revision_parent,
  1123.             'languages_heading' => $languageHeading
  1124.         ]);
  1125.     }
  1126.     /**
  1127.      * @param Request $request
  1128.      * @param $facility
  1129.      * @param $id
  1130.      * @return Response
  1131.      */
  1132.     public function detailAction(Request $request$facility$id)
  1133.     {
  1134.         $em $this->getDoctrine()->getManager();
  1135.         /** @var FilterCollection $filters */
  1136.         $filters $em->getFilters();
  1137.         if($filters->isEnabled('post_type')){
  1138.             $filter $filters->getFilter('post_type');
  1139.             $filterState $filter->isActive();
  1140.             $filter->deactivate();
  1141.         } else {
  1142.             $filter null;
  1143.             $filterState false;
  1144.         }
  1145.         $item $this->findOneEntity($this->models['item'], ['id' => $id]);
  1146.         if(!$item){
  1147.             throw $this->createNotFoundException();
  1148.         }
  1149.         if($filterState){
  1150.             $filter->activate();
  1151.         }
  1152.         $builder $this->createPageBuilder($this->form_class$item);
  1153.         $builder->setTheme('browse');
  1154.         return $this->render($this->views['detail'], [
  1155.             'item' => $item,
  1156.             'builder' => $builder,
  1157.             'page_title' => $this->title
  1158.         ]);
  1159.     }
  1160.     /**
  1161.      * @param Request $request
  1162.      * @param $facility
  1163.      * @return RedirectResponse
  1164.      */
  1165.     public function deleteAction(Request $request$facility)
  1166.     {
  1167.         $translator $this->get('translator');
  1168.         $id $request->get('id', -1);
  1169.         $em $this->getDoctrine()->getManager();
  1170.         $repo $this->getDoctrine()->getRepository($this->models['item']);
  1171.         $approval_repo $this->getDoctrine()->getRepository(ApprovalRequest::class);
  1172.         $filters $em->getFilters();
  1173.         if($filters->isEnabled('post_type')){
  1174.             $filters->disable('post_type');
  1175.         }
  1176.         $item $repo->find($id);
  1177.         if($filters->isEnabled('post_type')){
  1178.             $filters->enable('post_type');
  1179.         }
  1180.         if(!$item) throw $this->createNotFoundException();
  1181.         if(method_exists($item'getPostType')){
  1182.             $post_type $item->getPostType();
  1183.         } else {
  1184.             $post_type 'master';
  1185.         }
  1186.         if($this->isGranted('approval_request_edit')){
  1187.             $approval_required false;
  1188.         } else {
  1189.             $approval_required $this->entity_settings->get('approval_required'false);
  1190.         }
  1191.         if('master' === $post_type && $approval_required) {
  1192.             $approval_request $this->createApprovalRequest($itemApprovalRequest::REQUEST_TYPE_DELETE$this->getUser());
  1193.             $approval_request->setFacility($this->facility);
  1194.             $item->autoTimestamps false;
  1195.             $em->persist($approval_request);
  1196.             $em->flush();
  1197.             // フラッシュメッセージ
  1198.             $this->addFlash('success'$translator->trans('approval.message.entry_delete_requested', [], 'admin'));
  1199.             $this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
  1200.         } else {
  1201.             $em->remove($item);
  1202.             $em->flush();
  1203.             // フラッシュメッセージ
  1204.             $this->addFlash('success'$translator->trans('message.entry_deleted', [], 'admin'));
  1205.         }
  1206.         return $this->redirect($this->base_path);
  1207.     }
  1208.     /**
  1209.      *
  1210.      * @param Request $request
  1211.      * @return JsonResponse
  1212.      */
  1213.     public function jsonAction(Request $request)
  1214.     {
  1215.         $data = [];
  1216.         $doctrine $this->getDoctrine();
  1217.         $em $doctrine->getManager();
  1218.         $filters $em->getFilters();
  1219.         // 下書きの表示を許可
  1220.         if($filters->isEnabled('post_type')){
  1221.             $postTypeFilter $filters->getFilter('post_type');
  1222.             $postTypeFilter->setAllowedTypes(['master''master:draft''master:unapproved''master:rejected']);
  1223.         } else {
  1224.             $postTypeFilter null;
  1225.         }
  1226.         $repository $em->getRepository($this->models['item']);
  1227.         $criteria $this->base_criteria $request->query->get('criteria', []);
  1228.         if ($this->entity_settings->isMultilingual()) {
  1229.             // 言語フィルタ設定
  1230.             if (!empty($criteria['language'])) {
  1231.                 $langAlias $criteria['language'];
  1232.             }
  1233.             else {
  1234.                 $langAlias $this->container->getParameter('language.default''jp');
  1235.             }
  1236.             $em $this->getDoctrine()->getManager();
  1237.             $filter $em->getFilters()->enable('language');
  1238.             $filter->setParameter('language'$langAlias);
  1239.             unset($criteria['language']);
  1240.         }
  1241.         // 空の検索条件を除外
  1242.         $criteria array_filter($criteria, function($value){
  1243.             return $value !== '';
  1244.         });
  1245.         $columns $request->query->get('columns');
  1246.         $order $request->query->get('order');
  1247.         if(!empty($order)){
  1248.             $orderBy = [];
  1249.             foreach($order as $value){
  1250.                 $column $columns[$value['column']];
  1251.                 // スネークケースに変換
  1252.                 $field Container::underscore($column['data']);
  1253.                 $orderBy[$field] = $value['dir'];
  1254.             }
  1255.         } else {
  1256.             $orderBy $this->getDefaultOrderBy();
  1257.         }
  1258.         $limit $request->get("length"10);
  1259.         $offset $request->get("start"0);
  1260.         if (-== $limit) {
  1261.             $limit $offset null;
  1262.         }
  1263.         $entities $repository->searchBy($criteria$orderBy$limit$offset);
  1264.         foreach($entities as $entity)
  1265.         {
  1266.             $data[] = $entity->toArray();
  1267.         }
  1268.         $recordsFiltered $repository->countBy($criteria);
  1269.         $recordsTotal $repository->countBy($this->base_criteria);
  1270.         //レスポンス(JSONで返す)
  1271.         return new JsonResponse([
  1272.             'data' => $data,
  1273.             'recordsFiltered' => $recordsFiltered,
  1274.             'recordsTotal' => $recordsTotal,
  1275.         ]);
  1276.     }
  1277.     protected function getListDataTableOptions() {
  1278.         $options $this->getDefaultDataTableOptions();
  1279.         $settings $this->entity_settings;
  1280.         $options["aoColumns"] = [[
  1281.             "sTitle" => "id",
  1282.             "mData" => "id",
  1283.             "visible" => false
  1284.         ]];
  1285.         if ($settings->get('actions.duplicate')) {
  1286.             $options["aoColumns"][] = [
  1287.                 "sTitle" => "",
  1288.                 "orderable" => false,
  1289.                 "mData" => "id",
  1290.                 "width" => "50px",
  1291.                 "sClass" => "center",
  1292.                 "@render" => "function (data, type, row) {
  1293.                     return '<a class=\"btn btn-duplicate btn-sm btn-block\" href=\"" $this->base_path "' + data + '/duplicate/\">複製</a>';
  1294.                 }"
  1295.             ];
  1296.         }
  1297.         $options["aoColumns"] = array_merge($options["aoColumns"], $this->getDatatableColumns());
  1298.         if ($settings->get('uses.public_status')) {
  1299.             $options["aoColumns"][] = [
  1300.                 "sTitle" => "公開状態",
  1301.                 "width" => "120px",
  1302.                 "mData" => "status",
  1303.                 "sClass" => "center",
  1304.                 "@render" => "function (data, type, row) {
  1305.                     return dataTablesShowStatus(data, type, row);
  1306.                 }"
  1307.             ];
  1308.         }
  1309.         if ($settings->get('actions.child')) {
  1310.             $base_route preg_replace("/_children$/"""$settings->get('base_route'));
  1311.             $root $this->generateUrl($base_route, [
  1312.                 'facility' => ($this->facility) ? $this->facility->getCode() : 'master'
  1313.             ]);
  1314.             $options["aoColumns"][] = [
  1315.                 "sTitle" => "",
  1316.                 "mData" => "id",
  1317.                 "sWidth" => "80px",
  1318.                 "sortable" => false,
  1319.                 "@render" => 'function(data){
  1320.                     var url = "' $root '" + data + "/children/";
  1321.                     var html = "<a href=\"" + url + "\" class=\"btn btn-default btn-sm btn-block\">子項目</a>"
  1322.                     return html;
  1323.                 }'
  1324.             ];
  1325.         }
  1326.         if ($settings->get('actions.edit')) {
  1327.             $options["aoColumns"][] = [
  1328.                 "sTitle" => "",
  1329.                 "orderable" => false,
  1330.                 "mData" => "id",
  1331.                 "width" => "50px",
  1332.                 "sClass" => "center",
  1333.                 "@render" => "function (data, type, row) {
  1334.                     var locked = ('undefined' !== typeof row.lockStatus) ? row.lockStatus & parseInt('0100', 2) : false;
  1335.                     if(locked){
  1336.                         return '<a class=\"btn btn-edit btn-sm btn-block disabled\" href=\"javascript:void(0)\">編集</a>';
  1337.                     } else {
  1338.                         return '<a class=\"btn btn-edit btn-sm btn-block\" href=\"" $this->base_path "' + data + '/edit/\">編集</a>';
  1339.                     }
  1340.                 }"
  1341.             ];
  1342.         }
  1343.         //本来は継承先。暫定対応
  1344.         if ($settings->get('actions.preview')) {
  1345.             $options["aoColumns"][] = [
  1346.                 "sTitle" => "",
  1347.                 "orderable" => false,
  1348.                 "mData" => "id",
  1349.                 "width" => "50px",
  1350.                 "sClass" => "center",
  1351.                 "@render" => "function (data, type, row) {
  1352.                     var postType = ('undefined' !== typeof row.postType) ? row.postType : 'master';
  1353.                     if('master' === postType || 'master:unapproved' === postType || 'master:rejected' === postType){
  1354.                         return '<a class=\"btn btn-preview btn-sm btn-block\" target=\"_blank\" href=\"" $this->base_path "' + data + '/preview/\">プレビュ</a>';
  1355.                     } else {
  1356.                         return '<a class=\"btn btn-preview btn-sm btn-block disabled\" href=\"javascript:void(0)\">プレビュ</a>';
  1357.                     }
  1358.                 }"
  1359.             ];
  1360.         }
  1361.         if ($settings->get('actions.delete')) {
  1362.             $options["aoColumns"][] = [
  1363.                 "sTitle" => "",
  1364.                 "orderable" => false,
  1365.                 "mData" => "id",
  1366.                 "width" => "50px",
  1367.                 "sClass" => "center",
  1368.                 "@render" => "function (data, type, row) {
  1369.                     var locked = ('undefined' !== typeof row.lockFlags) ? row.lockFlags & parseInt('1000', 2) : false;
  1370.                     if(locked){
  1371.                         return '<button type=\"button\" class=\"btn btn-delete btn-sm btn-block disabled\" onclick=\"javascript:void(0);\">削除</button>';
  1372.                     } else {
  1373.                         return '<button type=\"button\" class=\"btn btn-delete btn-sm btn-block\" onclick=\"item_delete(\'" $this->base_path "delete/\', ' + data + ')\">削除</button>';
  1374.                     }
  1375.                 }"
  1376.             ];
  1377.         }
  1378.         $options["columnDefs"] = [];
  1379.         $options["buttons"][] = [
  1380.             'text' => '<i class="fa fa-undo"></i> ソートの解除',
  1381.             '@action' => 'function(e, dt, node, config){
  1382.                 dt.order.neutral().draw();
  1383.             }'
  1384.         ];
  1385.         $options['ajax'] = [
  1386.             'url' => $this->base_path 'json/',
  1387.             'dataSrc' => 'data'
  1388.         ];
  1389.         return $options;
  1390.     }
  1391.     /**
  1392.      * @param Request $request
  1393.      * @param $facility
  1394.      * @param $id
  1395.      * @return mixed
  1396.      */
  1397.     public function duplicateAction(Request $request$facility$id)
  1398.     {
  1399.         if($this->isGranted('approval_request_edit')){
  1400.             $approval_required false;
  1401.         } else {
  1402.             $approval_required $this->entity_settings->get('approval_required'false);
  1403.         }
  1404.         if ($this->entity_settings->isMultilingual()) {
  1405.             return $this->multiLingualDuplicateAction($request$facility$id);
  1406.         }
  1407.         $repo $this->getDoctrine()->getRepository($this->models['item']);
  1408.         $em $this->getDoctrine()->getManager();
  1409.         $filters $em->getFilters();
  1410.         $filterState $filters->isEnabled('post_type');
  1411.         if($filterState){
  1412.             $filters->disable('post_type');
  1413.         }
  1414.         $entity $repo->find($id);
  1415.         if(!$entity){
  1416.             throw $this->createNotFoundException();
  1417.         }
  1418.         if($filterState){
  1419.             $filters->enable('post_type');
  1420.         }
  1421.         $clone $this->duplicateEntityWithForm($entity$this->form_class);
  1422.         if(method_exists($clone'getTitle') && method_exists($clone'setTitle')){
  1423.             $clone->setTitle('(複製)' $clone->getTitle());
  1424.         }
  1425.         if(method_exists($clone'setStatus')){
  1426.             $clone->setStatus(0);
  1427.         }
  1428.         if($approval_required){
  1429.             $post_type = (method_exists($clone'getPostType')) ? $clone->getPostType() : 'master';
  1430.             if('master' === $post_type){
  1431.                 $clone->setPostType('master:unapproved');
  1432.             }
  1433.         }
  1434.         if(method_exists($clone'setLatestApprovalRequest')){
  1435.             $clone->setLatestApprovalRequest(null);
  1436.         }
  1437.         $this->save($em$clone, [], self::SAVE_MODE_DUPLICATE);
  1438.         $this->saveMediaUsages($clone);
  1439.         return $this->redirect($this->base_path);
  1440.     }
  1441.     public function multiLingualDuplicateAction(Request $request$facility$id)
  1442.     {
  1443.         $languages $this->getMasterLanguages();
  1444.         $parentLanguage $this->getParentLanguage();
  1445.         $em $this->getDoctrine()->getManager();
  1446.         $repo $this->getDoctrine()->getRepository($this->models['item']);
  1447.         $entities $repo->getEntitiesForLanguage($idnull$parentLanguage->getAlias());
  1448.         $parentEntity null;
  1449.         foreach ($languages as $language) {
  1450.             $langAlias $language->getAlias();
  1451.             $isParent $language->isParent();
  1452.             if (!isset($entities[$langAlias])) {
  1453.                 continue;
  1454.             }
  1455.             $entity $entities[$langAlias];
  1456.             $clone $this->duplicateEntityWithForm($entity$this->form_class);
  1457.             if(method_exists($clone'getTitle') && method_exists($clone'setTitle')){
  1458.                 $title $clone->getTitle();
  1459.                 if (!empty($title)) {
  1460.                     $title = (($isParent) ? '(複製)' '(copy)') . $title;
  1461.                     $clone->setTitle($title);
  1462.                 }
  1463.             }
  1464.             if(method_exists($clone'setStatus')){
  1465.                 $clone->setStatus(0);
  1466.             }
  1467.             if (method_exists($clone'setLanguageParent') && $parentEntity) {
  1468.                 $clone->setLanguageParent($parentEntity->getId());
  1469.             }
  1470.             $this->save($em$clone, [], self::SAVE_MODE_DUPLICATE);
  1471.             if ($isParent) {
  1472.                 $parentEntity $clone;
  1473.             }
  1474.         }
  1475.         return $this->redirect($this->base_path);
  1476.     }
  1477.     /**
  1478.      * 施設を取得する
  1479.      *
  1480.      * @param $code
  1481.      * @return null|object
  1482.      */
  1483.     protected function getFacilityByCode($code)
  1484.     {
  1485.         if(!empty($this->facility)){
  1486.             return $this->facility;
  1487.         } else {
  1488.             $repo $this->getDoctrine()->getRepository(Facility::class);
  1489.             return $repo->findOneBy(['code' => $code]);
  1490.         }
  1491.     }
  1492.     /**
  1493.      * 施設のホームページを取得
  1494.      *
  1495.      * @param $code
  1496.      * @return string
  1497.      */
  1498.     protected function getFacilityHomeUrl($code)
  1499.     {
  1500.         $facility $this->getFacilityByCode($code);
  1501.         if($facility){
  1502.             return rtrim($this->facility->getWebsite(), '/');
  1503.         } else {
  1504.             false;
  1505.         }
  1506.     }
  1507.     protected function findEntity($id)
  1508.     {
  1509.         $user $this->getUser();
  1510.         $entity parent::findEntity($id);
  1511.         $facility $user->getFacility();
  1512.         if($entity && !$user->isAdmin() && $facility){
  1513.             $postFacility $entity->getFacility();
  1514.             if(!is_null($postFacility) && $facility !== $postFacility){
  1515.                 return null;
  1516.             }
  1517.         }
  1518.         return $entity;
  1519.     }
  1520.     protected function meta($mode$id null) {
  1521.         $facility $this->facility;
  1522.         $settings $this->entity_settings;
  1523.         $meta = array();
  1524.         $meta["base"]["title"] = $this->title;
  1525.         if(!empty($this->base_path)){
  1526.             $meta["base"]["path"] = $this->base_path;
  1527.         } elseif($id){
  1528.             $meta["base"]["path"] = $this->container->get('router')
  1529.                 ->generate($this->entity_settings->get('base_route'), ['facility' => ($facility) ? $facility->getCode() : 'master''id' => $id], true);
  1530.         } else {
  1531.             $meta["base"]["path"] = $this->container->get('router')
  1532.                 ->generate($this->entity_settings->get('base_route'), ['facility' => ($facility) ? $facility->getCode() : 'master'], true);
  1533.         }
  1534.         $meta["base"]['route'] = $this->entity_settings->get('base_route');
  1535.         $meta["redirect"] = $this->entity_settings->get('base_route');
  1536.         return $this->baseMeta($mode$meta$id);
  1537.     }
  1538.     protected function createPageBuilder($form$entity null$action 'default'$options = [])
  1539.     {
  1540.         $options['current_facility'] = ($this->facility) ? $this->facility null;
  1541.         return parent::createPageBuilder($form$entity$action$options);
  1542.     }
  1543.     protected function pageBuilderOnLoad(PageBuilder $builder)
  1544.     {
  1545.         if($this->facility){
  1546.             $builder->setSharedParam('facility_code'$this->facility->getCode());
  1547.             $builder->setSharedParam('facility_id'$this->facility->getId());
  1548.         } else {
  1549.             $builder->setSharedParam('facility_code''master');
  1550.             $builder->setSharedParam('facility_id'null);
  1551.         }
  1552.         return parent::pageBuilderOnLoad($builder);
  1553.     }
  1554. }