2.13で受注商品を変更→数量変更でなぜか他の商品の数量が変更されるバグ

そもそもEC-CUBEの2.13には、商品を変更しなくても数量を変更すると他の商品の数量が変更されてしまうというバグがあるようです。フォーラムなどを確認してチェンジセット23355を適用。

一見問題なくなったので安心していたところ、商品を変更したときにまたこのバグが再現されることが判明しました。

2.13は商品の変更時、もともとの商品の位置に変更後の商品を挿入するのではなくて、一旦削除→新たに追加という挙動を行っているようで、その際にgetShipmentItemsの順番と違ってしまうのではないかと思います。

この数量変更のときのjavascriptとHTML(/data/Smarty/templates/admin/order/edit.tpl)はこんな感じだったので…。

function quantityCopyForSingleShipping(product_index){
    var product_index = parseInt(product_index);
    var input_quantity = $('input[name^="quantity[' + product_index + ']"]').val();
    $('input[name^="shipment_quantity[<!--{$top_shipping_id}-->][' + product_index + ']"]').val(input_quantity);

}

<input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->" onChange="quantityCopyForSingleShipping('<!--{$product_index}-->')" />

<input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />

 shipping_idとproduct_class_idで取得したほうが間違いがないのではと書き直し。

function quantityCopyForSingleShipping(input_quantity, product_class_id){
    var input_quantity_val = $(input_quantity).val();
    $('input#shipment_quantity_<!--{$top_shipping_id}-->_' + product_class_id).val(input_quantity_val);
}

<input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->" onChange="quantityCopyForSingleShipping(this, '<!--{$arrForm.product_class_id.value[$product_index]|h}-->')" />

 …
<!--{assign var=key value="shipment_product_class_id"}-->
<input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" value="<!--{$arrShipping[$key][$item_index]|h}-->" />
<!--{assign var=shipment_product_class_id value=$arrShipping[$key][$item_index]}-->

<input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->][<!--{$item_index}-->]" id="<!--{$key}-->_<!--{$shipping_index}-->_<!--{$shipment_product_class_id|h}-->" value="<!--{$arrShipping[$key][$item_index]|h}-->" />

とりあえずこれで今回のバグは取り除けました。
product_class_idは一意なのでこの仕様で問題ない…とは思いますが複数宛先での動作確認はできていないので、急ぎじゃない場合は公式のチケット待ったほうがよいかと思います。

WAMP環境でPEAR MDB2を入れる

Bitnamiでローカルにテスト環境を構築中、MDB2を使いたくてちょっとつまずいたのでメモしておきます。

MDB2を入れるには「pear install mdb2」と入力するだけ簡単!ということなのですが、Windowsではこのコマンドをどこに入力したらよいのかでつまずき。もちろんコマンドプロンプトに入力しても、パスがとおってないので…

'pear' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

_(´ロ`」∠)_

 

どうやら、Bitnamiをインストールした先(私の場合はC:\Bitnami\wampstack-5.4.29-0)にある「use_wampstack.bat」を使うとよいようです。

use_wampstack.batダブルクリック起動 → pear install mdb2 と入力 → エンター → faild!!!!!

_(´ロ`」∠)_

 

…管理者権限がなくてフォルダが作成できなかったようです。
use_wampstack.batをダブルクリックではなく右クリックで「管理者として実行」します。

use_wampstack.bat右クリック「管理者として実行」起動 → pear install mdb2 と入力 → エンター → install ok!!!!!

 

MDB2が使えるようになりました。

2015/02/04追記

久々にpearのパッケージをインストールしようとしたら、

No releases available for package ほにゃらら

というメッセージが出てインストールができず…。

pear clear-cache

で解決しました。

ご利用規約→新規会員登録で「不正なページ移動です」

開発環境でごにょごにょカスタマイズをしていたら、ご利用規約→新規会員登録で「不正なページ移動です」のエラーが出るようになっていました。
エラーログに何も出ていないのでソースを読んでみると、

    /**
     * kiyaku.php からの遷移の妥当性をチェックする
     *
     * 以下の内容をチェックし, 妥当であれば true を返す.
     * 1. 規約ページからの遷移かどうか
     * 2. PC及びスマートフォンかどうか
     * 3. 自分自身(会員登録ページ)からの遷移はOKとする
     *
     * @access protected
     * @return boolean kiyaku.php からの妥当な遷移であれば true
     */
    public function lfCheckReferer()
    {
        $arrRefererParseUrl = parse_url($_SERVER['HTTP_REFERER']);
        $referer_urlpath = $arrRefererParseUrl['path'];

        $kiyaku_urlpath = ROOT_URLPATH . 'entry/kiyaku.php';

        $arrEntryParseUrl = parse_url(ENTRY_URL);
        $entry_urlpath = $arrEntryParseUrl['path'];

        $allowed_urlpath = array(
            $kiyaku_urlpath,
            $entry_urlpath,
        );

        if (SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE
            && !in_array($referer_urlpath, $allowed_urlpath)) {
            return false;
        }

        return true;
    }

ということで、リファラのパスがentry/kiyaku.php でなければならないようです。
そういえばmod_rewriteでサイト全体を.php→.htmlに変更していて、ご利用規約もkiyaku.htmlになっておりました…。

