バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
allure
投稿日時: 2015/7/30 19:27
対応状況: −−−
半人前
登録日: 2014/1/21
居住地:
投稿: 18
条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・
下記の条件を満たす場合に記念品をプレゼントする企画があり、
購入手続きの最終確認画面にて、条件を満たしていれば自動的に購入商品リストに
プレゼント商品を追加するようにしたいと思います。

・購入金額が◯◯円以上
・先着◯◯名の方
・一人一回限り

準備として・・・

●プレゼント商品は通常の商品として登録することで、
 在庫数、販売制限数を設定して自動的に管理できるようにする
●「プレゼント」カテゴリーに入れ、カテゴリー表示をしないように設定する

ここまではいいのですが、
LC_Page_Shopping_Confirm_Ex.php ファイルに関数(下に添付)を作成し、
いろいろテストしている内に問題が出てきました。

条件を満たし、プレゼント商品が追加された後、最終確認画面からカートの中身に戻った場合、
プレゼント商品がリストされているのは問題ないのですが、
ここでプレゼント以外の商品を削除し、プレゼントの条件を満たさなくなった場合に
プレゼントがそのまま残ってしまうのが問題です。
そこで、最終確認画面で、条件に満たないのにカートにプレゼントが入っている場合に
プレゼントを削除するようにしようと思いました。

これがなかなか思うように動かず困っています。
カートに戻って以下の様な操作をした(かつプレゼント条件を満たしていない)場合の
最終確認画面での動作は次のようになりました。

●何か商品を削除した場合 --> プレゼントは削除されません。
●商品の数量を変更した場合 --> プレゼントは削除されません。
●何か商品を削除し、別の商品を追加した場合 --> プレゼントが削除されます。(希望通り)

新たに商品が追加された場合だけ、思い通りプレゼントが削除されるということは、
キャッシュとかが関係するのでしょうか?
何かを更新する操作を入れればいいのでしょうか?
ここから進めずギブアップ状態です。
どなたかヒントでも頂ければと思い投稿させていただきました。
何卒よろしくお願いいたします。m(_ _)m


LC_Page_Shopping_Confirm_Ex.php

▼action の「カートの商品を取得」の前に関数を呼び出し

        // カートにプレゼントを追加
        $this->addCartPresent();

        // カートの商品を取得
        $this->arrShipping = $objPurchase->getShippingTemp($this->is_multiple);
        $this->arrCartItems = $objCartSess->getCartList($this->cartKey);


▼関数の内容は以下のとおりです。

    public function addCartPresent()
    {
        // キャンペーン内容を設定
        $cam_start_date = '2015-07-28 00:00:00'; // 開始日 0000-00-00 00:00:00
        $cam_present_product = '528'; // プレゼント商品の product_class_id を指定
        $cam_present_quantity = '1'; // プレゼント商品の個数を指定
		$cam_present_price = '10000'; // 購入価格がこの金額以上であればプレゼント
        $send_present = ''; // 変数を空にする

        // プレゼントの条件
        $objCustomer = new SC_Customer_Ex();
        $customer_id = $objCustomer->getValue('customer_id');
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $arrOrderHistory = $objQuery->select('order_id, create_date, status, total', 'dtb_order', 'customer_id = ? AND del_flg = 0', array($customer_id));
        $objCartSess = new SC_CartSession_Ex();
        $check_total = $objCartSess->getAllProductsTotal($this->cartKey);
        
        // 今回、購入金額が条件を満たしていない場合はプレゼントしない
		if ($check_total < $cam_present_price) {
            $send_present = 'false';
        } else {
		// 購入金額クリア
            // キャンペーン開始日以降の購入履歴あり(既にプレゼントしているかどうか)
			if (isset($arrOrderHistory[0]['order_id'])) {
				foreach($arrOrderHistory as $key => $val){
                	if (strtotime($val['create_date']) >= strtotime($cam_start_date)) {
						if ($val['status'] != 3 && $val['total'] >= $cam_present_price) {
							$send_present = 'false';
                        	break ;
						} else {
							$send_present = 'true';
						}
                	} else {
                    	$send_present = 'true';
                	}
				}

			// 購入履歴なし(プレゼントする)
			} else {
				$send_present = 'true';
			}
		}

        // 条件に合えば、カートにプレゼントを追加する
        if ($send_present == 'true') {
            $objCartSess->addProduct($cam_present_product, $cam_present_quantity);
        } else {
			// 条件を満たしてないのにプレゼントがカートに入っていれば削除する
			$product_class_id_incart = $objCartSess->getAllProductClassID($this->cartKey);
			$present_incart = array_search($cam_present_product, $product_class_id_incart);
			if ($present_incart !== 'false') {
				$objCartSess->delProductKey('id', $cam_present_product, $this->cartKey);
			}
		}

	}


