バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 注文履歴一覧に商品名を表示すると商品数=注文件数になる

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
himajin
投稿日時: 2017/5/16 17:17
対応状況: 解決済
新米
登録日: 2017/5/16
居住地:
投稿: 4
注文履歴一覧に商品名を表示すると商品数=注文件数になる
▼テンプレート
[EC-CUBE]2.13
[レンタルサーバ]GMO iclusta
[OS] win10
[PHP] 5.6
[データベース] Mysql
[ブラウザ]firefox
[導入プラグインの有無]なし
[カスタマイズの有無] あり

いつもお世話になっております。
ECCUBE初心者です。

MYページの注文履歴一覧のお届け先を商品名に変更しましたが、
1つの受注で2つ以上の商品の購入がある時に商品ひとつひとつが表示され、
注文履歴も商品数分になってしまいました。
例えば、購入件数自体は1なのに、商品数が2つあると、
「2件の購入履歴があります。」と表示されてしまいます。
金額も注文の合計金額が商品の件数分表示されます。

注文(order_id)別でまとめて表示させたいですが、何か良い方法はないでしょうか。
ご教授いただければ幸いです。
468
投稿日時: 2017/5/17 8:32
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
function lfGetOrderHistory()の中で処理されているSQLに
dtb_order_detailテーブルをJOINで追加されたのでしょうか?

JOINした場合、SQLの結果行数がdtb_order_detailの件数になってしまい、
合計金額や件数など修正が必要な箇所が多いと思いますので、
JOINするよりは、
dtb_orderのSELECTした結果をループさせて、
ループ内でdtb_order_detailの内容を取得するSQLを発行したほうが既存部分は変更する必要が無く、
受注明細部分を追記するだけとなりますので、実装が楽ではないかと思います。
(DB接続が複数発生するので、あまり効率の良い方法ではありませんが)

LC_Page_Mypage.php function action()内
$array = $this->arrOrder;
foreach ($array as $k => $v) {
    $array[$k]['detail'] = **ここでdtb_order_detailの結果を取得する処理**(引数に$v['order_id']);
}
$this->arrOrder = $array;


index.tpl 購入履歴のループ内
<!--{section name=cnt loop=$arrOrder}-->

    <!--{section name=cnt2 loop=$arrOrder[cnt].detail}-->
        //ここで受注詳細情報を表示
    <!--{/section}-->

<!--{/section}-->


コードはあくまでイメージですので、実際はもっと記述が増えると思いますが・・・。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

yuh
投稿日時: 2017/5/17 12:18
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
その場合はdtb_order_detailをGROUP CONCAT で商品名:数量(改行)でまとめて1つの項目として取得すると楽に表示させることができますよ。


----------------


http://ec-lab.net/

himajin
投稿日時: 2017/5/17 15:29
対応状況: −−−
新米
登録日: 2017/5/16
居住地:
投稿: 4
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
ありがとうございます!

GROUP CONCATをネットで調べ、以下のテストをしてみた結果、間違いなくこれで大丈夫だと思います。

ただし、これをページで実行させる方法がわかりません…
どうか助けてください。

SELECT od.order_id, GROUP_CONCAT(de.product_name) as p_name 
FROM  dtb_order od, dtb_order_detail de 
WHERE od.order_id = de.order_id  
GROUP BY od.order_id
468
投稿日時: 2017/5/17 22:31
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
/data/class/pages/mypage/LC_Page_Mypage.php 118行目付近の
function lfGetOrderHistory()にSQLを実行する記述がありますので、
これを変更すれば良いのではないでしょうか?
ただ、ここの記述にgroup byをセットする記述が無いので、
$objQuery->setOrder($order);
の次の行あたりに
$objQuery->setGroupBy('od.order_id');
を追記する必要があると思います。

>yuhさん
GROUP_CONCAT()は初めて知りました。
便利な関数があるのですね。
いつも2つSQLを書いていたので勉強になりました。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

yuh
投稿日時: 2017/5/23 0:52
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる

