<?php
namespace AppBundle\Controller\Admin\Base;
use AppBundle\Component\PageBuilder\Event\OnCommitEvent;
use AppBundle\Component\Util\ButtonSection;
use AppBundle\Entity\Approval\ApprovalRequest;
use AppBundle\Entity\Approval\ApprovalRequestCollection;
use AppBundle\Entity\Master\Language;
use AppBundle\Event\Approval\RequestCreatedEvent;
use AppBundle\Event\PageBuilderFormLoadedEvent;
use AppBundle\Event\PageBuilderInitializedEvent;
use AppBundle\Repository\ApprovalRequestRepository;
use Doctrine\ORM\Query\FilterCollection;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\DependencyInjection\Container;
use AppBundle\Controller\Admin\Base\BaseController;
use AppBundle\Component\PageBuilder\PageBuilder;
use AppBundle\Entity\Master\Facility;
use Doctrine\ORM\EntityNotFoundException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class FacilityBaseController extends BaseController {
/** @var Facility */
public $facility = null;
/** @var string */
public $facility_code = 'master';
/**
* @param FilterControllerEvent $event
* @throws EntityNotFoundException
*/
public function before(FilterControllerEvent $event)
{
$request = $event->getRequest();
$facility_code = $request->attributes->get('facility', 'master');
$this->facility_code = $facility_code;
$this->base_route_params['facility'] = $facility_code;
parent::before($event);
// ログイン前に呼ばれる可能性に注意
if ($this->getUser()) {
// 担当外の施設へのアクセスはリダイレクト
$user_facility = $this->getUser()->getFacility();
if ($user_facility && $user_facility->getCode() !== $facility_code) {
$redirect_url = $this->get('router')->generate('admin_facility_home', ['facility' => $user_facility->getCode()]);
$event->setController(function() use ($redirect_url) {
return new RedirectResponse($redirect_url);
});
}
}
// 施設フィルタ設定
$em = $this->getDoctrine()->getManager();
if('master' === $facility_code || is_null($facility_code)){
$facility = null;
$filter = $em->getFilters()->enable('facility');
} else {
$facility = $this->getFacilityByCode($facility_code);
if(!$facility){
throw new EntityNotFoundException('Facility "' . $facility_code . '" not found.');
}
$filter = $em->getFilters()->enable('facility');
$filter->setParameter('facility_id', $facility->getId());
}
$this->facility = $facility;
$this->facility_code = $facility_code;
$this->global->set('facility', $facility);
}
/**
* 施設に応じて入力項目を変更する
*
* @param $builder
* @param $facility_code
* @param $entity
*/
protected function initForm($builder, $facility_code, $entity = null) {}
/**
* @param Request $request
* @param $facility
* @return RedirectResponse|Response
*/
public function indexAction(Request $request, $facility)
{
$settings = $this->entity_settings;
if ($settings->get('single')) {
$entity = $this->findOneEntity($this->models['item'], $this->base_criteria);
$langParent = ($entity && method_exists($entity, 'getLanguageParent')) ? $entity->getLanguageParent() : null;
if($entity && !empty($langParent)){
$entity = $this->findOneEntity($this->models['item'], ['id' => $langParent]);
}
if ($entity) {
return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, ['id' => $entity->getId()]));
} else {
return $this->redirectToRoute($this->routes['new'], $this->base_route_params);
}
}
$data_table_options = $this->getListDataTableOptions();
$criteria = $request->query->get('criteria', []);
if(isset($data_table_options['ajax']['url']) && !empty($criteria)){
$data_table_options['ajax']['url'] = $this->appendParamsToUrl($data_table_options['ajax']['url'],
['criteria' => $criteria]);
}
return $this->render($this->views['index'], [
'meta' => $this->meta('INDEX'),
'data_table_options' => $data_table_options,
'search_form' => $this->buildSearchForm([], [
'criteria' => $criteria
])->createView(),
'entity_settings' => $this->entity_settings,
'button_sections' => isset($this->button_sections['index']) ? $this->button_sections['index'] : [],
]);
}
/**
* @param Request $request
* @return RedirectResponse|Response
*/
public function sortAction(Request $request, $facility)
{
$meta = $this->meta('INDEX');
if ($this->entity_settings->isMultilingual()) {
$languages = $this->getMasterLanguages();
$data = [];
$builder = $this->get('form.factory')
->createNamedBuilder('criteria', Type\FormType::class, $data, [
'csrf_protection' => false
]);
$builder->setMethod('GET');
$form = $builder->getForm();
$langList = [];
foreach ($languages as $language) {
$langList[$language->getTitle()] = $language->getAlias();
}
$form->add('language', Type\ChoiceType::class, [
'label' => '言語:',
'choices' => $langList,
'attr' => [
'class' => 'form-control form-control-inline'
]
]);
$this->view_params->set('search_form', $form->createView());
}
if ($request->isMethod('post')) {
$order = $request->get('order', '');
$idList = preg_split('/,/', $order, -1, \PREG_SPLIT_NO_EMPTY);
$em = $this->getDoctrine()->getManager();
$options = [
'reverse' => false
];
$this->updateOrder($idList, $this->models['item'], $options);
$em->flush();
// フラッシュメッセージ
$this->addFlash('success', $this->title . MSG_SORT_END);
return $this->redirect($this->base_path . 'sort/');
}
$data_table_options = $this->getSortDataTableOptions();
return $this->render($this->views['sort'], [
'meta' => $meta,
'data_table_options' => $data_table_options,
'button_sections' => isset($this->button_sections['sort']) ? $this->button_sections['sort'] : [],
]);
}
/**
* @param Request $request
* @param $facility
* @return RedirectResponse|Response
*/
public function newAction(Request $request, $facility)
{
$settings = $this->entity_settings;
if ($settings->isMultilingual()) {
return $this->multiLingualNewAction($request, $facility);
}
if ($settings->get('single')) {
$entity = $this->findOneEntity($this->models['item'], $this->base_criteria);
$langParent = ($entity && method_exists($entity, 'getLanguageParent')) ? $entity->getLanguageParent() : null;
if($entity && !empty($langParent)){
$entity = $this->findOneEntity($this->models['item'], ['id' => $langParent]);
}
if ($entity) {
return $this->redirectToRoute(
$this->entity_settings->get('base_route') . "_edit",
['facility' => $facility, 'id' => $entity->getId()]
);
}
}
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $settings->get('approval_required', false);
}
$preview_url = null;
$em = $this->getDoctrine()->getManager();
$entity = new $this->models['item']();
$entity->setFacility($this->facility);
$builder = $this->createPageBuilder($this->form_class, null, 'new');
$this->pageBuilderOnLoad($builder);
$buttonAction = $request->request->get('_button_action', 'default');
if ($request->isMethod('post')) {
$referer = $request->headers->get('referer');
$builder->initMediaUsageTracker();
$violations = $builder->handleRequest($request);
// エラーがないとき
if(empty($violations)){
$repo = $em->getRepository($this->models['item']);
$max = (method_exists($entity, 'getSortNum')) ? $repo->getMaxSortNum() : 0;
if($buttonAction === 'preview'){
// プレビューの作成
$preview = $this->duplicateEntity($entity);
$preview->setRevisionParent(null);
$preview->setPostType('preview');
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_PREVIEW);
$formData = $builder->getData();
$formData = $this->filterFormData($formData, 'new');
$preview->bindFormData($formData);
$token = $this->generateAccessToken();
$preview->setAccessToken($token);
$this->save($em, $preview, $formData, self::SAVE_MODE_PREVIEW);
$facility = $preview->getFacility();
if($this->entity_settings->isRevisable()) {
$previewParams = [
'id' => $preview->getId()
];
if($facility){
$previewParams['facility'] = $facility->getCode();
}
$preview_url = $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params, $previewParams));
} else {
$previewParams = [
'preview_id' => $preview->getId(),
'cms_token' => $token,
'cms_mode' => 'tmp_preview'
];
$preview_url = $this->getPreviewPageUrl($facility, $preview->getId(), $previewParams);
}
} else {
$builder->commit();
$formData = $builder->getData();
$formData = $this->filterFormData($formData, 'new');
$entity->bindFormData($formData);
$post_type = ('draft' === $buttonAction) ? 'master:draft' : 'master';
if(method_exists($entity, 'setPostType')){
if($approval_required && 'master' === $post_type){
$post_type = 'master:unapproved';
}
$entity->setPostType($post_type);
}
if(method_exists($entity, 'setSortNum')){
$entity->setSortNum($max + 1);
}
if (method_exists($entity, 'setLanguageAlias')) {
$default_lang = $this->container->getParameter('language.default', 'jp');
$entity->setLanguageAlias($default_lang);
}
if (method_exists($entity, 'setLanguageActive')) {
$entity->setLanguageActive(true);
}
$this->save($em, $entity, $formData, self::SAVE_MODE_NEW, [
'flash_message' => $this->title . MSG_NEW_END
]);
$this->saveMediaUsages($entity);
if ($this->entity_settings->isRevisable()) {
$revision = $this->generateRevision($entity);
$revision->setPostType(('draft' === $buttonAction) ? 'draft' : 'revision');
$em->persist($revision);
$em->flush();
if($approval_required && $revision){
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_CREATE, $this->getUser());
$approval_request->setFacility($this->facility);
$em->persist($approval_request);
$em->flush();
$this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
}
$this->saveMediaUsages($revision);
}
if($settings->get('single', false)){
return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
'facility' => $facility,
'id' => $entity->getId(),
'disable_redirect_suggestion' => true
]));
} else {
return $this->redirect($this->base_path);
}
}
}
}
return $this->render($this->views['edit'], [
'meta' => $this->meta('NEW'),
'builder' => $builder,
'preview_url' => $preview_url,
'redirect_url' => null,
'redirect_message' => null,
'entity' => null,
'master_entity' => null,
'post_type' => null,
'approval_required' => $approval_required,
'revisions' => [],
'revision_history' => [],
'approval_history' => [],
'button_sections' => isset($this->button_sections['new']) ? $this->button_sections['new'] : [],
'_pageBuilderParams' => $builder->getSharedParams(),
'_routes' => $this->routes,
'_base_route_params' => $this->base_route_params,
]);
}
public function multiLingualNewAction(Request $request, $facility)
{
$translator = $this->container->get('translator');
$this->get('app.helper.script_loader')
->register('language-edit', CMS__ADMIN_PATH . 'js/pages/language-edit.js');
$settings = $this->entity_settings;
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $settings->get('approval_required', false);
}
$languages = $this->getMasterLanguages();
$em = $this->getDoctrine()->getManager();
$default_lang = $this->container->getParameter('language.default', 'jp');
$selected_languages = $request->request->get('select_lang', []);
$active_language = $request->request->get('_active-language', null);
$violations = [];
$languageHeading = $this->getLanguagesHeading($languages);
// 言語ごとのbuilderを設定
$builders = $this->createPageBuilderLanguages($languages);
$preview_url = null;
$buttonAction = $request->request->get('_button_action', 'default');
$_pageBuilderParams = [];
foreach ($builders as $builder) {
$_pageBuilderParams += $builder->getSharedParams();
}
if ($request->isMethod('post')) {
$violations = $this->validateLanguages($request, $builders, $selected_languages, $buttonAction);
// エラーなし
if (empty($violations)) {
$parentEntity = null;
$revisionParentEntity = null;
/** @var Language $language */
foreach ($languages as $language) {
$alias = $language->getAlias();
$isParent = $language->isParent();
$prefix = $language->getTranslateKey() . '_';
$entity = new $this->models['item']();
$entity->setFacility($this->facility);
$builder = $builders[$alias];
$repo = $em->getRepository($this->models['item']);
if($buttonAction === 'preview'){
if ($alias !== $active_language) {
continue;
}
$defaults = [
'language' => $language,
'parentEntity' => $parentEntity,
'alias' => $alias,
];
// プレビューの作成
$preview = $this->duplicateEntity($entity);
$preview->setRevisionParent(null);
$preview->setPostType('preview');
$this->setLanguageEntityDefault($preview, $defaults);
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_PREVIEW);
$formData = $builder->getData();
$formData = $this->filterFormDataLanguage($formData, 'new', $prefix);
$preview->bindFormData($formData);
$token = $this->generateAccessToken();
$preview->setAccessToken($token);
$this->save($em, $preview, $formData, self::SAVE_MODE_PREVIEW);
$facility = $preview->getFacility();
if($this->entity_settings->isRevisable()){
$previewParams = [
'id' => $preview->getId()
];
if($facility){
$previewParams['facility'] = $facility->getCode();
}
$preview_url = $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params, $previewParams));
} else {
$previewParams = [
'preview_id' => $preview->getId(),
'cms_token' => $token,
'cms_mode' => 'tmp_preview',
'_locale' => $preview->getLanguageAlias()
];
if($facility){
$previewParams['facility'] = $facility->getCode();
}
$preview_url = $this->getPreviewPageUrl($facility, $preview->getId(), $previewParams);
}
} else {
$builder->commit();
$formData = $builder->getData();
$formData = $this->filterFormDataLanguage($formData, 'new', $prefix);
// 項目がない場合は日本語の入力値をセットする
if ($parentEntity) {
$this->setEntityParentLanguage($entity, $parentEntity, $this->form_class);
}
$entity->bindFormData($formData);
$post_type = ('draft' === $buttonAction) ? 'master:draft' : 'master';
$max = (method_exists($entity, 'getSortNum')) ? $repo->getMaxSortNumForLanguage($language, $isParent) : 0;
$defaults = [
'max' => $max,
'buttonAction' => $buttonAction,
'language' => $language,
'parentEntity' => $parentEntity,
'alias' => $alias,
'selected_languages' => $selected_languages
];
$this->setLanguageEntityDefault($entity, $defaults);
if(method_exists($entity, 'setPostType')){
if($approval_required && 'master' === $post_type){
$post_type = 'master:unapproved';
}
$entity->setPostType($post_type);
}
$this->save($em, $entity, $formData, self::SAVE_MODE_NEW, [
'builder' => $builder,
'language' => $language
]);
$this->saveMediaUsages($entity);
if ($isParent) {
$parentEntity = $entity;
}
if ($this->entity_settings->isRevisable()) {
$revision = $this->generateRevision($entity);
$revision->setPostType('revision');
if (is_null($revisionParentEntity)) {
$revision->setLanguageParent(null);
$revisionParentEntity = $revision;
}
else {
$revision->setLanguageParent($revisionParentEntity->getId());
}
$em->persist($revision);
$em->flush();
if($approval_required && $revision && $language->getAlias() === $default_lang){
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_CREATE, $this->getUser());
$approval_request->setFacility($this->facility);
$em->persist($approval_request);
$em->flush();
$this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
}
}
}
}
if('preview' !== $buttonAction) {
$flash_message = $translator->trans('message.entry_saved', [], 'admin');
$this->addFlash('success', $flash_message);
if ($settings->get('single', false)) {
return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
'facility' => $facility,
'id' => ($parentEntity) ? $parentEntity->getId() : $entity->getId(),
'disable_redirect_suggestion' => true
]));
} else {
return $this->redirect($this->base_path);
}
}
}
}
return $this->render($this->views['multilingual_edit'], [
'meta' => $this->meta('NEW'),
'_languages' => $languages,
'selected_languages' => $selected_languages,
'active_language' => $active_language,
'violations' => $violations,
'builders' => $builders,
'preview_url' => $preview_url,
'redirect_url' => null,
'redirect_message' => null,
'entity' => null,
'master_entity' => null,
'post_type' => null,
'approval_required' => $approval_required,
'revisions' => [],
'revision_history' => [],
'approval_history' => [],
'button_sections' => isset($this->button_sections['new']) ? $this->button_sections['new'] : [],
'_pageBuilderParams' => $_pageBuilderParams,
'_routes' => $this->routes,
'_base_route_params' => $this->base_route_params,
'languages_heading' => $languageHeading
]);
}
/**
* @param Request $request
* @param $facility
* @param $id
* @return RedirectResponse|Response
*/
public function editAction(Request $request, $facility, $id)
{
$translator = $this->container->get('translator');
$settings = $this->entity_settings;
if ($this->entity_settings->isMultilingual()) {
return $this->multiLingualEditAction($request, $facility, $id);
}
$em = $this->getDoctrine()->getManager();
$repo = $this->getDoctrine()->getRepository($this->models['item']);
// new でも見えるようにフィルターを外す
$filters = $em->getFilters();
if($filters->isEnabled('post_type')){
$filters->disable('post_type');
$entity = $this->findEntity($id);
$filters->enable('post_type');
} else {
$entity = $this->findEntity($id);
}
if (!$entity) {
throw new NotFoundHttpException();
}
$master_entity = $entity;
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $settings->get('approval_required', false);
}
$preview_url = null;
$redirect_url = null;
$redirect_message = null;
$post_type = method_exists($entity, 'getPostType') ? $entity->getPostType() : 'master';
$suggestion_disabled = $request->query->getBoolean('disable_redirect_suggestion', false);
if($settings->isRevisable()){
$master_entity = $repo->findMasterEntity($entity);
$revisions = $this->getRevisions($entity);
$revision_history = $this->getRevisionHistory($entity);
if($settings->get('approval_required', false)) {
$approval_history = $this->getApprovalHistory($master_entity);
} else {
$approval_history = [];
}
if(!$suggestion_disabled) {
// 新しいリビジョンがあるか調べる
foreach ($revision_history as $value) {
if ($value['version'] > $master_entity->getRevisionVersion() && $entity->getId() !== $value['id']) {
$redirect_url = $value['edit_url'];
$redirect_message = '新しい項目があります。表示を切り替えますか?';
break;
}
}
// 新しい下書きがあるか調べる
foreach ($revisions as $revision) {
if ('draft' === $revision->getPostType() && $revision->getRevisionVersion() > $entity->getRevisionVersion() && $entity->getId() !== $revision->getId()) {
$redirect_url = $this->get('router')->generate($this->routes['edit'], array_merge($this->base_route_params, [
'facility' => $facility, 'id' => $revision->getId(),
'disable_redirect_suggestion' => 1
]));
$redirect_message = '編集中の下書きがあります。表示を切り替えますか?';
break;
}
}
}
/** @var ButtonSection $topRightButtons */
$topRightButtons = $this->button_sections['edit']['top_right'];
if($this->entity_settings->get('revisable', false)) {
$topRightButtons->addButton('revision_history', '<i class="fa fa-history" aria-hidden="true"></i> 変更履歴', [
'id' => 'btn-revision-history',
'class' => 'btn btn-default',
'href' => '#revision-history-modal',
'data-toggle' => 'modal',
'data-target' => '#revision-history-modal'
], 1000);
}
if($this->entity_settings->get('approval_required', false)) {
$topRightButtons->addButton('approval_history', '<i class="fa fa-check-circle" aria-hidden="true"></i> 承認履歴', [
'id' => 'btn-approval-history',
'class' => 'btn btn-default',
'href' => '#approval-history-modal',
'data-toggle' => 'modal',
'data-target' => '#approval-history-modal'
]);
}
} else {
$revisions = [];
$revision_history = [];
$approval_history = [];
}
$buttonAction = $request->request->get('_button_action', 'default');
$builder = $this->createPageBuilder($this->form_class, $entity, 'edit');
$this->pageBuilderOnLoad($builder);
if ($request->isMethod('post')) {
$referer = $request->headers->get('referer');
$builder->initMediaUsageTracker();
$violations = $builder->handleRequest($request);
// エラーがないとき
if(empty($violations)){
if($buttonAction === 'preview'){
$previews = $repo->findChildRevisions($entity, ['preview']);
if($previews){
$preview = $previews[0];
} else {
// プレビューの作成
$preview = $this->duplicateEntity($entity);
$preview->setRevisionParent($entity->getId());
$preview->setPostType('preview');
}
$token = $this->generateAccessToken();
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_PREVIEW);
$formData = $builder->getData();
$formData = $this->filterFormData($formData, 'edit');
$preview->bindFormData($formData);
$preview->setAccessToken($token);
$this->save($em, $preview, $formData, self::SAVE_MODE_PREVIEW);
$facility = $preview->getFacility();
if($this->entity_settings->isRevisable()) {
$previewParams = [
'id' => $preview->getId()
];
if($facility){
$previewParams['facility'] = $facility->getCode();
}
$preview_url = $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params, $previewParams));
} else {
$previewParams = [
'preview_id' => $preview->getId(),
'cms_token' => $token,
'cms_mode' => 'tmp_preview'
];
$preview_url = $this->getPreviewPageUrl($facility, $preview->getId(), $previewParams);
}
} else {
$revisionParent = null;
$revision = null;
$targetEntity = $entity;
if ($this->entity_settings->isRevisable()) {
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_REVISION);
$formData = $builder->getData();
$formData = $this->filterFormData($formData, 'edit');
// 一度もリビジョンが作られていない場合
if(0 === $repo->countRevisions($entity) && 'draft' !== $entity->getPostType()){
$firstRevision = $this->generateRevision($entity);
$firstRevision->setPostType('revision');
$em->persist($firstRevision);
}
// 更新
$revision = $this->generateRevision($entity);
$revision->setPostType(('draft' === $buttonAction) ? 'draft' : 'revision');
$maxVersion = (int)$repo->getMaxRevisionVersion($entity);
$revision->setRevisionVersion($maxVersion + 1);
$em->persist($revision);
$targetEntity = $revision;
// 不要になった下書きを削除
$drafts = ($master_entity) ? $this->getRelatedDrafts($master_entity) : [];
foreach ($drafts as $draft) {
if($targetEntity->getId() === $draft->getId()){
continue;
}
$em->remove($draft);
}
} else {
$builder->commit();
$formData = $builder->getData();
$formData = $this->filterFormData($formData, 'edit');
}
if (method_exists($targetEntity, 'setLanguageAlias')) {
$default_lang = $this->container->getParameter('language.default', 'jp');
$targetEntity->setLanguageAlias($default_lang);
}
if (method_exists($targetEntity, 'setLanguageActive')) {
$targetEntity->setLanguageActive(true);
}
$targetEntity->bindFormData($formData);
$flash_message = $translator->trans('message.entry_saved', [], 'admin');
$this->save($em, $targetEntity, $formData, self::SAVE_MODE_EDIT);
if ($this->entity_settings->isRevisable() && $revision) {
$approval_request = null;
if('draft' === $buttonAction){
// 下書きの再編集
if('master:draft' === $master_entity->getPostType()){
$this->applyRevision($master_entity, $revision);
}
} else {
if($approval_required){
if('master:draft' === $master_entity->getPostType()){
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_CREATE, $this->getUser());
} else {
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_UPDATE, $this->getUser());
}
$approval_request->setFacility($this->facility);
$em->persist($approval_request);
// 下書き、または承認前なら即時反映
if(in_array($master_entity->getPostType(), ['master:draft', 'master:unapproved', 'master:rejected'])){
$this->applyRevision($master_entity, $revision);
$master_entity->setPostType('master:unapproved');
}
} else {
if (in_array($master_entity->getPostType(), ['master:draft', 'master:unapproved', 'master:rejected'])) {
$master_entity->setPostType('master');
}
$this->applyRevision($master_entity, $revision);
$this->cancelRelatedApprovalRequests($master_entity);
}
}
$em->flush();
if($approval_request){
$this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
}
$this->saveMediaUsages($revision);
}
$this->saveMediaUsages($master_entity);
$this->addFlash('success', $flash_message);
if($settings->get('single', false)){
return $this->redirectToRoute($this->routes['edit'], [
'facility' => $facility,
'id' => $targetEntity->getId(),
'disable_redirect_suggestion' => true
]);
} else {
return $this->redirect($this->base_path);
}
}
}
}
if('' !== (string)$preview_url){
$redirect_url = null;
$redirect_message = null;
}
return $this->render($this->views['edit'], [
'meta' => $this->meta('EDIT'),
'builder' => $builder,
'preview_url' => $preview_url,
'redirect_url' => $redirect_url,
'redirect_message' => $redirect_message,
'entity' => $entity,
'master_entity' => $master_entity,
'post_type' => $post_type,
'approval_required' => $approval_required,
'revisions' => $revisions,
'revision_history' => $revision_history,
'approval_history' => $approval_history,
'drafts' => [],
'button_sections' => isset($this->button_sections['edit']) ? $this->button_sections['edit'] : [],
'_pageBuilderParams' => $builder->getSharedParams(),
'_routes' => $this->routes,
'_base_route_params' => $this->base_route_params,
]);
}
public function multiLingualEditAction(Request $request, $facility, $id)
{
$this->get('app.helper.script_loader')
->register('language_edit', CMS__ADMIN_PATH . 'js/pages/language-edit.js');
$translator = $this->container->get('translator');
$settings = $this->entity_settings;
$languages = $this->getMasterLanguages();
$em = $this->getDoctrine()->getManager();
$repo = $this->getDoctrine()->getRepository($this->models['item']);
$default_lang = $this->container->getParameter('language.default', 'jp');
$languageHeading = $this->getLanguagesHeading($languages);
$revision_parent = $request->query->get('revision_parent', null);
if (empty($revision_parent)) {
$revision_parent = $id;
}
$revision_lang = $request->query->get('revision_lang', null);
$active_language = $request->request->get('_active-language', null);
if (!empty($revision_lang)) {
$active_language = $revision_lang;
}
// new でも見えるようにフィルターを外す
/** @var FilterCollection $filters */
$filters = $em->getFilters();
if($filters->isEnabled('post_type')){
$postTypeFilter = $filters->getFilter('post_type');
$postTypeFilter->saveState();
$postTypeFilter->deactivate();
} else {
$postTypeFilter = null;
}
$entities = $repo->getEntitiesForLanguage($id, $revision_parent, $revision_lang);
$trunk = $repo->findTrunkLanguageEntry($id, $default_lang);
if($postTypeFilter){
$postTypeFilter->restoreState();
}
$defaultSelected = [];
foreach ($entities as $k => $entity) {
if ($entity->isLanguageActive()) {
$defaultSelected[] = $k;
}
}
$selected_languages = $request->request->get('select_lang', $defaultSelected);
if (!is_null($active_language) && !in_array($active_language, $selected_languages)) {
$selected_languages[] = $active_language;
}
$master_entity = $trunk;
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $settings->get('approval_required', false);
}
$violations = [];
// 言語ごとのbuilderを設定
$builders = $this->createPageBuilderLanguages($languages, $entities, 'edit');
$preview_url = null;
$redirect_url = null;
$redirect_message = null;
$post_type = null;
$suggestion_disabled = $request->query->getBoolean('disable_redirect_suggestion', false);
$revisions = [];
$first_entity = isset($entities[$active_language]) ? $entities[$active_language] : reset($entities);
if($settings->isRevisable()) {
$master_entity = ($trunk) ? $repo->findMasterEntity($trunk) : null;
$revision_history = $this->getRevisionHistory($trunk);
if($settings->get('approval_required', false)) {
$approval_history = $this->getApprovalHistory($trunk);
} else {
$approval_history = [];
}
if(!$suggestion_disabled) {
// 新しい下書きがあるか調べる
foreach ($revisions as $revision) {
if ('draft' === $revision->getPostType() && $revision->getRevisionVersion() > $entity->getRevisionVersion() && $entity->getId() !== $revision->getId()) {
$redirect_url = $this->get('router')->generate($this->routes['edit'], array_merge($this->base_route_params, [
'facility' => $facility, 'id' => $revision->getId(),
'disable_redirect_suggestion' => 1
]));
$redirect_message = '編集中の下書きがあります。表示を切り替えますか?';
break;
}
}
// 新しいリビジョンがあるか調べる
foreach ($revision_history as $value) {
if ($value['version'] > $master_entity->getRevisionVersion() && $entity->getId() !== $value['id']) {
$redirect_url = $value['edit_url'];
$redirect_message = '新しい項目があります。表示を切り替えますか?';
break;
}
}
}
/** @var ButtonSection $topRightButtons */
$topRightButtons = $this->button_sections['edit']['top_right'];
if($this->entity_settings->get('revisable', false)) {
$topRightButtons->addButton('revision_history', '<i class="fa fa-history" aria-hidden="true"></i> 変更履歴', [
'id' => 'btn-revision-history',
'class' => 'btn btn-default',
'href' => '#revision-history-modal',
'data-toggle' => 'modal',
'data-target' => '#revision-history-modal'
], 1000);
}
if($this->entity_settings->get('approval_required', false)) {
$topRightButtons->addButton('approval_history', '<i class="fa fa-check-circle" aria-hidden="true"></i> 承認履歴', [
'id' => 'btn-approval-history',
'class' => 'btn btn-default',
'href' => '#approval-history-modal',
'data-toggle' => 'modal',
'data-target' => '#approval-history-modal'
]);
}
} else {
$revisions = [];
$revision_history = [];
$approval_history = [];
}
$buttonAction = $request->request->get('_button_action', 'default');
$_pageBuilderParams = [];
foreach ($builders as $builder) {
$_pageBuilderParams += $builder->getSharedParams();
}
if ($request->isMethod('post')) {
$violations = $this->validateLanguages($request, $builders, $selected_languages, $buttonAction);
if (empty($violations)) {
// 不足言語分のEntityを先に作成
foreach ($languages as $language) {
$formData = [];
$alias = $language->getAlias();
if (!isset($entities[$alias])) {
$entity = new $this->models['item']();
if (method_exists($entity, 'setFacility')) {
$entity->setFacility($this->facility);
}
$max = (method_exists($entity, 'getSortNum')) ? $repo->getMaxSortNumForLanguage($language, $language->isParent()) : 0;
$defaults = [
'max' => $max,
'buttonAction' => $buttonAction,
'language' => $language,
'parentEntity' => $entities[$default_lang],
'alias' => $alias,
'selected_languages' => []
];
$this->setLanguageEntityDefault($entity, $defaults);
$entity->bindFormData($formData);
$em->persist($entity);
$em->flush();
$entities[$alias] = $entity;
}
}
$parentEntity = null;
$parentMasterEntity = null;
$parentFirstRevisionEntity = null;
/** @var Language $language */
foreach ($languages as $language) {
$alias = $language->getAlias();
$isParent = $language->isParent();
$prefix = $language->getTranslateKey() . '_';
$builder = $builders[$alias];
$builder->initMediaUsageTracker();
$entity = $entities[$alias];
if ($buttonAction === 'preview') {
if ($alias !== $active_language) {
continue;
}
$previews = $repo->findChildRevisions($entity, ['preview']);
if($previews){
$preview = $previews[0];
} else {
// プレビューの作成
$preview = $this->duplicateEntity($entity);
$preview->setPostType('preview');
}
$preview->setRevisionParent($entity->getId());
$token = $this->generateAccessToken();
$defaults = [
'language' => $language,
'parentEntity' => $parentEntity,
'alias' => $alias,
];
$this->setLanguageEntityDefault($preview, $defaults);
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_PREVIEW);
$formData = $builder->getData();
$formData = $this->filterFormDataLanguage($formData, 'edit', $prefix);
$formData = $this->filterFormData($formData, 'edit');
$preview->bindFormData($formData);
$preview->setAccessToken($token);
$this->save($em, $preview, $formData, self::SAVE_MODE_PREVIEW);
$facility = $preview->getFacility();
if($this->entity_settings->isRevisable()) {
$previewParams = [
'id' => $preview->getId()
];
if($facility){
$previewParams['facility'] = $facility->getCode();
}
$preview_url = $this->generateUrl($this->routes['preview'], array_merge($this->base_route_params, $previewParams));
} else {
$previewParams = [
'preview_id' => $preview->getId(),
'cms_token' => $token,
'cms_mode' => 'tmp_preview',
'_locale' => $preview->getLanguageAlias()
];
$preview_url = $this->getPreviewPageUrl($facility, $preview->getId(), $previewParams);
}
} else {
$revisionParent = null;
$revision = null;
$targetEntity = $entity;
if ($this->entity_settings->isRevisable()) {
$blocks2 = array_map(function($block){
return clone $block;
}, $builder->getBlocks());
$builder->setBlocks($blocks2);
$builder->commit(OnCommitEvent::MODE_REVISION);
$formData = $builder->getData();
$formData = $this->filterFormDataLanguage($formData, 'edit', $prefix);
$languageMaster = $repo->findMasterEntity($entity);
$parentId = $entity->getRevisionParent();
$revisionParent = ($parentId) ? $repo->findRevision($parentId) : null;
if ('draft' === $entity->getPostType()) {
$targetEntity = $entity;
if($revisionParent){
// 既存下書き
$revision = $entity;
$revision->setPostType(('draft' === $buttonAction) ? 'draft' : 'revision');
} else {
// 新規下書き
$targetEntity->setPostType(('draft' === $buttonAction) ? 'draft' : 'master');
}
} else {
// 一度もリビジョンが作られていない場合
if(0 === $repo->countRevisions($entity) && 'draft' !== $entity->getPostType()){
$firstRevision = $this->generateRevision($entity);
$firstRevision->setPostType('revision');
if (is_null($parentFirstRevisionEntity)) {
$firstRevision->setLanguageParent(null);
$parentFirstRevisionEntity = $firstRevision;
}
else {
$firstRevision->setLanguageParent($parentFirstRevisionEntity->getId());
}
$em->persist($firstRevision);
}
// 更新
$revision = $this->generateRevision($entity);
$revision->setPostType(('draft' === $buttonAction) ? 'draft' : 'revision');
$maxVersion = (int)$repo->getMaxRevisionVersion($entity);
$revision->setRevisionVersion($maxVersion + 1);
$em->persist($revision);
$targetEntity = $revision;
}
// 不要になった下書きを削除
$drafts = ($languageMaster) ? $this->getRelatedDrafts($languageMaster) : [];
foreach ($drafts as $draft) {
if($targetEntity->getId() === $draft->getId()){
continue;
}
$em->remove($draft);
}
} else {
$languageMaster = $entity;
$builder->commit();
$formData = $builder->getData();
$formData = $this->filterFormDataLanguage($formData, 'edit', $prefix);
}
if ($parentEntity) {
$this->setEntityParentLanguage($targetEntity, $parentEntity, $this->form_class);
}
$targetEntity->bindFormData($formData);
$defaults = [
'language' => $language,
'alias' => $alias,
'selected_languages' => $selected_languages,
'parentEntity' => $parentEntity,
];
$this->setLanguageEntityDefault($targetEntity, $defaults);
$this->save($em, $targetEntity, $formData, self::SAVE_MODE_EDIT, [
'builder' => $builder,
'language' => $language
]);
if ($isParent) {
$parentEntity = $targetEntity;
}
if ($this->entity_settings->isRevisable() && $revision) {
$approval_request = null;
if('draft' === $buttonAction){
// 下書きの再編集
if('master:draft' === $languageMaster->getPostType()){
$this->applyRevision($languageMaster, $revision);
}
} else {
if($approval_required){
if($language->getAlias() !== $default_lang){
$approval_request = null;
} elseif('master:draft' === $master_entity->getPostType()){
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_CREATE, $this->getUser());
} else {
$approval_request = $this->createApprovalRequest($revision, ApprovalRequest::REQUEST_TYPE_UPDATE, $this->getUser());
}
if($approval_request) {
$approval_request->setFacility($this->facility);
$em->persist($approval_request);
}
// 下書き、または承認前なら即時反映
if(in_array($languageMaster->getPostType(), ['master:draft', 'master:unapproved', 'master:rejected'])){
$this->applyRevision($languageMaster, $revision);
$master_entity->setPostType('master:unapproved');
}
} else {
if (in_array($languageMaster->getPostType(), ['master:draft', 'master:unapproved', 'master:rejected'])) {
$languageMaster->setPostType('master');
}
$this->applyRevision($languageMaster, $revision);
$this->cancelRelatedApprovalRequests($languageMaster);
}
}
$em->flush();
if($approval_request){
$this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
}
$this->saveMediaUsages($revision);
}
}
}
if ($buttonAction !== 'preview') {
$this->saveMediaUsages($master_entity);
$flash_message = $translator->trans('message.entry_saved', [], 'admin');
$this->addFlash('success', $flash_message);
if ($settings->get('single', false)) {
return $this->redirectToRoute($this->routes['edit'], array_merge($this->base_route_params, [
'facility' => $facility,
'id' => $trunk->getId(),
'disable_redirect_suggestion' => true
]));
} else {
return $this->redirect($this->base_path);
}
}
}
}
if('' !== (string)$preview_url){
$redirect_url = null;
$redirect_message = null;
}
return $this->render($this->views['multilingual_edit'], [
'meta' => $this->meta('EDIT'),
'builders' => $builders,
'preview_url' => $preview_url,
'redirect_url' => $redirect_url,
'redirect_message' => $redirect_message,
'_languages' => $languages,
'selected_languages' => $selected_languages,
'active_language' => $active_language,
'violations' => $violations,
'entity' => $first_entity,
'master_entity' => $master_entity,
'post_type' => $post_type,
'approval_required' => $approval_required,
'revisions' => $revisions,
'revision_history' => $revision_history,
'approval_history' => $approval_history,
'button_sections' => isset($this->button_sections['edit']) ? $this->button_sections['edit'] : [],
'_pageBuilderParams' => $_pageBuilderParams,
'_routes' => $this->routes,
'_base_route_params' => $this->base_route_params,
'revision_parent' => $revision_parent,
'languages_heading' => $languageHeading
]);
}
/**
* @param Request $request
* @param $facility
* @param $id
* @return Response
*/
public function detailAction(Request $request, $facility, $id)
{
$em = $this->getDoctrine()->getManager();
/** @var FilterCollection $filters */
$filters = $em->getFilters();
if($filters->isEnabled('post_type')){
$filter = $filters->getFilter('post_type');
$filterState = $filter->isActive();
$filter->deactivate();
} else {
$filter = null;
$filterState = false;
}
$item = $this->findOneEntity($this->models['item'], ['id' => $id]);
if(!$item){
throw $this->createNotFoundException();
}
if($filterState){
$filter->activate();
}
$builder = $this->createPageBuilder($this->form_class, $item);
$builder->setTheme('browse');
return $this->render($this->views['detail'], [
'item' => $item,
'builder' => $builder,
'page_title' => $this->title
]);
}
/**
* @param Request $request
* @param $facility
* @return RedirectResponse
*/
public function deleteAction(Request $request, $facility)
{
$translator = $this->get('translator');
$id = $request->get('id', -1);
$em = $this->getDoctrine()->getManager();
$repo = $this->getDoctrine()->getRepository($this->models['item']);
$approval_repo = $this->getDoctrine()->getRepository(ApprovalRequest::class);
$filters = $em->getFilters();
if($filters->isEnabled('post_type')){
$filters->disable('post_type');
}
$item = $repo->find($id);
if($filters->isEnabled('post_type')){
$filters->enable('post_type');
}
if(!$item) throw $this->createNotFoundException();
if(method_exists($item, 'getPostType')){
$post_type = $item->getPostType();
} else {
$post_type = 'master';
}
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $this->entity_settings->get('approval_required', false);
}
if('master' === $post_type && $approval_required) {
$approval_request = $this->createApprovalRequest($item, ApprovalRequest::REQUEST_TYPE_DELETE, $this->getUser());
$approval_request->setFacility($this->facility);
$item->autoTimestamps = false;
$em->persist($approval_request);
$em->flush();
// フラッシュメッセージ
$this->addFlash('success', $translator->trans('approval.message.entry_delete_requested', [], 'admin'));
$this->dispatcher->dispatch(RequestCreatedEvent::NAME, new RequestCreatedEvent($approval_request));
} else {
$em->remove($item);
$em->flush();
// フラッシュメッセージ
$this->addFlash('success', $translator->trans('message.entry_deleted', [], 'admin'));
}
return $this->redirect($this->base_path);
}
/**
*
* @param Request $request
* @return JsonResponse
*/
public function jsonAction(Request $request)
{
$data = [];
$doctrine = $this->getDoctrine();
$em = $doctrine->getManager();
$filters = $em->getFilters();
// 下書きの表示を許可
if($filters->isEnabled('post_type')){
$postTypeFilter = $filters->getFilter('post_type');
$postTypeFilter->setAllowedTypes(['master', 'master:draft', 'master:unapproved', 'master:rejected']);
} else {
$postTypeFilter = null;
}
$repository = $em->getRepository($this->models['item']);
$criteria = $this->base_criteria + $request->query->get('criteria', []);
if ($this->entity_settings->isMultilingual()) {
// 言語フィルタ設定
if (!empty($criteria['language'])) {
$langAlias = $criteria['language'];
}
else {
$langAlias = $this->container->getParameter('language.default', 'jp');
}
$em = $this->getDoctrine()->getManager();
$filter = $em->getFilters()->enable('language');
$filter->setParameter('language', $langAlias);
unset($criteria['language']);
}
// 空の検索条件を除外
$criteria = array_filter($criteria, function($value){
return $value !== '';
});
$columns = $request->query->get('columns');
$order = $request->query->get('order');
if(!empty($order)){
$orderBy = [];
foreach($order as $value){
$column = $columns[$value['column']];
// スネークケースに変換
$field = Container::underscore($column['data']);
$orderBy[$field] = $value['dir'];
}
} else {
$orderBy = $this->getDefaultOrderBy();
}
$limit = $request->get("length", 10);
$offset = $request->get("start", 0);
if (-1 == $limit) {
$limit = $offset = null;
}
$entities = $repository->searchBy($criteria, $orderBy, $limit, $offset);
foreach($entities as $entity)
{
$data[] = $entity->toArray();
}
$recordsFiltered = $repository->countBy($criteria);
$recordsTotal = $repository->countBy($this->base_criteria);
//レスポンス(JSONで返す)
return new JsonResponse([
'data' => $data,
'recordsFiltered' => $recordsFiltered,
'recordsTotal' => $recordsTotal,
]);
}
protected function getListDataTableOptions() {
$options = $this->getDefaultDataTableOptions();
$settings = $this->entity_settings;
$options["aoColumns"] = [[
"sTitle" => "id",
"mData" => "id",
"visible" => false
]];
if ($settings->get('actions.duplicate')) {
$options["aoColumns"][] = [
"sTitle" => "",
"orderable" => false,
"mData" => "id",
"width" => "50px",
"sClass" => "center",
"@render" => "function (data, type, row) {
return '<a class=\"btn btn-duplicate btn-sm btn-block\" href=\"" . $this->base_path . "' + data + '/duplicate/\">複製</a>';
}"
];
}
$options["aoColumns"] = array_merge($options["aoColumns"], $this->getDatatableColumns());
if ($settings->get('uses.public_status')) {
$options["aoColumns"][] = [
"sTitle" => "公開状態",
"width" => "120px",
"mData" => "status",
"sClass" => "center",
"@render" => "function (data, type, row) {
return dataTablesShowStatus(data, type, row);
}"
];
}
if ($settings->get('actions.child')) {
$base_route = preg_replace("/_children$/", "", $settings->get('base_route'));
$root = $this->generateUrl($base_route, [
'facility' => ($this->facility) ? $this->facility->getCode() : 'master'
]);
$options["aoColumns"][] = [
"sTitle" => "",
"mData" => "id",
"sWidth" => "80px",
"sortable" => false,
"@render" => 'function(data){
var url = "' . $root . '" + data + "/children/";
var html = "<a href=\"" + url + "\" class=\"btn btn-default btn-sm btn-block\">子項目</a>"
return html;
}'
];
}
if ($settings->get('actions.edit')) {
$options["aoColumns"][] = [
"sTitle" => "",
"orderable" => false,
"mData" => "id",
"width" => "50px",
"sClass" => "center",
"@render" => "function (data, type, row) {
var locked = ('undefined' !== typeof row.lockStatus) ? row.lockStatus & parseInt('0100', 2) : false;
if(locked){
return '<a class=\"btn btn-edit btn-sm btn-block disabled\" href=\"javascript:void(0)\">編集</a>';
} else {
return '<a class=\"btn btn-edit btn-sm btn-block\" href=\"" . $this->base_path . "' + data + '/edit/\">編集</a>';
}
}"
];
}
//本来は継承先。暫定対応
if ($settings->get('actions.preview')) {
$options["aoColumns"][] = [
"sTitle" => "",
"orderable" => false,
"mData" => "id",
"width" => "50px",
"sClass" => "center",
"@render" => "function (data, type, row) {
var postType = ('undefined' !== typeof row.postType) ? row.postType : 'master';
if('master' === postType || 'master:unapproved' === postType || 'master:rejected' === postType){
return '<a class=\"btn btn-preview btn-sm btn-block\" target=\"_blank\" href=\"" . $this->base_path . "' + data + '/preview/\">プレビュ</a>';
} else {
return '<a class=\"btn btn-preview btn-sm btn-block disabled\" href=\"javascript:void(0)\">プレビュ</a>';
}
}"
];
}
if ($settings->get('actions.delete')) {
$options["aoColumns"][] = [
"sTitle" => "",
"orderable" => false,
"mData" => "id",
"width" => "50px",
"sClass" => "center",
"@render" => "function (data, type, row) {
var locked = ('undefined' !== typeof row.lockFlags) ? row.lockFlags & parseInt('1000', 2) : false;
if(locked){
return '<button type=\"button\" class=\"btn btn-delete btn-sm btn-block disabled\" onclick=\"javascript:void(0);\">削除</button>';
} else {
return '<button type=\"button\" class=\"btn btn-delete btn-sm btn-block\" onclick=\"item_delete(\'" . $this->base_path . "delete/\', ' + data + ')\">削除</button>';
}
}"
];
}
$options["columnDefs"] = [];
$options["buttons"][] = [
'text' => '<i class="fa fa-undo"></i> ソートの解除',
'@action' => 'function(e, dt, node, config){
dt.order.neutral().draw();
}'
];
$options['ajax'] = [
'url' => $this->base_path . 'json/',
'dataSrc' => 'data'
];
return $options;
}
/**
* @param Request $request
* @param $facility
* @param $id
* @return mixed
*/
public function duplicateAction(Request $request, $facility, $id)
{
if($this->isGranted('approval_request_edit')){
$approval_required = false;
} else {
$approval_required = $this->entity_settings->get('approval_required', false);
}
if ($this->entity_settings->isMultilingual()) {
return $this->multiLingualDuplicateAction($request, $facility, $id);
}
$repo = $this->getDoctrine()->getRepository($this->models['item']);
$em = $this->getDoctrine()->getManager();
$filters = $em->getFilters();
$filterState = $filters->isEnabled('post_type');
if($filterState){
$filters->disable('post_type');
}
$entity = $repo->find($id);
if(!$entity){
throw $this->createNotFoundException();
}
if($filterState){
$filters->enable('post_type');
}
$clone = $this->duplicateEntityWithForm($entity, $this->form_class);
if(method_exists($clone, 'getTitle') && method_exists($clone, 'setTitle')){
$clone->setTitle('(複製)' . $clone->getTitle());
}
if(method_exists($clone, 'setStatus')){
$clone->setStatus(0);
}
if($approval_required){
$post_type = (method_exists($clone, 'getPostType')) ? $clone->getPostType() : 'master';
if('master' === $post_type){
$clone->setPostType('master:unapproved');
}
}
if(method_exists($clone, 'setLatestApprovalRequest')){
$clone->setLatestApprovalRequest(null);
}
$this->save($em, $clone, [], self::SAVE_MODE_DUPLICATE);
$this->saveMediaUsages($clone);
return $this->redirect($this->base_path);
}
public function multiLingualDuplicateAction(Request $request, $facility, $id)
{
$languages = $this->getMasterLanguages();
$parentLanguage = $this->getParentLanguage();
$em = $this->getDoctrine()->getManager();
$repo = $this->getDoctrine()->getRepository($this->models['item']);
$entities = $repo->getEntitiesForLanguage($id, null, $parentLanguage->getAlias());
$parentEntity = null;
foreach ($languages as $language) {
$langAlias = $language->getAlias();
$isParent = $language->isParent();
if (!isset($entities[$langAlias])) {
continue;
}
$entity = $entities[$langAlias];
$clone = $this->duplicateEntityWithForm($entity, $this->form_class);
if(method_exists($clone, 'getTitle') && method_exists($clone, 'setTitle')){
$title = $clone->getTitle();
if (!empty($title)) {
$title = (($isParent) ? '(複製)' : '(copy)') . $title;
$clone->setTitle($title);
}
}
if(method_exists($clone, 'setStatus')){
$clone->setStatus(0);
}
if (method_exists($clone, 'setLanguageParent') && $parentEntity) {
$clone->setLanguageParent($parentEntity->getId());
}
$this->save($em, $clone, [], self::SAVE_MODE_DUPLICATE);
if ($isParent) {
$parentEntity = $clone;
}
}
return $this->redirect($this->base_path);
}
/**
* 施設を取得する
*
* @param $code
* @return null|object
*/
protected function getFacilityByCode($code)
{
if(!empty($this->facility)){
return $this->facility;
} else {
$repo = $this->getDoctrine()->getRepository(Facility::class);
return $repo->findOneBy(['code' => $code]);
}
}
/**
* 施設のホームページを取得
*
* @param $code
* @return string
*/
protected function getFacilityHomeUrl($code)
{
$facility = $this->getFacilityByCode($code);
if($facility){
return rtrim($this->facility->getWebsite(), '/');
} else {
false;
}
}
protected function findEntity($id)
{
$user = $this->getUser();
$entity = parent::findEntity($id);
$facility = $user->getFacility();
if($entity && !$user->isAdmin() && $facility){
$postFacility = $entity->getFacility();
if(!is_null($postFacility) && $facility !== $postFacility){
return null;
}
}
return $entity;
}
protected function meta($mode, $id = null) {
$facility = $this->facility;
$settings = $this->entity_settings;
$meta = array();
$meta["base"]["title"] = $this->title;
if(!empty($this->base_path)){
$meta["base"]["path"] = $this->base_path;
} elseif($id){
$meta["base"]["path"] = $this->container->get('router')
->generate($this->entity_settings->get('base_route'), ['facility' => ($facility) ? $facility->getCode() : 'master', 'id' => $id], true);
} else {
$meta["base"]["path"] = $this->container->get('router')
->generate($this->entity_settings->get('base_route'), ['facility' => ($facility) ? $facility->getCode() : 'master'], true);
}
$meta["base"]['route'] = $this->entity_settings->get('base_route');
$meta["redirect"] = $this->entity_settings->get('base_route');
return $this->baseMeta($mode, $meta, $id);
}
protected function createPageBuilder($form, $entity = null, $action = 'default', $options = [])
{
$options['current_facility'] = ($this->facility) ? $this->facility : null;
return parent::createPageBuilder($form, $entity, $action, $options);
}
protected function pageBuilderOnLoad(PageBuilder $builder)
{
if($this->facility){
$builder->setSharedParam('facility_code', $this->facility->getCode());
$builder->setSharedParam('facility_id', $this->facility->getId());
} else {
$builder->setSharedParam('facility_code', 'master');
$builder->setSharedParam('facility_id', null);
}
return parent::pageBuilderOnLoad($builder);
}
}