バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > 商品ごとに代引き支払不可を設定したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
shin_shin
投稿日時: 2011/5/26 10:05
対応状況: −−−
常連
登録日: 2008/9/17
居住地:
投稿: 48
商品ごとに代引き支払不可を設定したい
いつもこちらで勉強させて頂いております。
今回の題名と似ているものを参考にしておりましたが、今回のケースとは逆の仕様を希望していることと最後までうまくいっているのか不明の為、改めて投稿させて頂きます。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=4906&forum=10

変更したい内容と背景を説明しますと、
一部の商品が工場直送の商品があるため、
配送伝票にeコレクト伝票を記入できない為、支払方法選択画面で代引き項目を非表示にさせたいということです。

希望する変更内容としては、
商品マスタ登録で
代引き不可というチェックボックスをつけ、
チェックが付いている商品は支払方法の代引きを非表示にする

という内容です。


既出であれば、申し訳ございません。


何卒ご教授お願い申し上げます。
patapata
投稿日時: 2011/5/26 18:34
対応状況: −−−
仙人
登録日: 2010/7/7
居住地: 神奈川県
投稿: 502
Re: 商品ごとに代引き支払不可を設定したい
Ver2.11.1でしたら・・・
ダウンロード商品で何をやっているかを解析するといいと思いますよ。

----
私は詳しい動作しりませんが、確かこういった要望に備えて、カスタマイズ性を考慮してカートを二つに分けたとかなんとか・・・
やってたと思います。
shin_shin
投稿日時: 2011/5/30 15:34
対応状況: −−−
常連
登録日: 2008/9/17
居住地:
投稿: 48
Re: 商品ごとに代引き支払不可を設定したい
ご返信ありがとうございます。
Ver.2.11は標準装備なのですか?

ダウンロード販売のモジュールを以下のクオーレ様から取得したのですが、
https://ec.cuore.jp/index.php
カスタマイズするのは・・・
大変そうです。
どっから手をつけてよいのか・・・

いま、過去のフォーラムにありました
【条件により支払方法を変更する】
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=3617&forum=10&post_id=14378
を参考に特定商品のみ代引き非表示にするというカスタマイズを考えています。

方法として、
product.tplの
公開・非公開のロジックをコピーして
daibikiというラジオボタンでフラグ追加

データベースにdaibikiカラム追加。

そのフラグを元に上記URLを参考にして代引き以外の支払方法を表示させようと考えました。

おそらく、この仕組みで出来ると思うのですが、
初歩的な商品公開・非公開のロジックコピーができません。。。

product.tplに
<tr>
<td bgcolor="#f2f1ec" width="160" class="fs12n">代引表示設定<span class="red"> *</span></td>
<td bgcolor="#ffffff" width="557" class="fs12n"><input type="radio" name="daibiki" value="1" <!--{if $arrForm.daibiki == "1"}-->checked<!--{/if}-->/>表示<input type="radio" name="daibiki" value="2" <!--{if $arrForm.daibiki == "2"}-->checked<!--{/if}--> />非表示</td>
</tr>

を追加。

LC_Page_Admin_Products_Productsの
FORMデータの引継ぎ部分に以下のようにdaibikiを追加。

// FORMデータの引き継ぎ
$this->arrForm['status,daibiki'] = DEFAULT_PRODUCT_DISP; // 公開・非公開のデフォルト値

しかしながら、データベースの新規追加したdaibikiカラムにデータが反映されません。

このほかにも修正しないといけない箇所があると思うのですが、
どなかた、ご教授いただけますでしょうか?
shin_shin
投稿日時: 2011/5/31 12:21
対応状況: −−−
常連
登録日: 2008/9/17
居住地:
投稿: 48
Re: 商品ごとに代引き支払不可を設定したい
上記の質問に関して、データベースに反映させることは成功しました。

引き続き、非表示フラグ=2が付いている商品を代引き非表示させる作業をがんばって見ます。


参考までに成功した手順を記載します。
前述していた方法ではなく、mtb_daibikiを作成しました。



代引き表示機能のテーブル作成

CREATE TABLE mtb_daibiki (
id int2,
name text,
rank int2 NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);

値を挿入
INSERT INTO mtb_daibiki VALUES (1,'表示',0);
INSERT INTO mtb_daibiki VALUES (2,'非表示',1);


商品登録の入力画面に代引き表示機能の項目を追加

/data/Smarty/templates/default/admin/products/product.tpl

<tr>
<td bgcolor="#f2f1ec" width="160" class="fs12n">代引き表示設定<span class="red"> *</span></td>
<td bgcolor="#ffffff" width="557" class="fs12n"><input type="radio" name="daibiki" value="1" <!--{if $arrForm.daibiki == "1"}-->checked<!--{/if}-->/>表示 <input type="radio" name="daibiki" value="2" <!--{if $arrForm.daibiki == "2"}-->checked<!--{/if}--> />非表示</td>
</tr>

代引き表示機能のデフォルト値をINSERT

INSERT INTO mtb_constants (id,name,remarks) VALUES
('DEFAULT_PRODUCT_DAIBIKI','1','1:表示 2:非表示');


