<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Controller\Admin\Content;
use Eccube\Controller\AbstractController;
use Eccube\Entity\News;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\Admin\NewsType;
use Eccube\Repository\NewsRepository;
use Eccube\Util\CacheUtil;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
class NewsController extends AbstractController
{
/**
* @var NewsRepository
*/
protected $newsRepository;
/**
* NewsController constructor.
*
* @param NewsRepository $newsRepository
*/
public function __construct(NewsRepository $newsRepository)
{
$this->newsRepository = $newsRepository;
}
/**
* 新着情報一覧を表示する。
*
* @Route("/%eccube_admin_route%/content/news", name="admin_content_news", methods={"GET"})
* @Route("/%eccube_admin_route%/content/news/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_content_news_page", methods={"GET"})
* @Template("@admin/Content/news.twig")
*
* @param Request $request
* @param int $page_no
* @param PaginatorInterface $paginator
*
* @return array
*/
public function index(Request $request, PaginatorInterface $paginator, $page_no = 1)
{
$qb = $this->newsRepository->getQueryBuilderAll();
$event = new EventArgs(
[
'qb' => $qb,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CONTENT_NEWS_INDEX_INITIALIZE);
$pagination = $paginator->paginate(
$qb,
$page_no,
$this->eccubeConfig->get('eccube_default_page_count')
);
return [
'pagination' => $pagination,
];
}
/**
* 新着情報を登録・編集する。
*
* @Route("/%eccube_admin_route%/content/news/new", name="admin_content_news_new", methods={"GET", "POST"})
* @Route("/%eccube_admin_route%/content/news/{id}/edit", requirements={"id" = "\d+"}, name="admin_content_news_edit", methods={"GET", "POST"})
* @Template("@admin/Content/news_edit.twig")
*
* @param Request $request
* @param null $id
*
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
*/
public function edit(Request $request, CacheUtil $cacheUtil, $id = null)
{
if ($id) {
$News = $this->newsRepository->find($id);
if (!$News) {
throw new NotFoundHttpException();
}
} else {
$News = new \Eccube\Entity\News();
$News->setPublishDate(new \DateTime());
}
$builder = $this->formFactory
->createBuilder(NewsType::class, $News);
$event = new EventArgs(
[
'builder' => $builder,
'News' => $News,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CONTENT_NEWS_EDIT_INITIALIZE);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!$News->getUrl()) {
$News->setLinkMethod(false);
}
$this->newsRepository->save($News);
$event = new EventArgs(
[
'form' => $form,
'News' => $News,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CONTENT_NEWS_EDIT_COMPLETE);
$this->addSuccess('admin.common.save_complete', 'admin');
// キャッシュの削除
$cacheUtil->clearDoctrineCache();
return $this->redirectToRoute('admin_content_news_edit', ['id' => $News->getId()]);
}
return [
'form' => $form->createView(),
'News' => $News,
];
}
/**
* 指定した新着情報を削除する。
*
* @Route("/%eccube_admin_route%/content/news/{id}/delete", requirements={"id" = "\d+"}, name="admin_content_news_delete", methods={"DELETE"})
*
* @param Request $request
* @param News $News
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function delete(Request $request, News $News, CacheUtil $cacheUtil)
{
$this->isTokenValid();
log_info('新着情報削除開始', [$News->getId()]);
try {
$this->newsRepository->delete($News);
$event = new EventArgs(['News' => $News], $request);
$this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CONTENT_NEWS_DELETE_COMPLETE);
$this->addSuccess('admin.common.delete_complete', 'admin');
log_info('新着情報削除完了', [$News->getId()]);
// キャッシュの削除
$cacheUtil->clearDoctrineCache();
} catch (\Exception $e) {
$message = trans('admin.common.delete_error_foreign_key', ['%name%' => $News->getTitle()]);
$this->addError($message, 'admin');
log_error('新着情報削除エラー', [$News->getId(), $e]);
}
return $this->redirectToRoute('admin_content_news');
}
}