<?php
namespace Mod\RestaurantBundle\Controller\Display;
use AppBundle\Component\Util\Hash;
use CustomBundle\Form\RestaurantSearchType;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\QueryBuilder;
use Mod\RestaurantBundle\Entity\Banner;
use Mod\RestaurantBundle\Entity\Restaurant;
use Mod\RestaurantBundle\PageForm\RestaurantForm;
use Mod\RestaurantBundle\Service\BundleUtility;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use CustomBundle\Controller\CustomFacilityDisplayBaseController as FacilityDisplayBaseController;
class ActionController extends FacilityDisplayBaseController
{
public $formClass = RestaurantForm::class;
public $itemClass = Restaurant::class;
public $views = [
"index" => "restaurant-search/index.php",
"detail" => "restaurant-search/detail.php",
];
public $settings = [
"pageLimit" => 10,
"theme" => "restaurant-search",
"themeDirectory" => "CustomBundle:Default:page-builder/themes"
];
public function before(FilterControllerEvent $event)
{
parent::before($event);
$this->default_setting = $this->getDefaultParameter('mod_restaurant.default_settings');
$this->entity_setting = $this->getDefaultParameter('mod_restaurant.entity_settings');
/** @var BundleUtility $util */
$util = $this->get('mod_restaurant.bundle_utility');
if(isset($this->default_setting['list_limit'])){
$this->settings['pageLimit'] = $this->default_setting['list_limit'];
}
}
/**
* @Route("/restaurant-search/", name="mod_restaurant_top")
*/
public function indexAction(Request $request)
{
$tags = [];
/** @var BundleUtility $util */
$util = $this->get('mod_restaurant.bundle_utility');
$form = $this->createForm(RestaurantSearchType::class, null, [
'method' => 'GET',
'csrf_protection' => false,
]);
$form->handleRequest($request);
if($form->isSubmitted()) {
$tags = $util->createTagList($request);
}
$order = ['sort_num' => 'ASC', 'this_month_recommendation' => 'DESC'];
$page = $request->query->getInt('page', 1);
if($page < 1){
$page = 1;
}
$limit = $this->settings['pageLimit'];
$paginator = $util->searchItems($request->query->all(), $order, $limit, $page);
if(isset($this->default_setting['pagination']['page_range'])){
$paginator->setPageRange($this->default_setting['pagination']['page_range']);
}
$pagination = $this->getPaginationParams($paginator);
$items = $paginator->getItems();
return $this->renderFront($this->views['index'], [
'cms__items' => $items,
'cms__pagination' => $pagination,
'cms__form' => $form->createView(),
'cms__tags' => $tags,
'cms__banner' => $this->getBanner(),
]);
}
/**
* @Route("/restaurant-search/{id}/", name="mod_restaurant_detail")
*/
public function detailAction(Request $request, $id)
{
/** @var BundleUtility $util */
$item = $this->findItemBy($request, $this->itemClass, ['id' => $id]);
if(!$item){
throw new NotFoundHttpException();
}
$page_builder = $this->createPageBuilder($this->formClass, $item);
$page_builder->setTheme($this->settings['theme']);
$page_builder->setThemeDirectory($this->settings['themeDirectory']);
return $this->renderFront($this->views['detail'], [
'cms__item' => $item,
'cms__page_builder' => $page_builder,
]);
}
// お店をさがす用のバナー取得
public function getBanner()
{
$repo = $this->getDoctrine()->getRepository(Banner::class);
/** @var QueryBuilder $qb */
$qb = $repo->createQueryBuilder('b');
$qb->addOrderBy('b.sort_num', 'ASC')
->setMaxResults(1)
;
try {
$result = $qb->getQuery()->getOneOrNullResult();
} catch(NonUniqueResultException $e) {
$result = null;
}
return $result;
}
// FormTypeにデータを渡す
protected function createForm($type, $data = null, array $options = [])
{
/** @var BundleUtility $util */
$util = $this->get('mod_restaurant.bundle_utility');
$genres = $util->transformData($util->getGenres());
$time_by_cars = $util->transformData($util->getTimeByCars(), true, 'お車', '分圏内');
$scenes = $util->transformData($util->getScenes());
$features = $util->transformData($util->getFeatures());
$options['genres'] = $genres;
$options['time_by_cars'] = $time_by_cars;
$options['scenes'] = $scenes;
$options['features'] = $features;
return parent::createForm($type, $data, $options);
}
}