バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > その他 > 商品検索画面、商品登録画面、受注検索画面においてカテゴリを絞って表示させたい

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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)
と書いてありますよ?

配列じゃないのに=>を使っているのが原因です。


----------------
EC-CUBEのカスタマイズ、トラブル解決承ります
お気軽にお問い合わせ下さい
https://www.ec-cube.net/integrate/partner/partner.php?partner_id=690

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);
}

このようにしたら、入ったのですが
配列の番号でしょうか


┗Aカテゴリ
 ┗店舗A

┗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 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,953名です
総投稿数は110,019件です

投稿数ランキング

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.