バージョン選択

フォーラム

メニュー

オンライン状況

69 人のユーザが現在オンラインです。 (60 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 69
もっと...

サイト内検索

質問 > フロント機能 > カテゴリのslug化で@ParamConverter annotationエラーが起こってしまいます。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
be-s
投稿日時: 2023/7/24 11:53
対応状況: 開発中
一人前
登録日: 2016/2/2
居住地: São Paulo
投稿: 115
カテゴリの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
居住地: 愛媛県
投稿: 1646
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
投稿: 115
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
投稿: 115
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());
        }
    }
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,027名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.