バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 2.13系メール便の対応について

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
harusame
投稿日時: 2014/7/30 17:05
対応状況: −−−
半人前
登録日: 2014/7/30
居住地: 奈良
投稿: 27
2.13系メール便の対応について
初投稿の為、至らない点につきましてはお許し下さい。


下記サイトを参考にさせて頂き、
http://tech.bandersnatch.jp/181
ヤマト運輸の「宅急便」と「メール便」を同時に選択できるようにしたいと考えております。


複数購入の場合に、
メール便可能な商品と、宅急便のみ選択可能な商品、
双方がカートに入っている場合は、メール便を選択できないようにする。
などなどのサイトを参考にカスタマイズを行っておりました。


サイト内で紹介されている方法は、
1:商品マスターにメール便対応フラグを追加する
2:商品画面で表示をメール便対応フラグに応じて変化
3:カートの中身に応じてカート画面の表示を変更
4:カートの中身に応じて配送方法の選択でメール便を表示しない
5:配送方法の選択でメール便が選ばれた場合に着日指定をさせないようにする
のような順序で説明されております。


1と2は多少変更しつつカスタマイズできたのですが、
3以降につきまして、ver.2.13での変更点が多く、
対応することができませんでした。


試行錯誤致しておりましたが、初心者の為、完全に行き詰ってしまい、最終手段として投稿をさせて頂きました。
何か有効な解決方法があればお教え頂けないでしょうか。

やはり勉強しかないでしょうか。

場違いな投稿の場合、申し訳ございません。

------------------------------------------------------------------------------------------
[EC-CUBE ver.] :2.13.1
[レンタルサーバ] WebARENA SuiteX
[OS] Linux dc51.etius.jp 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 Apache
[PHP] 5.3.3
[データベース] MySQL 5.1.36-community-log
------------------------------------------------------------------------------------------
bucchi
投稿日時: 2014/8/3 14:21
対応状況: −−−
一人前
登録日: 2014/4/28
居住地: 関東
投稿: 72
Re: 2.13系メール便の対応について
具体的にどの部分で行き詰ってしまっているのかを
書いたほうが周りも返答しやすいかと思われます。

>> 3:カートの中身に応じてカート画面の表示を変更

で行き詰まっているとありますが、
画面の改修がうまくいっていないということでしょうか。
harusame
投稿日時: 2014/8/3 18:11
対応状況: −−−
半人前
登録日: 2014/7/30
居住地: 奈良
投稿: 27
Re: 2.13系メール便の対応について
ご指摘ありがとうございます。
知識不足の為、
具体的にどこまで記載できるかわかりませんが、記述してみます。

基本的に、
バージョンが違うとやはり、コードに大きく変更を加えないといけないのでしょうか。
勉強不足が悔やまれます…。


3:カートの中身に応じてカート画面の表示を変更
上記カスタマイズにおいて、
/data/class/helper/Sc_Helper_Purchase.php
へ以下の関数を追加とあるのですが、

▼Sc_Helper_Purchaseへ追加

function checkMailDeliverAvailable($productTypeId, &$objCartSession) {

$available = false;

// カート内の情報を取得
$items = $objCartSession->getCartList($productTypeId);
if (count(array_keys($items))) {
$available = true;
foreach (array_keys($items) as $key) {
$item = & $items[$key];
$product = & $item['productsClass'];
if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) {
continue;
} else {
$available = false;
}
}
}
return $available;
}

▲ここまで


コードの追加場所はどこでも問題ないのでしょうか。

Sc_Helper_Purchase内の一番最後に下記を追加したのですが、
追加に誤りがあるのでしょうか。


▼下記を追加

public function checkMailDeliverAvailable($productTypeId, &$objCartSession)
{

$available = false;

// カート内の情報を取得
$items = $objCartSession->getCartList($productTypeId);
if (count(array_keys($items))) {
$available = true;
foreach (array_keys($items) as $key) {
$item = & $items[$key];
$product = & $item['productsClass'];
if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) {
continue;
} else {
$available = false;
}
}
}
return $available;
}

▲ここまで


商品情報の「mail_deliver_enabled」のフラグが全部立っているか確認するコードのようなのですが、
コードを追加したのですが、
フラグを確認してくれていないように思われます。

その後のカスタマイズを進めていっても、
フラグに反応していないようで、
下記カスタマイズ
4:カートの中身に応じて配送方法の選択でメール便を表示しない
を行っても、
カート内商品がどんな状態であっても、
「宅急便」「メール便」両方が表示されてしまいます。

ver.2.13用にどこか修正しないといけないのでしょうか。

ver.2.12で運用した方がよかったのかと後悔しております…。
今さらバージョン変更ができない為、解決策を毎日探っております。

そもそもこのコードが原因かどうかも現在わかっていない状態の為、
原因究明ができましたら、追記もさせて頂こうかと思っております。
yuh
投稿日時: 2014/8/3 20:59
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 2.13系メール便の対応について
MAIL_DELIVER_ENABLEDはちゃんと設定されてますか?
getCartListから帰ってくるデータにmail_deliver_enabledは入ってますか?

もしかしたら

if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) 

この部分で$product['mail_deliver_enabled']にデータが入ってなくてMAIL_DELIVER_ENABLEDが設定されてないのが原因でtrueになってすべてチェックが通ってるんじゃないですか?
harusame
投稿日時: 2014/8/4 11:42
対応状況: −−−
半人前
登録日: 2014/7/30
居住地: 奈良
投稿: 27
Re: 2.13系メール便の対応について
ありがとうございます。確認を致しました。

データベース上の設定確認でよろしかったのでしょうか。

getCartListから帰ってくるデータにmail_deliver_enabledが入っているのか、
どちらを確認すべきかわからなかった為、
長文となってしまいますが、順に記載させていただこうと思います。
申し訳ございません。


設定につきましては、

●dtb_products内に、
┣名前:mail_deliver_enabled
┣データ型:SMALLINT
┣長さ/値:6
┣デフォルト値:ユーザー定義 0
┗その他項目:記入なし

上記のようにカラムを増やしております。


●/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php内に、

public function lfInitFormParam(&$objFormParam, $arrPost)
{
$objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品名', 'name', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品カテゴリ', 'category_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('公開・非公開', 'status', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品ステータス', 'product_status', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('メール便対応', 'mail_deliver_enabled', INT_LEN, 'an', array('SPTAB_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
--------以下省略--------

上記のように「商品ステータス」の下に追加しました。

そして、

●/data/mtb_constants_init.php内に、

/** 1:メール便対応 0:メール便非対応 */
define('MAIL_DELIVER_DISABLED', 0);

上記を追加

●/html/install/sql/insert_data.sql内に、

INSERT INTO mtb_constants (id, name, rank, remarks) VALUES ('MAIL_DELIVER_ENABLED', '1', 1603, 'メール便対応');
INSERT INTO mtb_constants (id, name, rank, remarks) VALUES ('MAIL_DELIVER_DISABLED', '0', 1603, 'メール便非対応');

上記クエリを追加

●mtb_constantsに上記クエリを実行し追加

●mtb_constantsキャッシュを削除

●/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php内に、

public function lfSetViewParam_InputPage(&$objUpFile, &$objDownFile, &$arrForm)
{
// カテゴリマスターデータ取得
$objDb = new SC_Helper_DB_Ex();
list($this->arrCatVal, $this->arrCatOut) = $objDb->sfGetLevelCatList(false);

if (isset($arrForm['category_id']) && !is_array($arrForm['category_id'])) {
$arrForm['category_id'] = SC_Utils_Ex::jsonDecode($arrForm['category_id']);
}
$this->tpl_json_category_id = !empty($arrForm['category_id']) ? SC_Utils_Ex::jsonEncode($arrForm['category_id']) : SC_Utils_Ex::jsonEncode(array());
if ($arrForm['status'] == '') {
$arrForm['status'] = DEFAULT_PRODUCT_DISP;
}
if($arrForm['mail_deliver_enabled'] == '') {
$arrForm['mail_deliver_enabled'] = MAIL_DELIVER_DISABLED;
}
if ($arrForm['product_type_id'] == '') {
$arrForm['product_type_id'] = DEFAULT_PRODUCT_DOWN;
}
--------以下省略--------

上記のように「status」の下に追加しました。

●/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php内に、

public function lfRegistProduct(&$objUpFile, &$objDownFile, $arrList)
{
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objDb = new SC_Helper_DB_Ex();

// 配列の添字を定義
$checkArray = array('name', 'status',
'main_list_comment', 'main_comment',
'deliv_fee', 'comment1', 'comment2', 'comment3',
'comment4', 'comment5', 'comment6',
'sale_limit', 'deliv_date_id', 'maker_id', 'note');
$arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);

// INSERTする値を作成する。
$sqlval['name'] = $arrList['name'];
$sqlval['status'] = $arrList['status'];
$sqlval['mail_deliver_enabled'] = $arrList['mail_deliver_enabled'];
$sqlval['main_list_comment'] = $arrList['main_list_comment'];
$sqlval['main_comment'] = $arrList['main_comment'];
$sqlval['comment1'] = $arrList['comment1'];
$sqlval['comment2'] = $arrList['comment2'];
$sqlval['comment3'] = $arrList['comment3'];
$sqlval['comment4'] = $arrList['comment4'];
$sqlval['comment5'] = $arrList['comment5'];
$sqlval['comment6'] = $arrList['comment6'];
$sqlval['deliv_date_id'] = $arrList['deliv_date_id'];
$sqlval['maker_id'] = $arrList['maker_id'];
$sqlval['note'] = $arrList['note'];
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$sqlval['creator_id'] = $_SESSION['member_id'];
$arrRet = $objUpFile->getDBFileList();
$sqlval = array_merge($sqlval, $arrRet);
--------以下省略--------

上記のように「status」の下に追加しました。


以上のような設定を行っています。



※こちらに記入しながら確認していましたところ、下記に疑問を感じ修正を行いました。

・/data/mtb_constants_init.php内の、

/** 1:メール便対応 0:メール便非対応 */
define('MAIL_DELIVER_DISABLED', 0);

上記から下記に訂正

/** 1:メール便対応 0:メール便非対応 */
define('MAIL_DELIVER_ENABLED', 1);
define('MAIL_DELIVER_DISABLED', 0);



以上となっております。

誤りがございましたら、ご指摘いただければ幸いです。
yuh
投稿日時: 2014/8/4 13:50
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 2.13系メール便の対応について
DBのdtb_productsのデータにはmail_deliver_enabledにはデータがは入っていますか?
あと、SESSIONの中にmail_deliver_enabledのデータは入ってますか?
harusame
投稿日時: 2014/8/4 17:25
対応状況: −−−
半人前
登録日: 2014/7/30
居住地: 奈良
投稿: 27
Re: 2.13系メール便の対応について
引用:
DBのdtb_productsのデータにはmail_deliver_enabledにはデータがは入っていますか?

下記の通り入っておりました。

mail_deliver_enabled | smallint(6) | いいえ | 0

引用:
SESSIONの中にmail_deliver_enabledのデータは入ってますか?

SESSIONとは、SC_CartSession.phpでよかったでしょうか。

ご指摘の通り、
上記にはmail_deliver_enabledは入っておりませんでした。

参考にしているサイト
http://tech.bandersnatch.jp/338
上記サイトにもSC_CartSession.phpは出てきておりますが、
どういったコードをどこに記載すべきか理解ができておりません。
できれば助言を頂ければ幸いです。
yuh
投稿日時: 2014/8/4 17:35
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 2.13系メール便の対応について

public function checkMailDeliverAvailable($productTypeId, &$objCartSession) 
{

$available = false;

// カート内の情報を取得
$items = $objCartSession->getCartList($productTypeId);
if (count(array_keys($items))) {
$available = true;
foreach (array_keys($items) as $key) {
$item = & $items[$key];
$product = & $item['productsClass'];
if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) {
continue;
} else {
$available = false;
}
}
}
return $available;
}

このコードの
$items = $objCartSession->getCartList($productTypeId);
の$itemsの中身ですね。
このデータの中のmail_deliver_enabledをチェックしているので、そのデータがないのが原因と思いますので、
SC_CartSession_Ex.phpに

    public function adjustSessionProductsClass(&$arrProductsClass)
    {
        $arrNecessaryItems = array(
            'product_id'          => true,
            'product_class_id'    => true,
            'name'                => true,
            'price02'             => true,
            'point_rate'          => true,
            'main_list_image'     => true,
            'main_image'          => true,
            'product_code'        => true,
            'stock'               => true,
            'stock_unlimited'     => true,
            'sale_limit'          => true,
            'class_name1'         => true,
            'classcategory_name1' => true,
            'class_name2'         => true,
            'classcategory_name2' => true,
            'mail_deliver_enabled'=> true,
        );

        // 必要な項目以外を削除。
        foreach ($arrProductsClass as $key => $value) {
            if (!isset($arrNecessaryItems[$key])) {
                unset($arrProductsClass[$key]);
            }
        }
    }


上記のコードを追加するのが抜けていると思います。
たぶん取得はしていたのに、その部分で不必要と判断されて消された事が原因と予想されるので、一度試してみてください。

harusame
投稿日時: 2014/8/4 18:56
対応状況: −−−
半人前
登録日: 2014/7/30
居住地: 奈良
投稿: 27
Re: 2.13系メール便の対応について
本当にありがとうございます!

SC_CartSession内に
            'mail_deliver_enabled'=> true,

を追加致しました。


その後、
順序通り修正しております。

●/data/Smarty/templates/admin/products/product.tpl内に
        <tr>
            <th>メール便対応</th>
            <td>
                <label>
                <input type="checkbox" name="mail_deliver_enabled" value="1" <!--{if $arrForm.mail_deliver_enabled == $smarty.const.MAIL_DELIVER_ENABLED}-->checked<!--{/if}--> onclick="fnCheckStockLimit('<!--{$smarty.const.DISABLED_RGB}-->');"/>
                </label>
            </td>
        </tr>

上記チェックボックスを追加しました。


●/data/Smarty/templates/admin/products/confirm.tpl内に
            <tr>
                <th>メール便対応</th>
                <td>
                    <!--{if $arrForm.mail_deliver_enabled == 1}-->○<!--{else}-->×<!--{/if}-->
                </td>
            </tr>

上記確認項目も追加しました。

CSVダウンロード設定用テーブル(dtb_csv)にカラム増やし、
設定は完了したかと思われます。


その後、
EC-CUBE メール便対応フラグを利用して表示をカスタマイズ(初級編:商品詳細画面)
http://tech.bandersnatch.jp/318
上記へ進めていき、


●/data/Smarty/templates/default/products/detail.tpl内に、
参考サイト通り下記を追加したのですが、どの商品を確認しても「送料無料」と表示されてしまいます…。
<!--{if $arrProduct.price02_min|sfCalcIncTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule >= $free_rule}-->
	<div class="deliv_explain">送料無料</div>
<!--{else}-->
<!--{if $arrProduct.mail_deliver_enabled == $smarty.const.MAIL_DELIVER_ENABLED}-->
	<div class="deliv_explain">メール便対象品です(送料無料)</div>
<!--{else}-->
<!--{/if}-->
<!--{/if}-->


しかたなく、下記としました。
                <!--▼商品ステータス-->
                <!--{assign var=ps value=$productStatus[$tpl_product_id]}-->
                <!--{if count($ps) > 0}-->
                    <ul class="status_icon clearfix">
                        <!--{foreach from=$ps item=status}-->
                        <li>
                            <!--{if $arrProduct.mail_deliver_enabled == $smarty.const.MAIL_DELIVER_ENABLED}-->
                            <img src="<!--{$TPL_URLPATH}-->/img/icon/icon_yamato_mailbin.gif" alt="メール便アイコン" />
                            <!--{/if}-->
                            <img src="<!--{$TPL_URLPATH}--><!--{$arrSTATUS_IMAGE[$status]}-->" width="80" height="17" alt="<!--{$arrSTATUS[$status]}-->" id="icon<!--{$status}-->" />
                        </li>
                        <!--{/foreach}-->
                    </ul>
                <!--{/if}-->
                <!--▲商品ステータス-->

メール便商品のみ、商品ステータス部分にメール便アイコンが表示されるようになりました。
商品一覧ページにも同じカスタマイズをし、
メール便商品は一覧、詳細ともにステータス部分にアイコン表示されるようになりました。

そのまま
EC-CUBE メール便対応フラグを利用して表示をカスタマイズ(中級編:カート画面)
http://tech.bandersnatch.jp/318
上記へ進めていき、

●/data/class/pages/cart/LC_Page_Cart.php内に、


        $this->arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
        $totalIncTax = 0;
        foreach ($this->cartKeys as $key) {
            // カート集計処理
            $this->tpl_message .= $objCartSess->checkProducts($key);
            $this->tpl_total_inctax[$key] = $objCartSess->getAllProductsTotal($key);
            $totalIncTax += $this->tpl_total_inctax[$key];
            $this->tpl_total_tax[$key] = $objCartSess->getAllProductsTax($key);
            // ポイント合計
            $this->tpl_total_point[$key] = $objCartSess->getAllProductsPoint($key);

            $this->arrData[$key] = $objCartSess->calculate($key, $objCustomer);

            // 送料無料チェック
            $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key);
            $this->arrData[$key]['mail_deliv_available'] = $objPurchase->checkMailDeliverAvailable($key, $objCartSess);

            // 送料無料までの金額を計算
            $this->tpl_deliv_free[$key] = $this->arrInfo['free_rule'] - $this->tpl_total_inctax[$key];
        }

上記「送料無料チェック」部分に追加し、

●/data/Smarty/templates/default/cart/index.tpl内に、
<!--{if count($cartKeys) > 1}-->
<h4></h4>

  <!--{$arrProductType[$key]}-->:

  <!--{if $arrInfo.free_rule > 0}-->
    <!--{if !$arrData[$key].is_deliv_free}-->
      <!--{if $arrData[$key].mail_deliv_available}-->
<div>※※ 1-1メール便のご指定なら送料無料 ※※</div>
      <!--{else}-->
<div>※※ 1-2指定金額を越えてない時 ※※</div>
<div class="cart_deliv_fee_message">あと「<span class="price"><!--{$tpl_deliv_free[$key]|number_format}-->円</span>」で送料無料です!!</div>
      <!--{/if}-->
    <!--{else}-->
<div>※※ 1-3指定金額以上で送料無料 ※※</div>
    <!--{/if}-->
  <!--{/if}-->

<!--{else}-->

  <!--{if $arrInfo.free_rule > 0}-->
    <!--{if !$arrData[$key].is_deliv_free}-->
      <!--{if $arrData[$key].mail_deliv_available}-->

<div>※※ 2-1メール便のご指定なら送料無料 ※※<br />
※代金引換ではメール便はご利用いただけません</div>
      <!--{else}-->
<div>※※ 2-2指定金額を越えてない時 ※※</div>
<div class="cart_deliv_fee_message">あと「<span class="price"><!--{$tpl_deliv_free[$key]|number_format}-->円</span>」で送料無料です!!</div>
      <!--{/if}-->
    <!--{else}-->
<div>※※ 2-3指定金額以上で送料無料 ※※</div>
    <!--{/if}-->
  <!--{/if}-->

<!--{/if}-->

と記載してみたのですが、
メール便商品をカートへ入れてもメール便の表示が出ません。
どの商品パターンでカートへ入れても、同じでした。
常に2-2が表示され、無料金額を超えると2-3が表示されます。
それ以外の表示は見られませんでした。

はじめから見直しておりましたが、再び行き詰まりまってしまいました。
毎度毎度、簡潔に記載ができずかなりの長文となってしまい
本当に申し訳ございません。
yuh
投稿日時: 2014/8/4 21:35
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: 2.13系メール便の対応について
現在作成しているのがテストサイトでデバックでコードを表示させてもいいのであれば、まずは

	
public function checkMailDeliverAvailable($productTypeId, &$objCartSession) 
{
	
	$available = false;
	
	// カート内の情報を取得
	$items = $objCartSession->getCartList($productTypeId);
	if (count(array_keys($items))) {
		$available = true;
		foreach (array_keys($items) as $key) {
			$item = & $items[$key];
			$product = & $item['productsClass'];
			if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) {
				continue;
			} else {
				$available = false;
			}
		}
	}
	return $available;
}

このソースを
	
public function checkMailDeliverAvailable($productTypeId, &$objCartSession) 
{
	
	$available = false;
	
	// カート内の情報を取得
	$items = $objCartSession->getCartList($productTypeId);
	if (count(array_keys($items))) {
		$available = true;
		foreach (array_keys($items) as $key) {
			$item = & $items[$key];
			$product = & $item['productsClass'];
			
			echo $product['mail_deliver_enabled']." === ".MAIL_DELIVER_ENABLED."<BR>";
			
			if ($product['mail_deliver_enabled'] === MAIL_DELIVER_ENABLED) {
				echo $product['product_id']."<BR>";
				echo "mail_deliver true<BR>";
				continue;
			} else {
				echo $product['product_id']."<BR>";
				echo "mail_deliver false<BR>";
				$available = false;
			}
		}
	}
	return $available;
}

このように途中のデータを出力させて
どの部分が原因でうまく動かないかを確認するのがいいと思います。
おそらくfunction checkMailDeliverAvailableの部分とは思いますが、順番にどの部分はうまく動いていて、どの部分がうまく動いてないのかを判断するのが必要ですので、順に処理をチェックしていってください
(1) 2 3 4 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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.