---------------------------------------------------------------
[EC-CUBE] 2.13.3
[レンタルサーバ] ローカルにてテスト中
[OS] Mac + MAMP
[PHP] PHP 5.2.17
[データベース] MySQL 5.5.29
---------------------------------------------------------------
yuh
投稿日時: 2015/7/30 22:57
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・
SC_CartSessionのcheckChangeCartに仕込んで
金額のチェックとプレゼントの追加・削除を仕込んでおけばできますよ。
一応商品詳細でその商品IDを入れても表示させないようにするのも入れといた方がいいかもですね。
allure
投稿日時: 2015/7/31 17:43
対応状況: −−−
半人前
登録日: 2014/1/21
居住地:
投稿: 18
Re: 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・
早速のお返事ありがとうございます。
やってみます。
allure
投稿日時: 2015/8/4 15:15
対応状況: −−−
半人前
登録日: 2014/1/21
居住地:
投稿: 18
Re: 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・
その後、いろいろ試してみているのですが思うように動かず、
いっそのこと、カートの中身を表示するページでは
プレゼントを表示しない(削除してしまう)ようにしようと考えました。
(最終画面でのプレゼント追加は問題なく動いているので。)

そこで、LC_Page_Cart_Ex.php ファイルで、
ページを表示する前にプレゼントがあれば削除しようと試みましたが、
上手く行かず、ならば、表示した後、商品の削除や数量を減らした時に
消してしまえないかと、switch の case down と delete に挿入してみました。

これをテストしたところ、既にカートに入っている商品を操作してもプレゼントは削除されず、
新たに商品を追加した後に、いずれかの商品(先にカートにあった商品でも)を削除 or 減数した場合は
プレゼントが削除されました。

恐らく、最初の問題もここにありそうです。(^_^;)
プレゼント追加の後に、新たに商品がカートに追加されたか否かで動作が変わります。
これについて、何か対処方法はありますでしょうか?

▼ LC_Page_Cart_Ex.php の action の一部(★追加部分を挿入)

switch ($this->mode) {
	case 'confirm':
		// カート内情報の取得
		$cartList = $objCartSess->getCartList($cartKey);
		// カート商品が1件以上存在する場合
		if (count($cartList) > 0) {
			// カートを購入モードに設定
			$this->lfSetCurrentCart($objSiteSess, $objCartSess, $cartKey);

			 // 購入ページへ
			SC_Response_Ex::sendRedirect(SHOPPING_URL);
			SC_Response_Ex::actionExit();
		}
		break;

	case 'up'://1個追加
		$objCartSess->upQuantity($cart_no, $cartKey);

		SC_Response_Ex::reload($arrQueryString, true);
		SC_Response_Ex::actionExit();
		break;

	case 'down'://1個減らす
		$objCartSess->downQuantity($cart_no, $cartKey);

		// プレゼントがカートに入っていたら削除する ----------- ★追加
		$this->deletePresent($cartKey);

		SC_Response_Ex::reload($arrQueryString, true);
		SC_Response_Ex::actionExit();
		break;

	case 'setQuantity'://数量変更
		$objCartSess->setQuantity($objFormParam->getValue('quantity'), $cart_no, $cartKey);

		SC_Response_Ex::reload($arrQueryString, true);
		SC_Response_Ex::actionExit();
		break;

	case 'delete'://カートから削除
		$objCartSess->delProduct($cart_no, $cartKey);

		// プレゼントがカートに入っていたら削除する ----------- ★追加
		$this->deletePresent($cartKey);

		SC_Response_Ex::reload($arrQueryString, true);
		SC_Response_Ex::actionExit();
		break;

	default:
		break;
}


▼ 作成した deletePresent

// プレゼントがカートに入っていれば削除する
public function deletePresent($cartKey)
{
	$cam_present_product = '528'; // プレゼント商品の product_class_id を指定
	$objCartSess = new SC_CartSession_Ex();
	$product_class_id_incart = $objCartSess->getAllProductClassID($cartKey);
	$present_incart = in_array($cam_present_product, $product_class_id_incart);
	if ($present_incart === true) {
		$objCartSess->delProductKey('id', $cam_present_product, $cartKey);
	}
}
yuh
投稿日時: 2015/8/5 1:11
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1818
Re: 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・

一応望む条件で動作するはずですが、細かくは調べてません。

めんどくさかったので若干負荷の高くなるように組んでます。

負荷を下げる方向で行くのであればいろいろ試して作り変えてください。

allure
投稿日時: 2015/8/5 15:40
対応状況: 解決済
半人前
登録日: 2014/1/21
居住地:
投稿: 18
Re: 条件を満たせば自動的にプレゼントを追加することは、出来たのですが・・・
わ!ソース書いて頂いて恐縮です。m(_ _)m
気持よく動きました!(^^)
とても勉強になります。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
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.