data/mtb_consants_init.phpにもデフォルト追加(DEFAULT_PRODUCT_DISPの下辺り)
/** 1:表示 2:非表示 */
define('DEFAULT_PRODUCT_DAIBIKI', 1);

代引き表示機能のマスターデータを取得するやつ追加

$this->arrDAIBIKI = $masterData->getMasterData("mtb_daibiki");

デフォルト値を渡す変数追加
/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php


if($this->arrForm['daibiki']==""){
$this->arrForm['daibiki'] = DEFAULT_PRODUCT_DAIBIKI;


確認画面に表示処理追記
/data/Smarty/templates/default/admin/products/confirm.tpl


<td bgcolor="#f2f1ec" width="160" class="fs12n">代引き表示機能</td>
<td bgcolor="#ffffff" width="557" class="fs12n">
<!--{$arrUPSELL[$arrForm.upsell]}-->
</td>
</tr>
<!--{if $arrForm.upsell==1}-->
<tr>
<td bgcolor="#f2f1ec" width="160" class="fs12n">代引き表示対象商品</td>
<td bgcolor="#ffffff" width="557" class="fs12n">
<!--{$arrUpsellList[$arrForm.upsell_product_id]|escape}-->
</td>
</tr>
<!--{/if}-->
<tr>

DBに登録するため、dtb_products_classにカラム追加

ALTER table dtb_products_class add daibiki int2 NOT NULL DEFAULT 2;

DBに登録処理
data/class/util/SC_Utils.php

$sqlval['daibiki'] = $arrList['daibiki'];

上記の方法で現在のところ、商品登録にて代引き表示設定をしたら編集時にも反映されているのを確認しました。

間違い、追加変更しないといけない箇所などございましたら何卒ご指摘お願いします。
shin_shin
投稿日時: 2011/5/31 15:31
対応状況: −−−
常連
登録日: 2008/9/17
居住地:
投稿: 48
Re: 商品ごとに代引き支払不可を設定したい
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=3617&forum=10&post_id=14378

の「条件により支払方法を変更する」を参考にしていますが、上手くいきません。

今回の違いを考えると、私が作成した条件設定は
新規に「mtb_daibiki」をつくり、代引き表示=1 代引き非表示=2としました。

参考にさせて頂いているものを見ると、
dtb_productsの無制限チェックボックスを引用しています。

私が作成しているものは、フラグは
dtb_products_classに格納されています。

それを元に、
以下の作業をしましたが、上手くいきません。
というか、何もかわりません。
まず、
1.data>class>helper>SC_Helper_DB.php の該当箇所に以下を追加しました。

// ポイント付与率の登録
$objCartSess->setProductValue($arrCart[$i]['id'], 'point_rate', $arrData['point_rate']);

// //2011-05-31代引き表示フラグ追加
$objCartSess->setProductValue($arrCart[$i]['id'], 'daibiki', $arrData['daibiki']);



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

2.data>class>SC_CartSession.php に 以下のクラスを追加しました。

// カートの中の無制限フラグチェック
function chkdaibiki(){
$daibiki_chk_flg = 2;
$max = $this->getMax();
for($i = 1; $i <= $max; $i++) {
$daibiki = $_SESSION[$this->key][$i]['daibiki'];
if($daibiki == "1"){ //非表示設定がONの時
$daibiki_chk_flg ++;
}
}
return $daibiki_chk_flg;
}


3.data>class>pages>shopping>LC_Page_Shopping_Payment.php の function lfGetPayment に以下を追加しました。

//カート内に代引き非表示の商品があるかチェック($daibiki_chk_flgの取得)
$objCartSess = new SC_CartSession();
$daibiki_chk_flg = $objCartSess->chkdaibiki();



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



//削除されていない支払方法を取得
//↓↓↓分岐処理追加
if($daibiki_chk_flg != "1"){ //代引表示商品がカートにあったとき



$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 = 2 AND deliv_id IN (SELECT deliv_id FROM dtb_deliv WHERE del_flg = 2) AND payment_id = 10 AND payment_id = 6 AND payment_id = 7 ");
//AND payment_id には表示させたい支払い方法を入れる

}

参考にさせて頂いているものは、
該当のフラグがあるときは、銀行振り込みだけにするというものですが、私の場合は、代引きのみを非表示にするということなので、
payment_idを10.6.7(銀行振込、クレジット、コンビニ、)という風に表示させたいのですが、記述がこれでよいのかわかりません。

また、

SC_Helper_DB.phpの追加表記方法ですが、
// //2011-05-31代引き表示フラグ追加
$objCartSess->setProductValue($arrCart[$i]['id'], 'daibiki', $arrData['daibiki']);

これも違う気がします。

dtb_productsにはフラグデータがないので、
mtb_daibikiから取得しないといけないのですが、記述方法がわかりません。

参考にしているフラグの取得方法はチェックボックスですが、今回私が作ったのは、ラジオボタンになり、0or1ではなく、1or2なのでこの辺も記載ミスなのかと思います。

どなたかご教授いただけますでしょうか?

何卒宜しくお願いします
shin_shin
投稿日時: 2011/6/1 4:38
対応状況: 確認中
常連
登録日: 2008/9/17
居住地:
投稿: 48
Re: 商品ごとに代引き支払不可を設定したい
自己レスです。
再度、やり直し、
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=3617&forum=10&post_id=14378
を参考に一からまねてみました。

結果は、商品の「購入制限」の無制限にチェックが入っていない商品のみ、支払方法から代金引換を非表示に出来ました。
※クレジット、コンビニ、銀行振り込みのみ。

しかしながら、「購入制限」の無制限のチェックありとなしの混在の場合は、代金引換が表示されてしまいます。

本来のやりたいことは、テーブルdtb_productsに「sale_unlimited」と同様のカラム「daibiki_flg]を作成し、そのフラグを元に代金引換の表示、非表示設定を行いたいのですが、
うまくいきません。

