バージョン選択
フォーラム
メニュー
オンライン状況
|
 |
39 人のユーザが現在オンラインです。 (21 人のユーザが フォーラム を参照しています。) |
|
|
質問 > フロント機能 > カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。 |
|
フロント機能
投稿者 |
スレッド |
be-s |
投稿日時: 2023/7/24 11:53
対応状況: 開発中
|
一人前   登録日: 2016/2/2 居住地: São Paulo 投稿: 107 |
カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。 [EC-CUBE] 4.0.4 [レンタルサーバ] AWS EC2冗長化設定 [OS] Linux [PHP] 7.3.* [データベース] MySQL 5.7.*(RDS) [WEBサーバ] Apache/2.4.* [ブラウザ] Chrome [セッション管理]PdoSessionHandler [現象] https://a-zumi.net/eccube4-url-slug/上記記事の商品詳細ページのSlug化を参考に致しましが商品一覧へアクセス時に下記エラーになってしまいます。 ProductConverter.phpからProductController.php間での値がうまく渡せてない気がします。 エラー内容
Eccube\Entity\Category object not found by the @ParamConverter annotation.
Slug化の変更点は以下になります。 なにとぞご教授お願いできないでしょうか \app\Customize\Request\ProductConverter.php
/**
* 商品IDでも商品スラッグでも商品情報が取得できるようにする
*
* @param Request $request
* @param ParamConverter $configuration
* @return bool
* @throws \ReflectionException
*/
public function apply(Request $request, ParamConverter $configuration)
{
$id = $this->getIdentifier($request, $configuration->getOptions());
if (false === $id || null === $id) {
return false;
}
$slugCategory = [];
if($configuration->getName() === "product_list_slug_url"){
if($id){
if (is_numeric($id)) {
// カテゴリIDの場合
$slugCategory = $this->categoryRepository->getCategory($id);
} else {
// カテゴリスラッグの場合
$slugCategory = $this->categoryRepository->getCategoryIdFromSlugName($id);
}
}
if($slugCategory){
// リクエストにオブジェクトをセット
$class = $configuration->getClass();
$request->attributes->set((new \ReflectionClass($class))->getShortName(), $slugCategory);
return true;
}
}
return false;
}
/**
* nameの内容によってのParamConverterを適用
*
* @param ParamConverter $configuration
* @return bool
*/
public function supports(ParamConverter $configuration)
{
if($configuration->getName() === "product_detail"){
return true;
}
elseif($configuration->getName() === "product_list_slug_url"){
return true;
}
}
\app\Customize\Controller\ProductController.php
/**
* 商品カテゴリ商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"})
* @Template("Product/list.twig")
* @ParamConverter("Category", name="product_list_slug_url", class="Eccube\Entity\Category", options={"id" = "id"})
*
* @param Request $request
* @param Paginator $paginator
* @param Category $category
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator,Category $category)
{
return parent::indexSlugUrl($request,$paginator,$category);
}
\src\Eccube\Controller\ProductController.php
/**
* 商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/list.twig")
* @ParamConverter("Category", options={"repository_method" = "getCategory"})
*
* @param Request $request
* @param Paginator $paginator
* @param Category $category
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator,Category $category)
\app\Customize\Twig\RoutingExtension.php
/**
* スラッグを持っている場合はスラッグのURLを生成、
* スラッグを持っていない場合はIDのURLを生成
*
* @param string $name
* @param array $parameters
* @param false $schemeRelative
* @return string
*/
public function getUrl($name, $parameters = [], $schemeRelative = false)
{
if ($name === "product_list") {
/** @var Category $category */
$category = $this->categoryRepository->getCategory($parameters["id"]);
if(!empty($category->getSlugName())) {
// スラッグを持っているURLを生成
return parent::getUrl("product_list", ["id" => $category->getSlugName()], $schemeRelative);
} else {
// スラッグを持っていないIDのURLを生成
return parent::getUrl("product_list", ["id" => $category->getId()], $schemeRelative);
}
}
return parent::getUrl($name, $parameters, $schemeRelative);
}
表示させたいSlugありURL
https://localhost/products/list/slugname
|
|
|
h_tanaka |
投稿日時: 2023/7/28 10:41
対応状況: −−−
|
神   登録日: 2016/7/22 居住地: 愛媛県 投稿: 1402 |
Re: カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。 Eccube\Entity\Category ↓ \Eccube\Entity\Category でどうでしょうか? ---------------- EC-CUBE 《プラチナ》ランクパートナー トエビス株式会社 田中 宏典 EC-CUBEの機能やデザインのカスタマイズ承ります。
|
|
|
be-s |
投稿日時: 2023/8/8 18:53
対応状況: −−−
|
一人前   登録日: 2016/2/2 居住地: São Paulo 投稿: 107 |
Re: カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。 h_tanaka様 ご回答ありがとうございました。 \app\Customize\Controller\ProductController.php のアノテーションを
/**
* 商品カテゴリ商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"})
* @Template("Product/list.twig")
* @ParamConverter("Category", name="product_list_slug_url", class="\Eccube\Entity\Category", options={"id" = "id"})
*
* @param Request $request
* @param Paginator $paginator
* @param Category $category
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator,Category $category)
{
return parent::indexSlug($request,$paginator,$category);
}
に変更しましたが同エラー解決できませんでした。
|
|
|
be-s |
投稿日時: 2023/8/8 19:08
対応状況: 解決済
|
一人前   登録日: 2016/2/2 居住地: São Paulo 投稿: 107 |
Re: カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。 以下方法でカテゴリのSlug化対応、自己解決できました。 \app\Customize\Request\ProductConverter.php
/**
* ProductConverter constructor.
* @param ManagerRegistry $registry
* @param CategoryRepository $categoryRepository
* @param ProductRepository $productRepository
*/
public function __construct(ManagerRegistry $registry,CategoryRepository $categoryRepository, ProductRepository $productRepository)
{
$this->categoryRepository = $categoryRepository;
$this->productRepository = $productRepository;
$this->registry = $registry;
}
/**
* 商品IDでも商品スラッグでも商品情報が取得できるようにする
*
* @param Request $request
* @param ParamConverter $configuration
* @return bool
* @throws \ReflectionException
*/
public function apply(Request $request, ParamConverter $configuration)
{
$id = $this->getIdentifier($request, $configuration->getOptions());
$class = $configuration->getClass();
if (false === $id || null === $id) {
return false;
}
if($configuration->getName() === "product_list_slugurl"){
$om = $this->registry->getManagerForClass($class);
$repository = $om->getRepository($class);
if ($repository instanceof CategoryRepository) {
/** @var Category $category */
$category = new Category();
if($id){
if (is_numeric($id)) {
// カテゴリIDの場合
$category = $repository->getCategory($id);
} else {
// カテゴリスラッグの場合
$category = $repository->getCategoryFromSlug($id);
}
}
if($category){
// リクエストにオブジェクトをセット
$request->attributes->set((new \ReflectionClass($class))->getShortName(), $category);
//パラメーターidをスラッグに変換
$request->query->set('id',$category->getSlug());
return true;
}
}
}
return false;
}
/**
* nameの内容によってのParamConverterを適用
*
* @param ParamConverter $configuration
* @return bool
*/
public function supports(ParamConverter $configuration)
{
if($configuration->getName() === "product_list_slugurl"){
return true;
}
}
/**
* {id}の値を取得
*
* @param Request $request
* @param $options
* @return false|mixed
*/
protected function getIdentifier(Request $request, $options)
{
$name = "";
$id = "id";
if($options){
if(isset($options[$id])){
if (!\is_array($options[$id])) {
$name = $options[$id];
}
}
}elseif($request->query->has($id)){
$name = $request->query->get($id);
}else{
$name = $id;
}
if ($request->attributes->has($name)) {
return $request->attributes->get($name);
}
return false;
}
app\Customize\Entity\CategoryTrait.php
/**
* @var string|null
*
* @ORM\Column(name="slug", type="string", length=50, nullable=true)
*/
public $slug;
/**
* Set slug.
*
* @param string|null $slug
*
* @return SlugTrait
*/
public function setSlug($slug= null)
{
$this->slug= $slug;
return $this;
}
/**
* Get slug.
*
* @return string|null
*/
public function getSlug()
{
return $this->slug;
}
src\Eccube\Repository\CategoryRepository.php
/**
* SlugからカテゴリIDを取得する
*
* @param string $slug
*
* @return Category カテゴリ
*/
public function getCategoryFromSlug($slug)
{
$qb = $this->createQueryBuilder('c')
->where('c.slug= :slug')
->setParameter('slug', $slug)
->orderBy('c.sort_no', 'DESC');
$qb->setMaxResults(1);
$Category = $qb->getQuery()
->useResultCache(true, $this->getCacheLifetime())
->getResult();
if(!empty($Category)){
return $Category[0];
}
return ;
}
}
\app\Customize\Controller\ProductController.php
/**
* 商品カテゴリ商品一覧画面.
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"})
* @Template("Product/list.twig")
* @ParamConverter("Category", name="product_list_slug_url", class="Eccube\Entity\Category", options={"id" = "id"})
*
* @param Request $request
* @param Paginator $paginator
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator)
{
return parent::indexSlugUrl($request,$paginator);
}
\src\Eccube\Controller\ProductController.php
/**
* 商品一覧画面.スラッグURL
*
* @Route("/products/list/{id}", name="product_list_slug_url", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/list.twig")
*
* @param Request $request
* @param Paginator $paginator
* @return array
*/
public function indexSlugUrl(Request $request, Paginator $paginator)
{
//以下部分追加
if($request->attributes->get('Category')){
$category = $request->attributes->get('Category');
//パラメーターセット
$request->request->set('category_id',$category->getid());
$request->query->set('category_id',$category->getid());
}
}
|
|
|
|
統計情報
総メンバー数は83,079名です
総投稿数は107,660件です
|