2011 10月13日

規格を利用していて、ある規格(長いものや重いものなど)の場合は別途送料となる場合の処理を書いてみる。
ただし無理やり実装。

動作

該当する規格分類の場合は送料を通常より1000円プラスする。

環境

EC-CUBE 2.4
PostgreSQL

段取り

各規格の分類は dtb_classcategory に格納されていて、classcategory_id というユニークな通し番号が振られている。
カートのセッションにもこの通し番号が格納されているようなので、こいつを使って判別することとする。
なので、適用する規格の分類を登録した後に、classcategory_id を調べなくてはならない。

工程

[eccube]/data/class/SC_CartSession.php

function chkClassCategory という関数を追加する.
一番最終行の

Selec All Code:
}
?>

の前に追加.

Selec All Code:
    /** カート中の商品をチェックして別送料対象かチェックする
     * 1つでも対象商品があればTrueを返す.
     * True:対象商品あり False:対象商品なし
     * $_SESSION[$this->key][$i]['id'][0]...プロダクトid;
     * $_SESSION[$this->key][$i]['id'][1]...規格1;
     * $_SESSION[$this->key][$i]['id'][2]...規格2;
     */
    function chkClassCategory() {
        $max = $this->getMax();
        for($i = 0; $i <= $max; $i++) {
            $classcategory1 = $_SESSION[$this->key][$i]['id'][1];
            $classcategory2 = $_SESSION[$this->key][$i]['id'][2];
 
            // マッチする条件を設定(以下は例)
            if(
                ($classcategory1 >= 208 AND $classcategory1 <= 211)
                OR ($classcategory2 >= 208 AND $classcategory2 <= 211)
                OR ($classcategory1 >= 11 AND $classcategory1 <= 16)
                OR ($classcategory2 >= 11 AND $classcategory2 <= 16)
            ) return true;
        }
        // マッチしなかったらfalseを返す
        return false;
    }

[eccube]/data/class/helper/SC_Helper_DB.php
function sfTotalConfirm

修正前

Selec All Code:
        // 合計送料の取得
        $arrData['deliv_fee'] = 0;

修正後

Selec All Code:
        // 合計送料の取得
        $arrData['deliv_fee'] = 0;
 
        // 規格分類チェック(送料オプション)
        $classcategory_flag = $objCartSess->chkClassCategory();
        if($classcategory_flag){
            $arrData['deliv_fee'] += 1000;
        }

例では該当規格分類の場合は1000円プラスするようになっている。
決め打ちの場合ここまでで出来てしまう。

テンプレートに注釈をつけるなら下記のように tpl_classcategory_flag をつけて、テンプレートを修正する。

修正前

Selec All Code:
        // 合計送料の取得
        $arrData['deliv_fee'] = 0;

修正後

Selec All Code:
        // 合計送料の取得
        $arrData['deliv_fee'] = 0;
 
        // 長尺商品チェック
        $classcategory_flag = $objCartSess->chkClassCategory();
        if($classcategory_flag){
            $arrData['deliv_fee'] += 1000;
            $objPage->tpl_classcategory_flag = 1;
        }

[eccube]/data/Smarty/templates/defaultKai/shopping/confirm.tpl
修正前

Selec All Code:
        <tr>
          <th colspan="4" class="resulttd">送料</th>
          <td class="pricetd"><!--{$arrData.deliv_fee|number_format}--></td>
        </tr>

修正後

Selec All Code:
        <tr>
          <th colspan="4" class="resulttd">送料
          <!--{if $tpl_classcategory_flag}-->
		  <br />
		  <span class="price">(内 大判送料:1,000円)</span>
          <!--{/if}-->
		  </th>
          <td class="pricetd"><!--{$arrData.deliv_fee|number_format}--></td>
        </tr>

[eccube]/data/class/pages/shopping/LC_Page_Shopping_Confirm.php
変更なしでおk









2011 9月15日

参考:EC-CUBEカスタマイズ – 商品詳細ページにテキスト入力欄を追加|ネットショップ構築&運営サポート – ビー・フレンド

例えば、ハンコの名前部分を入力してもらうとか、規格で管理できないほどの多量のサイズとかを入力してもらうようにできる。

参考ページの手順で導入してみたけれど、テキスト入力欄設定されていない商品をカートに入れることができない不具合があるみたい。あと、PostgreSQLの場合は、Viewを再生成する必要がある。