この部分のためにExクラス編集するのもなと思ったので規約のページだけ.html→.phpで運用することにしました。なんだかな~。

 

バージョン2.13.1

恐怖!dtb_orderに謎のquick_flgとquick_memoカラムが!

dtb_orderテーブルのおしりの方にquick_flgとquick_memoという謎のカラムが出現していて、こんなカラム見たことない怖いと思って調べたら、試しに入れてみようとして結局やめたペイジェントモジュールが勝手に追加してたというお話です。

ペイジェントモジュールは設定画面を立ち上げると同時にカラムを追加してくれるようで、追加されるカラムは以下のとおり。

dtb_payment の module_code
dtb_customer の paygent_cart
dtb_order の quick_flg、quick_memo

設定画面で真っ赤な字で「上書きされます!」って出てくるファイル群は、設定がエラーなしで完了した時点で書き換えられるようなので、こっちは書き換えられていなかったです。(テーブルにカラム追加するのもエラーなかった段階でお願いしたかったよ…。なんか怖くて消すに消せないよ…。)

EC-CUBEのバージョン:2.13.1

WindowsXPでApache+PHP+Postgresql環境を作ったときにハマったところ3つ。

Postgresqlはダウンロードしてインストールするだけで問題なく動いたため割愛。

PostgreSQL: Windows installers

Apache+PHP

Windows 環境への Apache 2.2.4 + PHP 5.2.0 導入(インストール)記録 :: ソフトウェア :: Pocketstudio'z log

のページを見ながら。ここで注意1。

【注意1】PHPのインストールの途中「Web Server Setup」ではApacheを選ばないとapache用のdllが保存されないっぽいのでApacheを選ぶこと。

インストールが完了するとhttpd.confの最後にPHPIniDirとLoadModuleの行が追加されております。ここで注意2。

【注意2】<Directory ほにゃらら>の設定より上にかかないと指定のphp.iniが読み込まれないです。なので他のLoadModuleがいっぱいならんでいるあたりに移動させておきましょう。

さてこれで完了かとおもいきや、php_pgsql.dllがうまくロードされません。ここで注意3です。

【注意3】httpd.confでlibpq.dllとphp5ts.dllを読み込むこと。

注意2で読み込ませたLoadMobuleとPHPiniDirの間あたりに、

Loadfile "C:/Program Files/PHP/php5ts.dll"
Loadfile "C:/Program Files/PHP/libpq.dll"

こんな感じで追加してapache再起動です。

[参考]

PHP: Installing/Configuring - Manual

WordPressにイラッ!抜粋(the_excerpt())が未入力だと本文(the_content)から拾ってくる仕様に対抗する

抜粋を取得して、何か入ってたら出力、入ってなかったらラッパータグごと出力しない、ということがやりたかったのですが、

<?php $excerpt = get_the_excerpt(); ?>
<?php if (!empty($excerpt) ) : ?>
<div class="excerpt"><?php echo nl2br($excerpt); ?></div>
<?php endif; ?>

こんなコードをかいたら、抜粋の内容が空でも何故かずらずらと出力されてる場面に遭遇…( ゚д゚)
まあ…仕様書読めよ自分という話です。

抜粋を入力していない場合は投稿内容の最初の 55個の単語までを表示します
テンプレートタグ/the excerpt - WordPress Codex 日本語版

抜粋を入力していない場合は投稿内容の最初の 55個の単語までを表示します
テンプレートタグ/the excerpt - WordPress Codex 日本語版

大事なので2回引用しました。そうです。WPの仕様として、抜粋が入力されていない場合は本文からとってくるという余計なお世話をしてくれるのです。

「抜粋」なのでその仕様が正しい。でも世の中正しいだけじゃ生きていけないのです。

ということで対抗したコードがこちら。

<?php if ( has_excerpt() ) : $excerpt = get_the_excerpt(); ?>
<div class="excerpt"><?php echo nl2br($excerpt); ?></div>
<?php endif; ?>

 has_excerpt()なんて便利な関数が用意されているじゃありませんか…。ごめんなさいWP、私が悪かったよ…。

[参考] Wordpressでthe_excerpt()(抜粋)の有無を確認できるhas_excerpt() | ちいさな創々

PHPで配列を定数定義→assignしないでSmartyで取得する荒業できたよー

PHPではdefineで配列が使えないので、定数として配列を使いたいときは

という方法があるかと思います。
が、上記の方法を使った場合、基本はPHP側で$smarty->assignしなければなりません。defineで定義した定数なら$smarty.constで一発なのに…。かといって{php}コードを使う方法は何かに負けた気がします。

そこで、ネットをさまよったところ、配列をシリアライズしてdefineで定義→Smarty側でアンシリアライズして利用、という方法を発見しました。

PHP

define("CONF_ARRAY" => serialize(
  array('foo' => 'ふー', 'bar' => 'ばー', 'baz' => 'ばず')
));

Smarty

{assign var=CONF_ARRAY value=$smarty.const.CONF_ARRAY|unserialize}
{$CONF_ARRAY|@debug_print_var}

 

[参考]