<?php
namespace Plugin\Blogs42\Controller\Admin\Blogs;
use Eccube\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException;
use Symfony\Component\Asset\Packages;
use Plugin\Blogs42\Entity\Blogs;
use Plugin\Blogs42\Entity\BlogsCategory;
use Plugin\Blogs42\Repository\BlogsRepository;
use Plugin\Blogs42\Repository\CategoryRepository;
use Plugin\Blogs42\Form\Type\Admin\BlogsType;
class BlogsController extends AbstractController
{
/**
* @var BlogsRepository
*/
protected $BlogsRepository;
/**
* @var CategoryRepository
*/
protected $categoryRepository;
/**
* @var Packages
*/
protected $packages;
/**
* PageController constructor.
*
* @param BlogsRepository $BlogsRepository
* @param CategoryRepository $categoryRepository
*/
public function __construct(
BlogsRepository $BlogsRepository,
CategoryRepository $categoryRepository,
Packages $packages
) {
$this->BlogsRepository = $BlogsRepository;
$this->categoryRepository = $categoryRepository;
$this->packages = $packages;
}
/**
* @Route("/%eccube_admin_route%/plugin/blogs_list", name="blogs_list")
* @Template("@Blogs42/admin/Blogs/blogs_list.twig")
*/
public function index(Request $request)
{
log_info('ブログ一覧表示');
$blogs = $this->BlogsRepository->findBy([],['id' => 'desc']);
return [
'pagination' => $blogs,
'total_item_count' => count($blogs),
];
}
/**
* @Route("/%eccube_admin_route%/plugin/blogs_new", name="blogs_new")
* @Route("/%eccube_admin_route%/plugin/blogs/{id}/edit", name="blogs_edit",requirements={"id" = "\d+"}, methods={"GET", "POST"})
* @Template("@Blogs42/admin/Blogs/blogs_edit.twig")
*/
public function edit(Request $request, $id=null)
{
if(is_null($id)){
log_info('ブログ記事登録開始');
$blogs = new Blogs();
$blogs
->setVisible(false);
} else {
log_info('ブログ記事編集開始[ID:'. $id .']');
$blogs = $this->BlogsRepository->find($id);
}
$builder = $this->formFactory->createBuilder(BlogsType::class, $blogs);
$form = $builder->getForm();
$categories = [];
$BlogsCategories = $blogs->getBlogsCategories();
foreach ($BlogsCategories as $BlogsCategory) {
/* @var $BlogsCategory \Plugin\Blogs42\Entity\BlogsCategory */
$categories[] = $BlogsCategory->getCategory();
}
$form['Category']->setData($categories);
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
$blogs = $form->getData();
// カテゴリの登録
// 一度クリア
/* @var $blogs \Plugin\Blogs42\Entity\Blogs */
foreach ($blogs->getBlogsCategories() as $BlogsCategory) {
$blogs->removeBlogsCategory($BlogsCategory);
$this->entityManager->remove($BlogsCategory);
}
$this->entityManager->persist($blogs);
$this->entityManager->flush();
$count = 1;
$Categories = $form->get('Category')->getData();
$categoriesIdList = [];
foreach ($Categories as $Category) {
foreach ($Category->getPath() as $ParentCategory) {
if (!isset($categoriesIdList[$ParentCategory->getId()])) {
$BlogsCategory = $this->createBlogsCategory($blogs, $ParentCategory, $count);
$this->entityManager->persist($BlogsCategory);
$count++;
/* @var $blogs \Plugin\Blogs42\Entity\Blogs */
$blogs->addBlogsCategory($BlogsCategory);
$categoriesIdList[$ParentCategory->getId()] = true;
}
}
if (!isset($categoriesIdList[$Category->getId()])) {
$BlogsCategory = $this->createBlogsCategory($blogs, $Category, $count);
$this->entityManager->persist($BlogsCategory);
$count++;
/* @var $blogs \Plugin\Blogs42\Entity\Blogs */
$blogs->addBlogsCategory($BlogsCategory);
$categoriesIdList[$Category->getId()] = true;
}
}
// 画像の移動
if ($blogs->getEyecatchImage()) {
$file_path = $this->eccubeConfig['eccube_temp_image_dir'] . '/' . $blogs->getEyecatchImage();
if (file_exists($file_path)) {
$file = new File($file_path);
$file->move($this->eccubeConfig['eccube_save_image_dir']);
}
}
//エディターツール
$blog_description = $blogs->getBlogDescription();
// temp_imageの画像ファイル名を取得
$preg_string = '/upload\/temp_image\/(.*?(jpg|jpeg|gif|png))/i';
preg_match_all($preg_string, $blog_description, $match1, PREG_PATTERN_ORDER);
// save_imageに移動
foreach ($match1[1] as $filename) {
$file = new Filesystem();
if(file_exists($this->eccubeConfig['eccube_temp_image_dir'].'/'.$filename)){
$file->copy($this->eccubeConfig['eccube_temp_image_dir'].'/'.$filename,$this->eccubeConfig['eccube_save_image_dir'].'/'.$filename);
$file->remove($this->eccubeConfig['eccube_temp_image_dir'].'/'.$filename);
}
}
// 画像のパスを変更
$blog_description = str_replace("temp_image", "save_image", $blog_description);
$blogs->setBlogDescription($blog_description);
$this->entityManager->persist($blogs);
$this->entityManager->flush();
log_info('ブログ記事登録/編集完了');
$this->addSuccess('admin.common.save_complete', 'admin');
return $this->redirectToRoute('blogs_edit', ['id' => $blogs->getId()]);
}
}
// ツリー表示のため、ルートからのカテゴリを取得
$TopCategories = $this->categoryRepository->getList(null);
$ChoicedCategoryIds = array_map(function ($Category) {
return $Category->getId();
}, $form->get('Category')->getData());
return [
'blogs' => $blogs,
'form' => $form->createView(),
'oldEyecatchImage' => $blogs->getEyecatchImage(),
'TopCategories' => $TopCategories,
'ChoicedCategoryIds' => $ChoicedCategoryIds,
];
}
/**
*
* @param Request $request
* @param blogs $blogs
*
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* @Route("/%eccube_admin_route%/plugin/blogs/{id}/delete", name="blogs_delete", requirements={"id" = "\d+"}, methods={"DELETE"})
*/
public function delete(Request $request, Blogs $blogs)
{
log_info('ブログ削除開始[id:'. $blogs->getId() .']');
// Valid token
$this->isTokenValid();
// スライダー情報を削除する
try {
$this->BlogsRepository->delete($blogs);
log_info('ブログ記事削除成功', ['id' => $blogs->getId()]);
$this->addSuccess('admin.common.delete_complete', 'admin');
} catch (\Exception $e) {
log_info('ブログ記事削除失敗', ['id' => $blogs->getId()]);
$this->addError('admin.common.delete_error_foreign_key', 'admin');
}
return $this->redirectToRoute('blogs_list');
}
/**
* @Route("/%eccube_admin_route%/blogs/image/add", name="eyecatch_image_add")
*/
public function imageAdd(Request $request)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
log_info('ブログ記事画像登録開始');
$allowExtensions = ['gif', 'jpg', 'jpeg', 'png', 'webp'];
$filename = null;
$files = $request->files->all();
foreach ($files as $images) {
if (isset($images['eyecatch_file'])) {
$image = $images['eyecatch_file'];
//ファイルフォーマット検証
$mimeType = $image->getMimeType();
if (0 !== strpos($mimeType, 'image')) {
throw new UnsupportedMediaTypeHttpException();
}
// 拡張子
$extension = $image->getClientOriginalExtension();
if (!in_array(strtolower($extension), $allowExtensions)) {
throw new UnsupportedMediaTypeHttpException();
}
$filename = date('mdHis') . uniqid('_') . '.' . $extension;
$image->move($this->getParameter('eccube_temp_image_dir'), $filename);
}
}
log_info('ブログ記事画像登録完了');
return $this->json(['filename' => $filename], 200);
}
/**
* BlogsCategory作成
*
* @param \Plugin\Blogs42\Entity\Blogs $blogs
* @param \Plugin\Blogs42\Entity\Category $Category
* @param integer $count
*
* @return \Plugin\Blogs42\Entity\BlogsCategory
*/
private function createBlogsCategory($blogs, $Category, $count)
{
$BlogsCategory = new BlogsCategory();
$BlogsCategory->setBlogs($blogs);
$BlogsCategory->setBlogsId($blogs->getId());
$BlogsCategory->setCategory($Category);
$BlogsCategory->setCategoryId($Category->getId());
return $BlogsCategory;
}
/**
* @Route("/%eccube_admin_route%/plugin/wysiwyg/image/add", name="wysiwyg_image_add")
*/
public function editorImageAdd(Request $request)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
log_info('エディター内画像登録開始');
$falseCount=0;
$allowExtensions = ['gif', 'jpg', 'jpeg', 'png', 'webp', 'GIF', 'JPG', 'JPEG', 'PNG', 'WEBP'];
$filename = null;
$files = $request->files->all();
$authorization = $request->headers->get('authorization');
$csrf = $request->headers->get('eccube-csrf-token');
$alt = $request->request->get('alt');
$width = $request->request->get('width');
$imgList = [];
$imgData = [];
if($authorization == $csrf){
foreach ($files as $key => $image) {
$originalName = $image->getClientOriginalName();
//ファイルフォーマット検証
$mimeType = $image->getMimeType();
if (0 !== strpos($mimeType, 'image')) {
throw new UnsupportedMediaTypeHttpException();
}
// 拡張子
$extension = $image->getClientOriginalExtension();
if (!in_array(strtolower($extension), $allowExtensions)) {
throw new UnsupportedMediaTypeHttpException();
}
$filename = date('mdHis') . uniqid('_') . '.' . $extension;
$fileUrl = '';
$result = '';
if ($key == 'imageFile') {
try {
$image->move($this->getParameter('eccube_temp_image_dir'), $filename);
$fileUrl = $this->packages->getUrl($filename, 'temp_image');
$result = 'success';
} catch (FileException $e) {
$falseCount++;
$result = 'fail';
}
$imgData = array_push($imgList,["result" => $result, "oldName"=>$originalName,"filePath"=>$fileUrl]);
}else{
$falseCount++;
$result = 'fail';
$imgData = array_push($imgList,["result" => $result, "oldName"=>$originalName,"filePath"=>$fileUrl]);
}
}
log_info('画像登録完了');
}
log_info('エディター内画像登録終了');
if($falseCount > 0) {
return $this->json(['fail_image' => $falseCount, 'data' => $imgList],400);
}
return $this->json(['success' => true, 'data' => $imgList],);
}
}