環境

  • EC-CUEB 2.4.4
  • PostgreSQL
  • データベース編集

    • テキスト入力欄を表示するか否かを判別するフラグ
      • 対象テーブル:dtb_products
      • 追加カラム:add_flg (データ型: integer)
    • テキスト入力欄(テキストボックス)
      • 対象テーブル:dtb_order_detail
      • 追加カラム:add_field (データ型: text)
    Selec All Code:
    ALTER TABLE dtb_products ADD COLUMN add_flg INTEGER;
    ALTER TABLE dtb_order_detail ADD COLUMN add_field text;

    ポイント

    pgsqlの場合はdtb_productsにカラムを追加したらviewの再生成が必要になる。

  • [EC-CUBE カスタマイズ日誌] 第 5 回 商品のサブ画像の数を増やしたい! | バシャログ。
  • EC-CUBE インストールディレクトリにある install/sql/create_view.sql を適宜変更して実行する。 …つづきを読む









    2011 9月8日

    Live Commerceを使うのにはZend Optimizerが必要なのでインストールする。

    CentOS5.5(32bit)
    PHP 5.2.16

    ダウンロード

    ダウンロード場所がわかりにくいので注意
    ※Zend OptimizerをダウンロードするにはMyZendに登録する必要がある。
    ゼンド・ジャパン株式会社

    ダウンロード>Zend Guard>loader>linux>ZendOptimizer-3.x.x-linux-glibc23-xxx.tar.gz
    ※ xの部分はPHPのバージョンやOSによって異なる
    当方の環境では ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz だった。

    設置

    ダウンロードしたファイルを解凍する。

    $ tar zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

    PHPのバージョンに対応した ZendOptimizer.so を /usr/lib/php/modules へ設置する。
    ※自分の環境では ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp の中にあるものを使用。

    $ cd ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp
    $ sudo mv ZendOptimizer.so /usr/lib/php/modules

    php.iniの設定

    # vi /etc/php.ini
    追記
    [Zend]
    zend_extension=/usr/lib/php/modules/ZendOptimizer.so
    zend_optimizer.optimization_level=15

    Apache再起動

    # service httpd restart

    参考:

  • 【環境構築3】PHPをインストールする のんき者のシステム開発ノート(ってかメモ)/ウェブリブログ
  • Zend Optimizer のインストール | Linuxで自宅サーバ構築








  • 2011 8月24日

    とあるスクリプトで最初の実行時には正常に動作するのだけれど、同一ページを再訪問(リロードではなく)した時に不具合が出た。

    webkit系のブラウザで不具合が確認できたのだけれど、どうやらgetElementById()でnullが帰っている様子。

    ググってみると同じような現象で悩んでいる人もいるみたい。DOM構築前だとnullが帰る事もあるのが原因のようだ。

    onLoadイベントとかはjQuery使っているのなら簡単に実装できるのだけれど、純粋JSで書いているスクリプトだし、他所様に配信するスクリプトなので解決方法を探る。

    jQuery使っているのなら、$.ready(function(){…}) でいいのだろうけど、そうはいかない。じゃあ、onLoadイベントに登録すればいい。いいのだけど、onLoadイベントは1つしか実行できないので工夫が必要になる。

  • Javascript onloadが複数ある場合の対処法 ~FancyZoomとCubeブログシールを共存させる : ブログ・カスタマイズ徒然記
  • ここら辺の記事を参考に How to use multiple window.onload events with external scripts – Javascript FAQ – Tek-Tips にある addOnloadEvent を組み込んで対処する。

    処理的には document.write() でかいたHTML中にあるIDが付いたタグの中に別処理で作成したHTMLを放り込むもの。

    実行したい関数には引数を指定しているので、
    addOnloadEvent(function(){ print_image(hoge,fuga) });
    みたいな感じにすればonLoadイベントとして実行してくれる。

    そうすることで、getElementById()でnullが帰らなくなる。









    2011 7月30日

    DBIx::Custom – search.cpan.org
    DBIx-Custom-0.1705

    DBIx::Custom select メソッドの whereの項目を見ると様々な指定方法が出来ることが分かる。

    注意する点はStringを渡す時。

    Selec All Code:
    where => "url = 'http://hoge.com/huga.cgi?key=value' ",

    上のように条件に ? が含まれる場合、SQLの作成に失敗する。(DBIx::Custom::QueryBuilder::build_queryでかな?)

    ? がメタ文字として扱われるため?(\?とエスケープしてもダメ)

    Hashリファレンスで渡すと大丈夫です。

    Selec All Code:
    where => {url => 'http://hoge.com/huga.cgi?key=value' },

    これを踏まえてコードにすると、安全なのはこんな感じのコードになるのかな。

    Selec All Code:
        my $id = 1;
        my $url = 'http://hoge.com/huga.cgi?key=value';
        $result = $dbi->select(
            table   =>  'table_name',
            column  => [qw/title content url/],
            where => [
                        ["and", "{= id}", "url = :url", "update_time > SUBDATE( NOW(), interval 7 day )"],
                        { id => $id, url => $url},
            ],
        );

    ※ {= id} は “id = :id” とも書ける(url = :urlも同様)。あえて両方含めてみた。

    where にはDBIx::Custom::Whereオブジェクトも指定できますが、DBIx::Custom::Whereオブジェクトを生成する時にも同様で、? を含めた条件には注意が必要。

    追記:タグ機能は廃止予定だそうです。
    http://twitter.com/#!/perlcodesample/status/97162783644319744