バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 条件により支払方法を変更する

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hamachu
投稿日時: 2009/3/17 1:40
対応状況: −−−
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
条件により支払方法を変更する
-----------------------------------------------------------
[EC-CUBE] 2.3.3正式版
[PHP] 4.4.9
[データベース] PostgreSQL 7.4.12
[WEBサーバ] Apache/2.0.63
-----------------------------------------------------------

支払方法の選択画面で制御を行う必要があり、スレッドを立てさせていただきました。

例えば、"銀行振込"のみなど種類によって支払方法が限定される商品があります。
フラグを作成して(引用して)支払方法選択画面で"銀行振込"のみを表示させようとした場合どのようにすればよいか、どうぞお知恵をお貸しください。

実装したい具体的な機能としては、
『商品の「購入制限」の無制限にチェックが入っている商品』がカートに含まれない場合

・銀行振込のみ

『商品の「購入制限」の無制限にチェックが入っている商品』がカートに含まれる場合

・銀行振込
・代金引換

と条件分岐で「お支払方法」の表示をきりかえる。

何とぞよろしくお願いいたします。
tao_s
投稿日時: 2009/3/17 2:19
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 799
Re: 条件により支払方法を変更する
/data/class/pages/shopingのLC_Pages_Shopping_payment.phpのlfGetPaymentを変えないといけないと思います。

標準では支払い方法全部検索していますが、その前で、カート内商品に制限のかかった商品が含まれているか検索して、もしあれば、クエリに
 AND payment_id = 1 //←銀行振込のpayment_idを指定"

を追加すれば良いと思います。

出来れば制限のかかる支払い方法をDBから取得して、その支払方法が指定されている商品がカート内にあるかどうかを検索した方がスマートですね。


----------------
EC-CUBEカスタマイズ相談してください。
緊急のEC-CUBEの障害対応
EC-CUBEカスタマイズブログ

hamachu
投稿日時: 2009/3/17 3:00
対応状況: −−−
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
Re: 条件により支払方法を変更する
tao_sさん

早速のご返信ありがとうございます。


ご指導いただきましたとおり、

//payment_id = 3 → 銀行振込

//$arrRet = $objQuery->select(
"payment_id, payment_method, rule, upper_rule, note, payment_image",
"dtb_payment",
"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) "
);

//↓↓↓

$arrRet = $objQuery->select(
"payment_id, payment_method, rule, upper_rule, note, payment_image",
"dtb_payment",
"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) AND payment_id = 3 "
);


とすることで、"銀行振込"のみ表示することができました。
半日悩んでいたので、1歩前進といったところです。
ありがとうございます。


次に問題なのが、

引用:
カート内商品に制限のかかった商品が含まれているか検索


をどのように実装するかで、カートページで購入制限のフラグ「sale_unlimited」は取得できているのですが、ここからどのように展開すればよいか頭を悩ませております。

何とぞご指導よろしくお願いいたします。
seasoft
投稿日時: 2009/3/17 3:35
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: 条件により支払方法を変更する
引用:
次に問題なのが、

引用:
カート内商品に制限のかかった商品が含まれているか検索


をどのように実装するかで、カートページで購入制限のフラグ「sale_unlimited」は取得できているのですが、ここからどのように展開すればよいか頭を悩ませております。


「カート」ページではなく、「お支払方法・お届け時間等の指定」ページの処理では?
どちらのページも同様の構造で「sale_unlimited」は取得できていますね。

$objView->assignobj($this); の直前で、当該変数を回して判定して、結果を Smarty に引き継げばイケそうです。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

hamachu
投稿日時: 2009/3/17 10:28
対応状況: −−−
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
Re: 条件により支払方法を変更する
seasoftさん

ご返信ありがとうございます。

ご指導いただきましたとおり、

引用:

「カート」ページではなく、「お支払方法・お届け時間等の指定」ページの処理では?
どちらのページも同様の構造で「sale_unlimited」は取得できていますね。


確かに「お支払方法・お届け時間等の指定」ページでも「sale_unlimited」が取得できました!。

shopping>payment.tpl
<!--{section name=cnt loop=$arrProductsClass}-->
<!--{$arrProductsClass[cnt].sale_unlimited|escape}-->
<!--{/section}-->


payment.tplに記入することで「sale_unlimited」は取得できたのですが、
payment.phpでDEBUGしながら「sale_unlimited」を取得しようとしているのですが、つまづいております。

引用:

$objView->assignobj($this); の直前で、当該変数を回して判定して、結果を Smarty に引き継げばイケそうです。


アドバイスいただきました内容で方向性は見えましたが、実力不足で足踏み状態です。
具体的にご指導いただけませんでしょうか。
何とぞよろしくお願いいたします。
seasoft
投稿日時: 2009/3/17 11:41
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: 条件により支払方法を変更する
この辺りの関連値は、外部クラスで処理しているので、不透明で分かりづらいんですよね・・・ いずれ、改修したい部分の一つではありますが、現状の実装は、これはこれでページ側の処理はシンプルになって良い面もあるんですよね。

SQL をコントロールするのではなく、該当商品の有無によって、
・配列の部分削除
・Smarty での表示制御
のいずれかを行う方法でも対応できそうです。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

hamachu
投稿日時: 2009/3/17 17:14
対応状況: −−−
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
Re: 条件により支払方法を変更する
seasoftさん

