バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
infobitz
投稿日時: 2012/4/24 17:24
対応状況: −−−
半人前
登録日: 2010/2/23
居住地:
投稿: 12
SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
EC-CUBEの送料無料カスタマイズで対処法を考えております。
やりたいことと対処法は下記のとおりなのですが、SC_CartSession.phpから商品ステータスを取得する方法が分からず、頓挫しております。

アドバイスを頂ければ幸いです。

よろしくお願いします。

■やりたいこと
商品ステータスに「送料無料(idは6)」を設定している商品のみを購入の場合、送料を0円にしたいです。

■対処法
SC_CartSession.php 内の function calculate において、カート内の商品一覧から商品ステータスの情報を取得し、id6が全てチェックされている場合のみ、合計送料を0円にする




EC-CUBE 2.11.5
サーバーOS Linux s117 2.6.23.16-smp #3 SMP Sat May 1 16:58:37 JST 2010 i686
DBサーバー PostgreSQL 8.2.4
ゲスト
投稿日時: 2012/4/24 20:58
対応状況: −−−
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
dtb_products_classに対し
product_class_idからproduct_idを取り出して、
dtb_product_statusに対し
product_idからproduct_status_idを配列($arrProduct_status...とか)として取り出して、

$arrProduct_status[$j]が「6」だったら
$this->cartSession[$productTypeId][$i]['product_status] = $arrProduct_status[$j];
として、


        // 送料無料チェック
        if ($this->isDelivFree($productTypeId)) {
            $results['deliv_fee'] = 0;
        }


の部分に、

$this->cartSession[$productTypeId][$i]['product_status]
が全て「6」だったら
$results['deliv_fee'] = 0;

を追加する、、、とか。。。
↓をみながら、追ってみました、故、方針として合っているのかは、自信は無いです。。。

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=thread&topic_id=9123&forum=10&post_id=44346#forumpost44346

http://www.kudzilla.com/~hic/eccube-dev/test_code/grade/front/SC_CartSession_Ex.rtf
ID/PWD : hic/Ringo

p.s.
初め、product_idを、tpl側から突っ込もうと、考えましたが、
myページからの再発注で、ややこしくなりそうなので、
その時点で、考えるのを、止めました。
infobitz
投稿日時: 2012/4/26 17:30
対応状況: −−−
半人前
登録日: 2010/2/23
居住地:
投稿: 12
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
Ringo様

さっそくのお返事ありがとうございます。
その後、自力で色々といじってみたのですが、基本的なことが分かっておらず苦労しております。

流れとしましては、

$cartItems = $this->getCartList($productTypeId);

で、カート内データを取得した後、
$max = $this->getMax($productTypeId);

その後、$iでループ
for($i = 0; $i <= $max; $i++) {

その中のproduct_class_idを使ってdtb_products_classからproduct_idの一覧を取り出す。

取り出したproduct_idを使ってdtb_product_statusからproduct_status_idの配列を$arrProduct_statusとして取り出す。

こんなイメージでしょうか?

例:カート内の1つめのデータ
$i = 0
$arrProduct_status[$j] => 1,2,6

最も基本的なdtb_products_classからデータを取り出す方法は、こんな感じで良いのでしょうか?
$product_id = $objQuery->select("product_id","dtb_products_class","product_class_id = ?",array($this->cartSession[$productTypeId][$i]['productsClassId']));


基本から勉強したいと思います。
宜しくお願い致します。
ゲスト
投稿日時: 2012/4/26 19:13
対応状況: −−−
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
流れとしては、小生の意図した流れと同じなので、良いと思いますが、「じっ」と見ますと、

infobitz様は、
$cartItems = $this->getCartList($productTypeId);
後の、$cartItemsのレベルで、思考されている。

小生は、
cartSessionのレベルで、思考している。

の、食い違いが分かります。
故、現在は、

$cartItems = $this->getCartList($productTypeId);
で、カート内データを取得した後、
...
$product_id = $objQuery->select("product_id","dtb_products_class","product_class_id = ?",array($this->cartSession[$productTypeId][$i]['productsClassId']));

と、cartSessionと$cartItemsが、同一レベルで扱われているので、データが渡らない状態です。

今回の案件は、$cartItemsのレベルで、送料判定を行うので、infobitz様の方が良いと思います。

ので、where句へは、
$this->cartSession[$productTypeId][$i]['productsClassId']
ではなくて、
$cartItemsから取り出した productsClassId となります。

まずは、$cartItemsから、productsClassId を取り出してみてください。

($cartItemsからproductsClassIdが取れるかは、小生も、確認してみます。)
ゲスト
投稿日時: 2012/4/27 8:32
対応状況: −−−
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
探ってみました。


&#160; &#160; /**
&#160; &#160; &#160;* 送料無料条件を満たすかどうかチェックする
&#160; &#160; &#160;*
&#160; &#160; &#160;* @param integer $productTypeId 商品種別ID
&#160; &#160; &#160;* @return boolean 送料無料の場合 true
&#160; &#160; &#160;*/
&#160; &#160; function isDelivFree($productTypeId) {
&#160; &#160; &#160; &#160; $objDb = new SC_Helper_DB_Ex();

&#160; &#160; &#160; &#160; $subtotal = $this->getAllProductsTotal($productTypeId);
&#160; &#160; &#160; &#160;&#160;

&#160; &#160; &#160; &#160; &#160; // 「なべ」と「アイス」を買って、$cartItemsをdumpすると「現在のカゴの中」の上部に表示される。
&#160; &#160; &#160; &#160; $cartItems = $this->getCartList($productTypeId);
&#160; &#160; &#160; &#160; &#160; var_dump($cartItems);
&#160; &#160; &#160; &#160;&#160;
&#160; &#160; &#160; &#160; &#160; // 表示結果から、product_class_idをdumpしてみる。
&#160; &#160; &#160; &#160; &#160; echo("<br />");
&#160; &#160; &#160; &#160; &#160; var_dump($cartItems[0][productsClass][product_class_id]);
&#160; &#160; &#160; &#160; &#160; echo("<br />");
&#160; &#160; &#160; &#160; &#160; var_dump($cartItems[1][productsClass][product_class_id]);

&#160; &#160; &#160; &#160; // 全てが送料無料の場合

&#160; &#160; &#160; &#160; &#160; // product_class_idを使ってdtb_products_classからproduct_idを取り出す。
&#160; &#160; &#160; &#160; &#160; // 取り出したproduct_idを使ってdtb_product_statusからproduct_status_idの配列を$arrProduct_statusとして取り出す。
&#160; &#160; &#160; &#160; &#160; // $productTypeId毎の$arrProduct_statusの全てに「6」が含まれていたら return true;


&#160; &#160; &#160; &#160; // 送料無料の購入数が設定されている場合
&#160; &#160; &#160; &#160; if (DELIV_FREE_AMOUNT > 0) {
&#160; &#160; &#160; &#160; &#160; &#160; // 商品の合計数量
&#160; &#160; &#160; &#160; &#160; &#160; $total_quantity = $this->getTotalQuantity($productTypeId);

&#160; &#160; &#160; &#160; &#160; &#160; if($total_quantity >= DELIV_FREE_AMOUNT) {
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; return true;
&#160; &#160; &#160; &#160; &#160; &#160; }
&#160; &#160; &#160; &#160; }

&#160; &#160; &#160; &#160; // 送料無料条件が設定されている場合
&#160; &#160; &#160; &#160; $arrInfo = $objDb->sfGetBasisData();
&#160; &#160; &#160; &#160; if ($arrInfo['free_rule'] > 0) {
&#160; &#160; &#160; &#160; &#160; &#160; // 小計が無料条件を超えている場合
&#160; &#160; &#160; &#160; &#160; &#160; if($subtotal >= $arrInfo['free_rule']) {
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; return true;
&#160; &#160; &#160; &#160; &#160; &#160; }
&#160; &#160; &#160; &#160; }

&#160; &#160; &#160; &#160; return false;
&#160; &#160; }

infobitz
投稿日時: 2012/4/27 16:25
対応状況: −−−
半人前
登録日: 2010/2/23
居住地:
投稿: 12
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
Ringo 様
ありがとうございます。

ご享受頂いた情報を元に、以下の部分を作成してみました。

// 送料無料チェック2
$objQuery = new SC_Query_Ex();
$cartItems = $this->getCartList($productTypeId);
$max = $this->getMax($productTypeId);

for($i = 0; $i <= $max -1 ; $i++) {
$product_id = $objQuery->select("product_id","dtb_products_class","product_class_id = ?",array($cartItems[$i][productsClass][product_class_id]));
$arrProduct_status = $objQuery->select("product_status_id","dtb_product_status","product_id = ?",$product_id[0][product_id]);
var_dump($arrProduct_status);
}



また、この時点でdumpの結果を見ると下記のようになりました。

array(3) { [0]=> array(1) { ["product_status_id"]=> string(1) "4" } [1]=> array(1) { ["product_status_id"]=> string(1) "6" } [2]=> array(1) { ["product_status_id"]=> string(1) "7" } }
array(1) { [0]=> array(1) { ["product_status_id"]=> string(1) "6" } }
array(3) { [0]=> array(1) { ["product_status_id"]=> string(1) "4" } [1]=> array(1) { ["product_status_id"]=> string(1) "6" } [2]=> array(1) { ["product_status_id"]=> string(1) "7" } }

商品がカゴに3つ入った状態です。
それぞれの商品のproduct_status_idは、下記のようになっております。

 商品1 4,6,7
 商品2 6
 商品3 4,6,7

今の状態ですが、配列$arrProduct_statusの中に、さらに配列が入り、それぞれのarray[0]の中にproduct_status_idが入っていると考えれば良いのでしょうか。

この後、配列の中に"6"があるかを調べたいのですが、in_arrayを使うと全てNULLと判定されています。
配列内配列が原因だと思うのですが、よく分かっておりません。

配列の使いかたをもう少し勉強する必要がありそうです。
ゲスト
投稿日時: 2012/4/27 22:22
対応状況: −−−
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
引用:
今の状態ですが、配列$arrProduct_statusの中に、さらに配列が入り、それぞれのarray[0]の中にproduct_status_idが入っていると考えれば良いのでしょうか。

「array[0]の中」は、dumpの表示上、そう見えるだけです。
というか、そういうふうには、見えない,見ない、、、ですが、、、(^^;

これが、連想配列なので、in_arrayでは取り出せないです。
なので、今回の場合は、$iの内側で、$jを回して取り出します。

ちなみに、$jのmax値は、countで得ます。
infobitz
投稿日時: 2012/4/28 13:03
対応状況: −−−
半人前
登録日: 2010/2/23
居住地:
投稿: 12
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
Ringo様

なるほどそういう風に見えるだけ(そもそもそうは見ない^^;)だったわけですね
了解いたしました。

下記のコードをfunction isDelivFreeに追加することで一応想定通りの挙動になりました。
ループ周りの処理がかなり汚い感じがしますが一応動いております。

Ringo様のお陰で少しは理解が進んだとおもいます。
本当にありがとうございました。

これからも勉強していきますのでよろしくお願い致します。


// 送料無料チェック2
$objQuery = new SC_Query_Ex();
$cartItems = $this->getCartList($productTypeId);
$max = count($cartItems);
$k = 0;

for($i = 0; $i <= $max -1 ; $i++) {
$product_id = $objQuery->select("product_id","dtb_products_class","product_class_id = ?",array($cartItems[$i][productsClass][product_class_id]));
$arrProduct_status = $objQuery->select("product_status_id","dtb_product_status","product_id = ?",array($product_id[0][product_id]));
$max2 = count($arrProduct_status);
if($arrProduct_status[$i]["product_status_id"] == NULL){$k = 1; break;}
for($j = 0; $j <= $max2 ; $j++) {
if($arrProduct_status[$j]["product_status_id"] == 6){
$k = 0;
$j = $max2;
break;
}else{
$k = 1;
}
}
}
if ($k == 0) {
return true;
}
ゲスト
投稿日時: 2012/4/29 16:47
対応状況: −−−
Re: SC_CartSession.php から商品ステータスの情報を取得する方法を教えて下さい
product_id、、、ですが、$cartItemsの中に居ました。。。m(..)m

あと、phpでの配列ですが、、、phpでは、foreach、、、
後々の為にも、習得されることをお薦めします。

http://php.net/manual/ja/control-structures.foreach.php
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

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