成功した手順と失敗した手順を記述しますのでアドバイスいただけますようお願い申し上げます。

成功した手順

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=6 OR payment_id=7 OR payment_id=10 ");
//AND payment_id には表示させたい支払い方法を入れる → payment_id = 6 は 銀行振込 payment_id = 7はコンビニ payment_id = 10クレジット


この方法では当然ながら上手くいきました。
※hamachu様の解決方法をまねておりますので。

しかし、フラグの0と1の混在の場合は、フラグ=1の分岐elseの方へはいきません。

失敗した手順

代引きフラグの追加
dtb_productsに
カラム:daibiki_flg
データ型:smallint
を追加。
デフォルト値は0を登録。

フロント表示側
data/Smarty/templates/default/detail.tpl
代金引換選択が不可の表示をさせたい箇所に以下を記載

<!--以下を追加-->
<!--{if $arrProduct.daibiki_flg == 1}-->
<div>
<p class="price">工場直送の為、お支払の代金引換の選択は出来ません</p>
</div>
<!--{/if}-->
<!--ここまで-->

管理画面側
data/Smarty/templates/default/admin/products/product.tpl
今回は商品ステータスの下あたりに入れました。

<!--以下を挿入-->
<tr class="fs12n">
<td bgcolor="#f2f1ec" width="160">代引き表示フラグ(チェックONで非表示)</td>
<td bgcolor="#ffffff" width="557">
<label><input type="checkbox" name="daibiki_flg" value="1" <!--{if $arrForm.daibiki_flg == 1}-->checked="checked"<!--{/if}--> />代引き非表示</label>
</td>
</tr>
<!--ここまで-->

ロジックファイルの編集
data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

lfRegistProductメソッドに以下を追記。
"daibiki_flg"

// INSERTする値を作成する。の箇所にも
$sqlval['daibiki_flg'] = $arrList['daibiki_flg'];
を追加しました。

lfConvertParamメソッドに以下を追加しました。
$arrConvList['daibiki_flg'] = "n";

vw_products_allclass_detail に
カラム:daibiki_flg
データ型:smallint
を追加。

ビューvw_products_nonclass にも
カラム:daibiki_flg
データ型:smallint
を追加。

フラグ追加はここまで。

この段階で、商品登録ページで代金引換フラグを入れると、
フロント側には注意書きが反映し、また、管理画面で商品の編集から入っても代金引換フラグにチェックが登録されているのを確認しています。

次に、hamachu様の解決方法を参考に自分なりに変更して登録してみました。

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']);


//2011-05-31代引き表示フラグ追加 $objCartSess->setProductValue($arrCart[$i]['id'], 'daibiki_flg', $arrData['daibiki_flg']);


// 商品ごとの合計金額
$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;
}



// カートの中の代引き表示フラグチェック
function chkDaibiki(){
$daibiki_chk_flg = 0;
$max = $this->getMax();
for($i = 1; $i <= $max; $i++) {
$daibiki_flg = $_SESSION[$this->key][$i]['daibiki_flg'];
if($daibiki_flg == "1"){ //代引き表示の商品があるとき
$daibiki_chk_flg ++;
}
}
return $daibiki_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();



//カート内に代引き非表示の商品があるかチェック($daibiki_chk_flgの取得)
$objCartSess = new SC_CartSession();
$daibiki_chk_flg = $objCartSess->chkDaibiki();


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


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


//削除されていない支払方法を取得
//↓↓↓分岐処理追加
if($daibiki_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=6 OR payment_id=7 OR payment_id=10 ");
//AND payment_id には表示させたい支払い方法を入れる → payment_id = 6 は 銀行振込 payment_id = 7はコンビニ payment_id = 10クレジット



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=6 OR payment_id=7 OR payment_id=10");
//AND payment_id には表示させたい支払い方法を入れる

}


これで上手くいくと思ったのですが、結果は、フラグに関係無しに全商品が分岐のelse処理の代金引換非表示になってしまいました。

おそらく、sale_unlimitedとdaibiki_flgが同様のチェック機能を果たしていないからだと思うのですが、私にはその違いがわからず、途方にくれた状態です。。。
あと少しだと思うのですが、硬い高い壁にぶち当たってしまいました。

何卒、ご教授お願い致します。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1295
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.