ご丁寧なご返信ありがとうございます。
とりあえずはアドバイスを元に1つずつ進めたいと思います。

考え方としまして、まず、在庫無制限商品がカートにあった時と、無い時で分岐させました。

data>class>pages>shopping>LC_Page_Shopping_Payment.php の function lfGetPayment
//在庫無制限商品がないとして仮フラグを立てる
$museigen_chk_flg = 0;

if($museigen_chk_flg != "0"){ //在庫無制限商品がカートにあったとき
 	$arrRet = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image",
 	"dtb_payment",
 	"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) ");
} else {  //在庫無制限商品がカートにないときは銀行振込だけにする
	$arrRet = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image",
 	"dtb_payment",
 	"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) AND payment_id = 3 ");
}


あとは、カート内に在庫無制限の商品があった時に「$museigen_chk_flg ++;」でいけるかなと考えました。

そこで、data>class>SC_CartSession.php に「カートの中の売り切れチェック」
と、あったので参考にして以下を作成

data>class>SC_CartSession.php
// カートの中の無制限フラグチェック
function chkMuseigen($arrCartList, $is_mobile = false){
	$museigen_chk_flg = 0;
	foreach($arrCartList as $key => $val){
        if($val['sale_unlimited'] == 1){	//無制限の商品があるとき
		$museigen_chk_flg++;
        }
    }
    return $museigen_chk_flg;
}



data>class>pages>shopping>LC_Page_Shopping_Payment.php の function lfGetPayment
//カート内に無制限の商品があるかチェック
        $objCartSess = new SC_CartSession();
        $objCartSess->chkMuseigen($objCartSess->getCartList());


としてみましたが、うまく $museigen_chk_flg を取得できません。
どこが悪いか、ご指導いただけますでしょうか。
何とぞよろしくお願いいたします。
hamachu
投稿日時: 2009/3/17 17:53
対応状況: −−−
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
Re: 条件により支払方法を変更する
自己レスです。

data>class>pages>shopping>LC_Page_Shopping_Payment.php の function lfGetPayment
//カート内に無制限の商品があるかチェック
        $objCartSess = new SC_CartSession();
        $objCartSess->chkMuseigen($objCartSess->getCartList());
        $objCartSess->chkMuseigen($this);


上記を変更することで、$museigen_chk_flg は取得できるようになりました。
・・・がやたらforeachが回ってます。汗
もう一歩です。
hamachu
投稿日時: 2009/3/17 22:47
対応状況: 解決済
半人前
登録日: 2009/2/27
居住地: Tokyo
投稿: 11
Re: 条件により支払方法を変更する
自己レスです。

解決いたしましたので手順を再度まとめておきたいと思います。

追加>青文字


data>class>helper>SC_Helper_DB.php の該当箇所に以下を追加する
// ポイント付与率の登録
$objCartSess->setProductValue($arrCart[$i]['id'], 'point_rate', $arrData['point_rate']);

// 在庫無制限フラグ
$objCartSess->setProductValue($arrCart[$i]['id'], 'sale_unlimited', $arrData['sale_unlimited']);

// 商品ごとの合計金額
$objPage->arrProductsClass[$cnt]['total_pretax'] = $objCartSess->getProductTotal($arrInfo, $arrCart[$i]['id']);



data>class>SC_CartSession.php に 以下のクラスを追加
// カートの中の無制限フラグチェック
function chkMuseigen(){
	$museigen_chk_flg = 0;
	$max = $this->getMax();
	for($i = 1; $i <= $max; $i++) {
		$sale_unlimited = $_SESSION[$this->key][$i]['sale_unlimited'];
		if($sale_unlimited == "1"){	//無制限の商品があるとき
			$museigen_chk_flg ++;
		}
	}
	return $museigen_chk_flg;
}



data>class>pages>shopping>LC_Page_Shopping_Payment.php の function lfGetPayment に以下を追加
//カート内に無制限の商品があるかチェック($museigen_chk_flgの取得)
$objCartSess = new SC_CartSession();
$museigen_chk_flg = $objCartSess->chkMuseigen();

$objQuery = new SC_Query();
$objQuery->setorder("rank DESC");

//削除されていない支払方法を取得
//↓↓↓分岐処理追加
if($museigen_chk_flg != "0"){ //無制限商品がカートにあったとき

	$arrRet = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image",
	"dtb_payment",
	"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) ");

} else {  //無制限商品がカートにないときは銀行振込だけにする

	$arrRet = $objQuery->select("payment_id, payment_method, rule, upper_rule, note, payment_image",
	"dtb_payment",
	"del_flg = 0 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 0) AND payment_id = 3 ");
	//AND payment_id には表示させたい支払い方法を入れる → payment_id = 3 は 銀行振込

}



以上で、目的の機能を実装することができました。

変更追加に関しまして、未熟者のソースです。
もっとこうした方がいいなど、今後の参考される方のためにご指摘願えればと思います。

アドバイスを頂きました、tao_sさん、seasoftさんには大変感謝しております。
誠にありがとうございました。
tao_s
投稿日時: 2009/3/18 1:57
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 799
Re: 条件により支払方法を変更する
お疲れ様でした。これからも頑張ってください。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,962名です
総投稿数は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.