lfGetOrderHistoryの

return $objQuery->select($col, $from, $where, $arrWhereVal);

の変わりに

$query = ' 
SELECT 
  order_id, 
  create_date, 
  payment_id,
  payment_total, 
  status, 
  ( 
    SELECT 
        GROUP_CONCAT(product_name separator "\n" ) 
    FROM 
        dtb_order_detail 
    WHERE 
        order_id = dtb_order.order_id 
  ) as product_name 
FROM 
  dtb_order 
WHERE 
  del_flg = 0 AND 
  customer_id = ? 
ORDER BY 
  order_id DESC'; 
return $objQuery->getAll($query,array($customer_id,SEARCH_PMAX, $startno));

こんな感じで書けばいけるんじゃないですか?
テストしてないんで動作はわかりませんが。
その処理の先にCOUNTしてる部分とかあるんで、その下に別にクエリを書いて処理を追加する感じです。
COUNT部分もSQL_CALC_FOUND_ROWS使って置き換えたい所ですが。


----------------


http://ec-lab.net/

himajin
投稿日時: 2017/6/1 17:29
対応状況: −−−
新米
登録日: 2017/5/16
居住地:
投稿: 4
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
ありがとうございます!
心より感謝いたします。

色んな方法でやってみましたが、「システムエラーが発生しました。」です…
デフォルトに戻してテストしても動きません…

 

 public function lfGetOrderHistory($customer_id, $startno = -1)
    {
        $objQuery   = SC_Query_Ex::getSingletonInstance();

        $col        = 'order_id, create_date, payment_id, payment_total, status';
        $from       = 'dtb_order';
        $where      = 'del_flg = 0 AND customer_id = ?';
        $arrWhereVal = array($customer_id);
        $order      = 'order_id DESC';

        if ($startno == -1) {
            return $objQuery->count($from, $where, $arrWhereVal);
        }

        $objQuery->setLimitOffset(SEARCH_PMAX, $startno);
        // 表示順序
        $objQuery->setOrder($order);

        //購入履歴の取得
        $query = ' 
		SELECT 
		    order_id, 
		    create_date, 
		    payment_id,
			payment_total, 
		status, 
		( 
		    SELECT
    			GROUP_CONCAT(product_name separator "\n" ) 
			FROM 
                dtb_order_detail 
			WHERE 
			    order_id = dtb_order.order_id 
		) as product_name 
		FROM 
    		dtb_order 
		WHERE 
    		del_flg = 0 AND 
			customer_id = ? 
		ORDER BY 
	    	order_id DESC'; 
return $objQuery->getAll($query,array($customer_id,SEARCH_PMAX, $startno));
    }


申し訳ありませんが、どうかご指導お願いします。
yuh
投稿日時: 2017/6/2 12:45
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる

$query = ' 
SELECT 
  order_id, 
  create_date, 
  payment_id,
  payment_total, 
  status, 
  ( 
    SELECT 
        GROUP_CONCAT(product_name separator "\n" ) 
    FROM 
        dtb_order_detail 
    WHERE 
        order_id = dtb_order.order_id 
  ) as product_name 
FROM 
  dtb_order 
WHERE 
  del_flg = 0 AND 
  customer_id = ? 
ORDER BY 
  order_id DESC
LIMIT ? OFFSET ?
'; 
return $objQuery->getAll($query,array($customer_id,SEARCH_PMAX, $startno));


LIMIT とOFFSETが抜けてました^^;


----------------


http://ec-lab.net/

himajin
投稿日時: 2017/6/5 11:45
対応状況: 解決済
新米
登録日: 2017/5/16
居住地:
投稿: 4
Re: 注文履歴一覧に商品名を表示すると商品数=注文件数になる
お見事です!!!

GROUP_CONCAT(product_name separator "\n" ) をそのまま入れるとエラーが発生し、separator "\n"を外すと”、”で分離され、グループ化されました。

ありがとうございます!!!!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
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.