質問 > その他 > 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい |
その他
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
yoshiaki |
投稿日時: 2016/6/22 10:30
対応状況: −−−
|
半人前 登録日: 2016/6/22 居住地: 投稿: 11 |
商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい EC-CUBEにてカテゴリ選択を行う部分についてカスタマイズをしたいと考えています。
カスタマイズの状況などは以下になります。 SQL(DQL)の記述についてがメインの質問となります。 前提・実現したいこと ・環境 EC-CUBE:3.0.10 ・条件 ユーザ名が店舗名となり店舗名はカテゴリ名とも同一になります ・カテゴリ構成(カテゴリや店舗名は例となります) 食器 ┣店舗A ┗店舗B インテリア ┣店舗A ┗店舗C ・実現したいこと EC-CUBEにて、管理画面内の商品登録画面、商品検索画面、受注検索画面の各画面にてカテゴリを選択できる部分があるが、その部分にて該当店舗分のみを出すようにしたい。 ・作成しようとしているSQLの概要 ユーザ名が店舗名のため、ユーザ情報($app['user']のName)より取得しそれを用いてカテゴリのIDを紐づけて導き出す。 店舗Aがログインした場合は 食器 ┗店舗A インテリア ┗店舗A 店舗Bがログインした場合は 食器 ┗店舗B としたい。 SELECT * FROM dtb_category ca WHERE ca.category_name = 店舗名 とした場合は、店舗名に合致するものしか取れないためそれに付随する親カテゴリの名前が取得できない。 親カテゴリも取得できるようにしたい。 発生している問題・エラーメッセージ エラーは発生していないが、現状では上記の通りカテゴリ名が 子カテゴリ(店舗名)しか取得できていないため 複数の親カテゴリが存在する場合にどちらに追加しているのかが特定しづらい。 該当のソースコード 現状は、上記記載のSQLをdoctrineで書いたのみなので src\Eccube\Form\Type\Adminの 'query_builder' => function(EntityRepository $er) use($name) { return $er->createQueryBuilder('ca') ->where('ca.name = :name') ->setParameter('name', $name) ->orderBy('ca.rank', 'DESC'); }, 試したこと、考えてみたこと ・サブクエリを使用すれば作れたりするのかなと考えてはみましたが、doctrineの経験が少なくサブクエリでの構文の知識が薄いため詰まってしまっています。 ヒント等のご教示をいただける方、よろしくお願いいたします。 |
yoshiaki |
投稿日時: 2016/6/22 11:34
対応状況: −−−
|
半人前 登録日: 2016/6/22 居住地: 投稿: 11 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい 条件分岐をハードコードしていたのをなくしたいというのが一番の事案でして
SELECT * FROM dtb_category Ca WHERE Ca.category_id IN ( SELECT CA.parent_category_id FROM dtb_category CA WHERE CA.category_name = '店舗B') OR (Ca.parent_category_id IN ( SELECT ca.parent_category_id FROM dtb_category Ca WHERE ca.category_name = '店舗B') AND ca.category_name = '店舗B') ORDER BY ca.rank DESC これであれば、一応phpMyAdminで見た際に欲しい結果というものが取れそうなのですが SQLがかなり見にくいのと要らないことやっていそうではありますが… where句内にてサブクエリを組んだり別でテーブルを呼び出したりの記述法がわからず… ご教示いただければ幸いです。 よろしくお願いいたします。 |
nyorai |
投稿日時: 2016/6/22 15:49
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい 無理にクエリビルダで実装するよりも、一度データを取得して、PHP側で選択肢のリストを構築したほうが簡単かもしれません。
1. 店舗Xのカテゴリを取得 findByメソッド等で、"店舗X"のカテゴリを取得 2. 取得したカテゴリのエンティティから親カテゴリを構築 カテゴリエンディティに、getPath()というメソッドがあり、親から自分までのカテゴリの配列を取得できます。 https://github.com/EC-CUBE/ec-cube/blob/master/src/Eccube/Entity/Category.php#L81 3. choicesオプションで、構築したカテゴリ情報を渡す query_builderではなく、chiicesオプションを使って、2で作った配列を渡します。 http://docs.symfony.gr.jp/symfony2/reference/forms/types/entity.html#id6 のような流れになるかと。 |
yoshiaki |
投稿日時: 2016/6/22 16:15
対応状況: −−−
|
半人前 登録日: 2016/6/22 居住地: 投稿: 11 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい nyorai様
ありがとうございます。 私も質問として投げかけさせていただいた後も調べていて見つけたのですが findByの使い方があまりよく分かっておらず… 例:商品検索 $builderでカテゴリや商品名等の必須等を SearchProductType.phpに記載しているかと思います。 同じクラス内、$builderよりも前で定義を行い、 $builder内カテゴリの部分で choiceを行う認識であっているでしょうか? $em = $app['orm.em']; $category = $em->getRepository(\Eccube\Entity\Category)->findBy('name'=>$name);←52行目 dump($category); このようにしてみて、dumpで確認してみようとしたのですが以下のエラーが出てしまい… FatalErrorException in SearchProductType.php line 52: Parse Error: syntax error, unexpected '=>' (T_DOUBLE_ARROW) |
red |
投稿日時: 2016/6/22 16:31
対応状況: −−−
|
神 登録日: 2010/2/15 居住地: 東京都 投稿: 1570 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい Parse Error: syntax error, unexpected '=>' (T_DOUBLE_ARROW)
と書いてありますよ? 配列じゃないのに=>を使っているのが原因です。
|
nyorai |
投稿日時: 2016/6/22 16:37
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい > 同じクラス内、$builderよりも前で定義を行い、
> $builder内カテゴリの部分で > choiceを行う認識であっているでしょうか? はい、それで大丈夫です。 > $category = $em->getRepository(\Eccube\Entity\Category)->findBy('name'=>$name);←52行目 findByの引数は配列で渡す必要があるので、findBy(array('name'=>$name)) が正しいですね。 |
yoshiaki |
投稿日時: 2016/6/22 17:06
対応状況: −−−
|
半人前 登録日: 2016/6/22 居住地: 投稿: 11 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい red様、nyorai様
ありがとうございます。 getPathなのですが、 先ほどのですと、$categoryにカテゴリのエンティティを取得したため $ca = $category->getPath(); でよいのかなーと思ったのですが Error: Call to a member function getPath() on array この場合は、配列のまま使用してしまっていることが原因なのでしょうか? |
nyorai |
投稿日時: 2016/6/22 17:37
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい > Error: Call to a member function getPath() on array
> この場合は、配列のまま使用してしまっていることが原因なのでしょうか? はい、そうですね。 とりあえず$categoryや、$category[0]->getPath()の結果をdumpしてみたりすればイメージつきやすいと思います。 |
yoshiaki |
投稿日時: 2016/6/22 18:06
対応状況: −−−
|
半人前 登録日: 2016/6/22 居住地: 投稿: 11 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい for ($i=0;$i<count($category);$i++) {
$cate = $category[$i]->getPath(); $ca = array_merge($cate); } このようにするところまでは理解ができました。 しかし、上書きされてしまうようですね 複数の親カテゴリ(配列に複数の結果)がある場合 後の方しか取得できません。 また、 $ca = array_merge($category[0]->getPath(), $category[1]->getPath()); このようになった際に、うまく表示されていました。 追記 for ($i=0;$i<count($category);$i++) { $cate = $category[$i]->getPath(); $ca[] = array_merge($cate); } このようにしたら、入ったのですが 配列の番号でしょうか 0 ┗Aカテゴリ ┗店舗A 1 ┗Bカテゴリ ┗店舗A のようになってしまいましたね… |
nyorai |
投稿日時: 2016/6/22 18:18
対応状況: −−−
|
仙人 登録日: 2015/8/21 居住地: 投稿: 302 |
Re: 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい forではなくforeachのほうが望ましいです(間違いではないです)
array_mergeの使い方が間違っているので、PHPマニュアル参考にしてみてください。 http://php.net/manual/ja/function.array-merge.php |
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |