suzuboss.info

実際に使ってみた・試してみた経験が誰かの「かゆいところに手が届く」なら幸いです。

Web系

EC-CUBEで規格以外に項目を追加した②

投稿日:2014/10/30 更新日:

前回はテンプレートファイルのカスタマイズをしたのでその続きから始めます。

Contents

Classファイルの修正

ディレクトリ内の『data/class/』に各種クラスファイルが保存されています。修正や追加をする場合は『data/class_extends/』を利用するのがいいようです。説明は『data/class/』の方で説明します。修正するときはバックアップを取ったほうが良いと思います!

カスタマイズファイル:SC_CartSession.php

①230行目付近に追加。

2014/11/19【追記】:配置と仕上がりが違う場合は別商品としてカートへ登録するようにした

for ($i = 0; $i <= $max; $i++) {
    if ($this->cartSession[$productTypeId][$i]['id'] == $product_class_id && $this->cartSession[$productTypeId][$i]['position_set'] == $position_set && $this->cartSession[$productTypeId][$i]['finish_set'] == $finish_set) {	//【2014/11/19追記】
        $val = $this->cartSession[$productTypeId][$i]['quantity'] + $quantity;
        if (strlen($val) <= INT_LEN) {
            $this->cartSession[$productTypeId][$i]['quantity'] += $quantity;
        }
        $find = true;
    }
}

if (!$find) {
    $this->cartSession[$productTypeId][$max+1]['id'] = $product_class_id;
    $this->cartSession[$productTypeId][$max+1]['quantity'] = $quantity;
    $this->cartSession[$productTypeId][$max+1]['cart_no'] = $this->getNextCartID($productTypeId);
	    //【追記】
    $this->cartSession[$productTypeId][$max+1]['position_set'] = $position_set;
    $this->cartSession[$productTypeId][$max+1]['finish_set'] = $finish_set;
}

②306行目付近に追加。

$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,
    //【追記】
    'position_set'        => true,
    'finish_set'          => true
);

カスタマイズファイル:pages/products/LC_Page_Products_Detail.php

①49行目付近に追加。

/** 配置 */
public $arrPOSITION;	//【追記】

/** 仕上がり */
public $arrFINISH;	//【追記】

②64行目付近に追加。getMasterDataでマスターデータを取得できる。

parent::init();
$masterData = new SC_DB_MasterData_Ex();
$this->arrSTATUS = $masterData->getMasterData('mtb_status');
$this->arrSTATUS_IMAGE = $masterData->getMasterData('mtb_status_image');
$this->arrDELIVERYDATE = $masterData->getMasterData('mtb_delivery_date');
$this->arrRECOMMEND = $masterData->getMasterData('mtb_recommend');
$this->arrPOSITION = $masterData->getMasterData('mtb_position');	//【追記】
$this->arrFINISH = $masterData->getMasterData('mtb_finish');	//【追記】

③352行目付近に追加。

$objFormParam->addParam('規格1', 'classcategory_id1', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('規格2', 'classcategory_id2', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('管理者ログイン', 'admin', INT_LEN, 'a', array('ALNUM_CHECK','MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('お気に入り商品ID', 'favorite_product_id', INT_LEN, 'n', array('ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
// 【追加】
$objFormParam->addParam('配置', 'position_set', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('仕上がり', 'finish_set', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
// 値の取得
$objFormParam->setParam($_REQUEST);

④402行目付近に追加。

// 複数項目チェック
if ($tpl_classcat_find1) {
    $objErr->doFunc(array('規格1', 'classcategory_id1'), array('EXIST_CHECK'));
}
if ($tpl_classcat_find2) {
    $objErr->doFunc(array('規格2', 'classcategory_id2'), array('EXIST_CHECK'));
}

//【追記】
$objErr->doFunc(array('配置', 'position_set'), array('SPTAB_CHECK'));
$objErr->doFunc(array('仕上がり', 'finish_set'), array('SPTAB_CHECK'));

break;

⑤508行目付近に追加。それぞれのIDをマスターデータの表記に置きかえ。

if (count($this->arrErr) == 0) {
    $objCartSess = new SC_CartSession_Ex();
    $product_class_id = $this->objFormParam->getValue('product_class_id');
		
    //【追記】
    $position = $this->arrPOSITION[$this->objFormParam->getValue('position_set')];
    $finish   = $this->arrFINISH[$this->objFormParam->getValue('finish_set')];

    //【追記】
    $objCartSess->addProduct($product_class_id, $this->objFormParam->getValue('quantity'), $position, $finish);

    // 開いているカテゴリーツリーを維持するためのパラメーター
    $arrQueryString = array(
        'product_id' => $this->objFormParam->getValue('product_id'),
    );
}

 

カスタマイズファイル:pages/cart/LC_Page_Cart.php

①219行目付近に追加。

$objFormParam = new SC_FormParam_Ex();
$objFormParam->addParam('カートキー', 'cartKey', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'));
$objFormParam->addParam('カートナンバー', 'cart_no', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));

//【追記】
$objFormParam->addParam('配置', 'position_set', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('仕上がり', 'finish_set', MTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

// スマートフォン版での数量変更用
$objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));

 

カスタマイズファイル:helper/SC_Helper_Purchase.php

①754行目付近に追加。

// 詳細情報を生成
$objProduct = new SC_Product_Ex();
$i = 0;
$arrDetail = array();
foreach ($cartItems as $item) {
    $p =& $item['productsClass'];
    $arrDetail[$i]['order_id'] = $orderParams['order_id'];
    $arrDetail[$i]['product_id'] = $p['product_id'];
    $arrDetail[$i]['product_class_id'] = $p['product_class_id'];
    $arrDetail[$i]['product_name'] = $p['name'];
    $arrDetail[$i]['product_code'] = $p['product_code'];
    $arrDetail[$i]['classcategory_name1'] = $p['classcategory_name1'];
    $arrDetail[$i]['classcategory_name2'] = $p['classcategory_name2'];
    $arrDetail[$i]['point_rate'] = $item['point_rate'];
    $arrDetail[$i]['price'] = $item['price'];
    $arrDetail[$i]['quantity'] = $item['quantity'];
    $arrDetail[$i]['tax_rate'] = $item['tax_rate'];
    $arrDetail[$i]['tax_rule'] = $item['tax_rule'];
    $arrDetail[$i]['position_set'] = $item['position_set'];	//【追記】
    $arrDetail[$i]['finish_set'] = $item['finish_set'];	//【追記】

    // 在庫の減少処理
    if (!$objProduct->reduceStock($p['product_class_id'], $item['quantity'])) {
        $objQuery->rollback();
        SC_Utils_Ex::sfDispSiteError(SOLD_OUT, '', true);
    }
    $i++;
}
$this->registerOrderDetail($orderParams['order_id'], $arrDetail);

②182行目付近に追加。

$objQuery =& SC_Query_Ex::getSingletonInstance();
$dbFactory  = SC_DB_DBFactory_Ex::getInstance();
$col = <<< __EOS__
    T3.product_id,
    T3.product_class_id as product_class_id,
    T3.product_type_id AS product_type_id,
    T2.product_code,
    T2.product_name,
    T2.classcategory_name1 AS classcategory_name1,
    T2.classcategory_name2 AS classcategory_name2,
    T2.position_set,//【追記】
    T2.finish_set,//【追記】
    T2.price,
    T2.quantity,
    T2.point_rate,
    T2.tax_rate,
    T2.tax_rule,

表示から注文受付まではこんな感じになりました。

次回、管理側のカスタマイズへ続きます。たぶん。

2014/11/17【追記】

カートや管理画面では規格ごとの商品IDで管理されているので、今回の配置や仕上がりを変更しても同じ商品として扱われてしまう。って事に気づく。同じ商品でも配置や仕上がりが違えば別の商品としたいのだけど。。。

2014/11/19【追記】

カートに入れた時に、配置または仕上がりが違えば別の商品として登録するように変更しました。

-Web系

執筆者:


  1. […] 長くなったので次回(クラスファイルの修正)へ続きます。 […]

  2. mom より:

    丁寧な説明で助かりました!
    バージョンが2.13で説明されてる方が見つからず、探していた所で拝見して、初心者には目から鱗でした。
    これから、管理画面を作成してみます。が、うまく出来るかどうか。。
    アップされるの、期待しています!

  3. tetutake より:

    大変参考になる記事をありがとうございます。
    次回の「管理側のカスタマイズ」が待ち遠しいです。
    記事追加の予定はないのでしょうか?

    • suzuboss より:

      こんばんは。現状でEC-CUBEを触る環境から離れてしまったため、今のところ追加の予定はありません。。。ご期待に添えずに申し訳ないです!

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

Google API OAuth 2.0のリフレッシュトークンでハマった

WebアプリでGoogle Search ConsoleのAPIを使うにあたり、リフレッシュトークン関連でハマったのでメモしておきます。 アクセストークンの取得 特に何も考えずにアクセストークンを取得 …

no image

jQuery Mobileでページ内アンカーと外部からのアンカー

ほとんど触ったことのない『jQuery Mobile』ですが、少し触る機会がありました。 ハッシュタグを使ったアンカーで、通常はハッシュタグで指定の箇所へページ内アンカーとして動くのですが、jQuer …

no image

Google Chartsを使った簡単な折れ線グラフ

時々ですが、Webページにグラフを埋め込む必要があったりする場面があります。検索をすればサンプルはたくさんできてくるので大変ありがたい所です。使うライブラリとしては「Google Charts」と「C …

Logicool C310(V-U0015)をSkypeで使ってみた

在宅の方と仕事をする際にSkypeを使っています。顔を見ながら話せると電話よりも伝わるのでいいですよね。 デスクトップでSkypeを使う時にはWebカメラを利用しています。使っているのはロジクールの「 …

no image

EC-CUBEで規格以外に項目を追加した③

前回はフロント側のクラスまわりをカスタマイズしたのでその続きから始めます。 受注管理あたりをカスタマイズすることになります。

記事を探す