<?php
namespace Plugin\Recipe\Controller;
use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Knp\Component\Pager\PaginatorInterface;
use Plugin\Recipe\Form\Type\SearchRecipeType;
use Plugin\Recipe\Repository\RecipeRepository;
use Plugin\Recipe\Repository\TagRepository;
use Plugin\Recipe\Repository\MaterialRepository;
use Plugin\Recipe\Repository\CategoryRepository;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class RecipeController extends AbstractController
{
/**
* @var RecipeRepository
*/
protected $recipeRepository;
/**
* @var TagRepository
*/
protected $tagRepository;
/**
* @var CategoryRepository
*/
protected $categoryRepository;
/**
* @var MaterialRepository
*/
protected $materialRepository;
/**
* RecipeController constructor.
*
* @param RecipeRepository $recipeRepository
* @param TagRepository $tagRepository
* @param CategoryRepository $categoryRepository
* @param MaterialRepository $materialRepository
*/
public function __construct(
RecipeRepository $recipeRepository,
TagRepository $tagRepository,
CategoryRepository $categoryRepository,
MaterialRepository $materialRepository
)
{
$this->recipeRepository = $recipeRepository;
$this->tagRepository = $tagRepository;
$this->categoryRepository = $categoryRepository;
$this->materialRepository = $materialRepository;
}
/**
* レシピ一覧ページ
* @Route("/recipe", name="recipe", methods={"GET"})
* @Template("Recipe/Resource/template/default/index.twig")
*/
public function index(Request $request, PaginatorInterface $paginator)
{
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchRecipeType::class);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// paginator
$searchData = $searchForm->getData();
$qb = $this->recipeRepository->getQueryBuilderBySearchData($searchData);
$query = $qb->getQuery();
/** @var SlidingPagination $pagination */
$pagination = $paginator->paginate(
$query,
!empty($searchData['pageno']) ? $searchData['pageno'] : 1,
$this->eccubeConfig['plugin_recipe.front.page_count']
);
// category
$Category = $searchForm->get('category_id')->getData();
$Categories = $this->categoryRepository->getList();
// tag
$Tag = $searchForm->get('tag_id')->getData();
$Tags = $this->tagRepository->getList();
// material
$Material = $searchForm->get('material_id')->getData();
$Materials = $this->materialRepository->getList();
// subtitle
$subtitle = 'レシピ一覧';
switch (true) {
case $searchData['name']:
$subtitle = $searchData['name'] . 'の検索結果';
break;
case $Category:
$subtitle = $Category->getName() . 'のレシピ';
break;
case $Tag:
$subtitle = $Tag->getName() . 'のレシピ';
break;
case $Material:
$subtitle = $Material->getName() . 'のレシピ';
break;
}
// form is empty
$filterFlg = true;
if (
empty($searchData['name']) &&
empty($Category) &&
empty($Tag) &&
empty($Material)
) {
$filterFlg = false;
}
return [
'subtitle' => $subtitle,
'pagination' => $pagination,
'search_form' => $searchForm->createView(),
'Category' => $Category,
'Categories' => $Categories,
'Tag' => $Tag,
'Tags' => $Tags,
'Material' => $Material,
'Materials' => $Materials,
'filterFlg' => $filterFlg,
];
}
/**
* レシピ詳細ページ
* @Route("/recipe/detail/{id}", name="recipe_detail", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Recipe/Resource/template/default/detail.twig")
*
* @param Request $request
*/
public function detail(Request $request, $id)
{
$Recipe = $this->recipeRepository->find($id);
if (!$Recipe || !$Recipe->getPublic()) {
throw new NotFoundHttpException();
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchRecipeType::class);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// category
$Categories = $this->categoryRepository->getList();
// tag
$Tags = $this->tagRepository->getList();
// material
$Materials = $this->materialRepository->getList();
return [
'Recipe' => $Recipe,
'search_form' => $searchForm->createView(),
'Categories' => $Categories,
'Tags' => $Tags,
'Materials' => $Materials,
];
}
}