EC-Cube 4 customize controllerの作成
EC-Cube 4.2でProductの詳細を変更したいときに、自分で作ったページにアクセスをさせたいなどの時のコントローラの書き方について
たとえば、EC-Cubeの商品詳細ページは、
http://localhost:8888/products/detail/3
でよびだされています。
この 3が プロダクトIDです。これを例えば
Localhost:8888/test/3
で、呼び出せるようにする。
そのためのController の書き方は
を参考に書きます。(ただし、これだけで書けるわけではないと思います)
最初の一歩
このように場合、上記のサイトをみると「URLからパラメータを受け取る」があるので、その通りに
/**
* @Method("GET")
* @Route("/test/{id}")
*/
とコントローラに書くと確かにパラメータは受け取れる。
サンプルページをそのまま記述して、
public function testMethod($id)
{
return new Response('Parameter is '.$id);
}
と書き、
localhost:8888/test/3
で呼びだすと、
Parameter is 3
と表示されるだけです。
では、つぎに、ページを呼びだすか?について、
そこで、templateを定義して、以下のように記述
(EC-cube4.2 controllerのソースを参考に)
/**
* 商品詳細画面.
*
* @Route("/test/{id}", name="test", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/detail.twig")
* @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
*
* @param Request $request
* @param Product $Product
*
* @return array
*/
上記の様にControllerに記述すると、元からあるProduct/Detail.twig を呼びます。
本題 やりたいこと
カスタマイズしたページを作り呼ぶ場合
EC-Cubeの「ページ管理」 −>新規作成 でオリジナルページを作ると
/app/template/user_data
に作るようですが、これだとアクセスができません。
Controllerを使ってアクセスする場合、
/app/plugin や/app/template/default の下に作るとうまくいきます。
引数付きの場合
管理ページの ページ管理で元々ソースにある物で引数のある物は、以下の様に表示されています
引数を入れたい場合は、以下の様にControllerに入力すると引数が表示されるようになる。
* @Route("/test/{id}", name="test"
*@Route("/test/{id} , name ="test"のように書くと「ページ管理」のページに以下の様になり、URLから呼べるようになる。
test用 Controller 全体のソース
<?php
namespace Customize\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Eccube\Entity\Product;
use Eccube\Form\Type\AddCartType;
class TestController extends AbstractController
{
private $title = '';
/**
* 商品詳細画面.
*
* @Route("/test/{id}", name="test", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/Test.twig")
* @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
*
* @param Request $request
* @param Product $Product
*
* @return array
*/
public function detail(Request $request, Product $Product)
{
$builder = $this->formFactory->createNamedBuilder(
'',
AddCartType::class,
null,
[
'product' => $Product,
'id_add_product_id' => false,
]
);
$is_favorite = false;
if ($this->isGranted('ROLE_USER')) {
$Customer = $this->getUser();
$is_favorite = $this->customerFavoriteProductRepository->isFavorite($Customer, $Product);
}
return [
'title' => $this->title,
'subtitle' => $Product->getName(),
'form' => $builder->getForm()->createView(),
'Product' => $Product,
'is_favorite' => $is_favorite,
];
}
}
これで、http://local:8888/test/3. で、/app/template/default/Product/Test.twigを引数付きで呼びだします。
引数を外すと 404 Page Not found エラーになるので注意
最後、return以下も注意(EC-cubeなどのソースをみるとか)
よろしければサポートをお願いします。 今後の活動の励みになります。