会員のランク分け

ログイン処理
ログイン処理の変更
data/class/SC_Customer.php
// 本登録された会員のみ
// $sql = “SELECT * FROM dtb_customer WHERE (email = ?” . $sql_mobile . “) AND del_flg = 0 AND status = 2”;
$sql = “SELECT * FROM dtb_customer WHERE (email = ?” . $sql_mobile . “) AND del_flg = 0 AND ( status = 2 OR status = 3 )”;

「status = 2」以外も許可する

ログインIDをメールアドレスでなくても可能にする

会員情報管理
会員情報編集画面(青を追記)
ファイルdata\Smarty\templates\default\admin\customer\edit.tpl
<!–<input type=”radio” name=”status”value=1 id=”no_mem” <!–{if $list_data.status == 1}–> checked=”checked” <!–{/if}–> <!–{if $list_data.status == 2}–>disabled<!–{/if}–>><label for=”no_mem”>仮会員</label>–>
<input type=”radio” name=”status”value=2 id=”mem”<!–{if $list_data.status == 2}–> checked=”checked” <!–{/if}–>><label for=”mem”>一般会員</label>
<input type=”radio” name=”status”value=3 id=”mem”<!–{if $list_data.status == 3}–> checked=”checked” <!–{/if}–>><label for=”mem”>HIS会員</label>

確認ページ
I:\home\skyblue\data\Smarty\templates\default\admin\customer\edit_confirm.tpl

SQL文
I:\home\skyblue\data\class\pages\admin\customer\LC_Page_Admin_Customer_Edit.php
80行目くらい
入力チェック 同270行くらい

暗号化(AUTH_MAGIC)
I:\home\skyblue\data\mtb_constants_init.php

ログインチェック(ここで$_SESSION[customer]が殻で無ければログインとする)
I:\home\skyblue\data\class\pages\frontparts\bloc\LC_Page_FrontParts_Bloc_Login.php

会員ランクはCUBEにはじめから実装されている。
仮会員と本会員を識別するためのものだが、そのフラグを利用するのがもっともスマートな方法です。
$_SESSION[customer][status] で取り出すことができます。

ログイン処理(ECCUBEのログイン状態を作る)

バージョンによてファイル名が違う

data/class/pages/frontparts/LC_Page_FrontParts_LoginCheck.php

data/class/pages/frontparts/LC_Page_FrontParts_Bloc_Login.php

今回は「$_SESSION[member_id] 」があればログイン状態にする、というサンプルです。
Wordpressなど他のシステムにログインしていて
EC-CUBEにログイン状態を引き継ぐときなどに活用します。

// ログイン判定
if ($objCustomer->isLoginSuccess()) {
	$this->tpl_login = true;
	$this->tpl_user_point = $objCustomer->getValue('point');
	$this->tpl_name1 = $objCustomer->getValue('name01');
	$this->tpl_name2 = $objCustomer->getValue('name02');
//  ↓ ここから追記
}elseif($_SESSION[member_id] != '') {
	$this->tpl_login = true;
	$this->tpl_user_point = $objCustomer->getValue('point');
	$this->tpl_name1 = $objCustomer->getValue('name01');
	$this->tpl_name2 = $objCustomer->getValue('name02');
//  ↑ ここまで追記
} else {
	// クッキー判定
	$this->tpl_login_email = $objCookie->getCookie('login_email');
	if ($this->tpl_login_email != '') {
	$this->tpl_login_memory = '1';
	}
	// POSTされてきたIDがある場合は優先する。
	if (isset($_POST['login_email']) && $_POST['login_email'] != '') {
	$this->tpl_login_email = $_POST['login_email'];
	}
}

EC-CUBE文字化け(その2)

eccube-2.4.2 では、SC_DbConn.php に下記が追記された。

MySQL文字化け対策(MySQLで文字化けする場合は以下のコメントアウトをはずして動作確認してみてください。)
if (DB_TYPE == 'mysql') {
   $objDbConn->query('SET NAMES utf8');
}

表示の文字化け対策にはなるだろう。
しかし、根本的な対策ではなさそうだ。

DBを直接除いたりしない人には関係無いかもしれないが、カスタマイズにはデータベースの操作が必須です。

CUBEの初期状態でインストールし、UTF-8にして上書きインストールしなければならない。

※ /data/cache を空にしないと反映されないので注意!

EC-CUBEで送料無料

EC-CUBEで送料無料の商品が含まれれば合計送料が無料になる。
「送料込み・送料別」をラジオボタンで選択式にする。

まず、どんな感じで実装するか?
DBは変更しない。dtb_products の deliv_fee を利用する。
このフィールドは将来拡張予定と書かれているが、拡張されても使いにくいのではないかと思うような書き方(ソースにコメントあり)なので、使い勝手の良いものを作ることにした。

1、管理登録・商品編集画面
File[data/Smarty/templates/default/admin/products/product.tpl]
eccube_custom_20091204a

2、確認画面
File[data/Smarty/templates/default/admin/products/confirm.tpl]
File[LC_Page_Admin_Products_Product.php]
eccube_custom_20091204b

3、送料の計算に例外処理を施す
File[data/class/helper/SC_Helper_DB.php]

決済後のメールやオーダー管理にもきちんと反映した。

ソースファイルはこちら ⇒ Dounload

EC-CUBEセキュリティパッチ

本不具合に対する対応方法
——————————————————————-
■不具合が存在するEC-CUBEのバージョン
——————————————————————-
EC-CUBE 正式版  2.4.0 RC1 以降 (2009年3月31日公開)
EC-CUBE コミュニティ版 r18068 以降 (2009年6月10日版以降)

——————————————————————-
■修正方法について
——————————————————————-
/data/class/pages/admin/customer/LC_Page_Admin_Customer_SearchCustomer.php#process
の最初に以下のログイン確認コードを挿入します。

■56行目付近
——————————————————————-
変更前
——————————————————————-
function process()
{
$objView = new SC_AdminView();
——————————————————————-

——————————————————————-
変更後
——————————————————————-
function process()
{
// 認証可否の判定
$objSess = new SC_Session();
SC_Utils_Ex::sfIsSuccess($objSess);

$objView = new SC_AdminView();
——————————————————————-

EC-CUBEのエンコード対策

サーバ移転や、試験環境などの構築で、文字化けが発生することがしばしばある。
データベース接続まわりを除いてみると、大切な記述が欠けている。

オープンソースなので、完璧を求めてはいけない。
ファイル名: /data/class/SC_DbConn.php
65行付近

$this-&gt;conn = $objDbConn;
<span style="color: #3366ff;">$this-&gt;conn-&gt;query(”SET NAMES utf8″);</span>
$this-&gt;error_mail_to = DB_ERROR_MAIL_TO;
$this-&gt;error_mail_title = DB_ERROR_MAIL_SUBJECT;
$this-&gt;err_disp = $err_disp;
$this-&gt;dbFactory = SC_DB_DBFactory_Ex::getInstance();

「$this->conn->query(”SET NAMES utf8″);」を追記すれば解決する。

※ この作業を行うタイミングが重要です。
インストールのどのタイミングで行うか、DB接続直後です。
最近のバージョンはやり方が違う。
一度インストールし、上記エンコード指定をした後、再度インストールする。
このときデータベースが存在するので削除するかと聞いてくるので、削除する。
これでよいのだが、既にデータを登録しているときは消えてしまうので注意が必要だ。
注意
エンコード関連を変更した後は、キャッシュファイルのクリアを忘れるべからず。
(/data/chash)

解説
php.ini のエンコード関係は、あまり指定しないのがサーバー屋の流儀である。
その場合、データベースの読み書きは、サーバーのデフォルト・エンコードで行われる。
サーバーのエンコードは、
最近は、UTF-8が多くなってきたが、以前はEUCが主流だった。
DBのエンコードとPHPファイルのエンコードが同じであっても、文字化けが発生する場合は、サーバーのデフォルトエンコードを疑うのが基本である。

エンコードをきちんと理解しないで安易にまねすると、復旧不可能に陥ります。

ご自身の責任で行ってください。

EC-CUBEのデザイン管理で、勝手にエスケープされる

EC-CUBEを地価鯖(チカッパサーバー)で運用していると、

管理画面から編集したときに「”」が勝手にエスケープされてしまう。

「”」→「¥”」

対応策

magic_quotes_gpc が ON ならば OFF にする。

対応策というより「常識」です。

チカッパでは、”,htaccess” に “php_flag magic_quotes_gpc 0” と書いても効きません。
コントロールパネル → php.ini設定
で設定します。

カテゴリLevrl1 ならリンクしない、それ以外はリンクする

<!-- カテゴリLevrl1 ならリンクしない、それ以外はリンクする -->
<!--{php}-->$hoge = ($this->get_template_vars('level')); if($hoge == 1){<!--{/php}-->
    <!--{$arrTree&#91;cnt&#93;.category_name|escape}-->
<!--{php}-->}else{<!--{/php}-->
    <a href="<!--{$smarty.const.URL_DIR}-->products/list.php?category_id=<!--{$arrTree&#91;cnt&#93;.category_id}-->"<!--{if in_array($arrTree&#91;cnt&#93;.category_id, $tpl_category_id) }--> class="onlink"<!--{/if}-->>
        <!--{$arrTree&#91;cnt&#93;.category_name|escape}-->
    </a>
<!--{php}-->}<!--{/php}-->

新規に作成したページのエラー

下記のようなエラーを吐いて何も表示されない。

Warning: Unknown: SAFE MODE Restriction in effect. The script whose gid is 1000 is not allowed to access /virtual/ドメイン名/public_html/xxxx/user_data/guide.php owned by uid 1000 in Unknown on line 0

Warning: Unknown: SAFE MODE Restriction in effect. The script whose uid is 1000 is not allowed to access /virtual/ドメイン名/public_html/xxxx/user_data/guide.php owned by uid 1000 in Unknown on line 0

Warning: Unknown: failed to open stream: Success in Unknown on line 0

Fatal error: Unknown: Failed opening required '/virtual/ドメイン名/public_html/xxxx/user_data/guide.php' (include_path='.:/usr/local/lib/php') in Unknown on line 0

user_dataのパーミッションは777
user_data内のphpファイルの権利者がapacheになっています。
これを、他のファイルと同じように変更すると回避できる。

子カテゴリーを表示する

tpl_subtitleに親カテゴリー+子カテゴリーを表示する

[修正ファイル EC-CUBE2系]

data/class/pages/products/LC_Page_Products_List.php

[修正前]

$arrFirstCat = $objDb->sfGetFirstCat($arrCategory_id[0]);
$tpl_subtitle = $arrFirstCat['name'];

[修正後]

$tpl_subtitle = $objDb->sfGetCatCombName($arrCategory_id[0]);

とすることで、親カテゴリー+子カテゴリーも表示する事が出来ます。

EC-CUBEのデータベースの文字化け

管理画面では化けないが、データベースをのぞくと化けてしまう。
これがEC-CUBEの仕様のようです。

そこで回避策ですが…
サーバー環境により異なりますので、一例としてご覧ください。

  1. 普通にインストール
  2. データベースのテーブルを全て削除
  3. お決まりの「UTF-8化おまじない」を行う
  4. 再度eccubeインストール

たったこれだけで、EC-CUBEが快適に利用できます。

データベースでも化けていないので、
メンテナンスも、サーバー移転も心配がありません。

オープンソースとは、完全でないからオープンソースです。
完璧にするのは利用者自身に委ねられています。

皆さんも挑戦してね!

商品をカートに入れる処理

商品を買い物カゴに入れる処理

// 新カートID
$new_no = カート内の番号;// product_id
$_SESSION[cart][$new_no][id][0] = (string)$product_id;

// 規格1
$_SESSION[cart][$new_no][id][1] = (string)$stsize;

// 規格2、指定がない場合は「0」
$_SESSION[cart][$new_no][id][2] = (string)0;

// 数
$_SESSION[cart][$new_no][quantity] = 1;

// カート番号
$_SESSION[cart][$new_no][cart_no] = カート内の番号;

// 価格
$_SESSION[cart][$new_no][price] = $price02;

// ポイントレート
$_SESSION[cart][$new_no][point_rate] = $point_rate;


このようにしてセッションに登録すれば、カートに入ったことになる。
しかし、注視すべき点が一つある。
(string)のようにするのが重要!
配列の型が適切でないと、決済の最後の処理で、「申し訳ございませんが、ご購入の直前で売り切れた商品があります。この手続きは無効となりました」としかられてしまう。

もとファイルを変更するなら
/data/class/SC_CartSession.php

少なくなった在庫をメールで知らせてくれる機能

/html/shopping/complete.php (/data/class/pages/shopping/LC_Page_Shopping_Complete.php)

// 在庫を減らす処理
function lfReduceStock($objQuery, $arrID, $quantity) {
    $where = "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?";
    $arrRet = $objQuery->select("stock, stock_unlimited", "dtb_products_class", $where, $arrID);
    
    // 売り切れエラー
    if(($arrRet[0]['stock_unlimited'] != '1' && $arrRet[0]['stock'] < $quantity) || $quantity == 0) {
        $objQuery->rollback();
        sfDispSiteError(SOLD_OUT, "", true);
    // 無制限の場合、在庫はNULL
    } elseif($arrRet[0]['stock_unlimited'] == '1') {
        $sqlval['stock'] = null;
        $objQuery->update("dtb_products_class", $sqlval, $where, $arrID);
    // 在庫を減らす
    } else {
        $sqlval['stock'] = ($arrRet[0]['stock'] - $quantity);
        if($sqlval['stock'] == "") {
            $sqlval['stock'] = '0';
        }        
        $objQuery->update("dtb_products_class", $sqlval, $where, $arrID);
    }
    
<div style="color:tomato;">
// 在庫数が0の場合はNULL
    if( ($sqlval['stock'] <= 5) && ($arrRet&#91;0&#93;&#91;'stock_unlimited'&#93; != '1') ){
        // メール送信先
        $stock_mail = "zaiko@domain.com";
        // 件名
        $stock_sub = "商品在庫が少なくなりました。";
        // メッセージ
        $stock_msg = "商品ID:".$arrID&#91;0&#93;."(".$arrID&#91;1&#93;.",".$arrID&#91;2&#93;.")"."の商品が少なくなりました。";
        // メールを送信します。
        mb_send_mail($stock_mail, $stock_sub, $stock_msg);
    }
</div>
}

EC-CUBEのログインチェック(裏技)

カスタマイズによる追加管理画面を別窓で開く場合、SESSIONを引っ張ってきてログインチェックをするのが正しい方法だが、
これでもいいじゃないか?
『「/admin/」からのリンクアクセスのみ許可する』方法でも、セキュリティ的には、変わらない。
しかもソースコードは短くなるので、重宝しています。

 //------------------------------------------------------
// LOGIN_CHECK
    if (preg_match("/admin/", $_SERVER[HTTP_REFERER])){
        
    }else{
        echo "&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&gt;&lt;body&gt;&lt;div style=\"color:red;\"&gt;\n不正なアクセスです。&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;\n";
        exit();
    }
 // EOF &gt;&gt; LOGIN_CHECK
//------------------------------------------------------

変数の表示

「POST, GET, SESSION, SERVER」などの変数を表示する。

echo '&lt;pre&gt;&lt;h3&gt;_GET&lt;/h3&gt;';
var_dump($_GET);
echo '&lt;h3&gt;_POST&lt;/h3&gt;';
var_dump($_POST);
echo '&lt;h3&gt;_SESSION&lt;/h3&gt;';
var_dump($_SESSION);
echo '&lt;h3&gt;_SERVER&lt;/h3&gt;';
var_dump($_SERVER);

 
 

書いたり、消したりがめんどうなので、こんな感じです。
EC-CUBEの場合

&lt;!--{php}--&gt;
if($_GET[hack] != ""){
    $_SESSION[hack] = 1;
}
if($_SESSION[hack] == 1){
    echo '&lt;pre style="text-align:left;"&gt;&lt;h3&gt;_GET&lt;/h3&gt;';
    var_dump($_GET);
    echo '&lt;h3&gt;_POST&lt;/h3&gt;';
    var_dump($_POST);
    echo '&lt;h3&gt;_SESSION&lt;/h3&gt;';
    var_dump($_SESSION);
    echo '&lt;h3&gt;_SERVER&lt;/h3&gt;';
    var_dump($_SERVER);
    echo '&lt;/pre&gt;';
}
&lt;!--{/php}--&gt;

ECCUBEの文字化け

サーバ移転や、試験環境などの構築で、文字化けが発生することがしばしばある。
データベース接続まわりを除いてみると、大切な記述が欠けている。

ファイル名: /data/class/SC_DbConn.php
65行付近

$this->conn = $objDbConn;
$this->conn->query("SET NAMES utf8");
$this->error_mail_to = DB_ERROR_MAIL_TO;
$this->error_mail_title = DB_ERROR_MAIL_SUBJECT;
$this->err_disp = $err_disp;
$this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
$this->conn->query("SET NAMES utf8");

を追記すれば解決する。

※ この作業を行うタイミングが重要です。
インストールのどのタイミングで行うか、DB接続直後です。

注意
エンコード関連を変更した後は、キャッシュファイルのクリアを忘れるべからず。

解説
php.ini のエンコード関係は、あまり指定しないのがサーバー屋の流儀である。
その場合、データベースの読み書きは、サーバーのデフォルト・エンコードで行われる。

サーバーのエンコードは、
最近は、UTF-8が多くなってきたが、以前はEUCが主流だった。

DBのエンコードとPHPファイルのエンコードが同じであっても、文字化けが発生する場合は、サーバーのデフォルトエンコードを疑うのが基本である。

EC-CUBE ヴァージョン 2.3.4 のClass名が変

EC-CUBE ヴァージョン 2.3.4
同じバージョンでありながら、試験環境の最新のものと実稼動サーバーの仕様が違う。
w(°o°)w おおっ!!

レイアウトも全く同じになのに表示が大きく乱れる。

管理画面から編集できるソースではない場所に書かれているクラス名が違うのには驚いた。
統一性とか、管理体制に劣ることがまた立証されてしまった。
オープンソースだから仕方ない。

言い換えれば、「EC-CUBE Myバージョン」の完成度が上がっていくだけのことだ。

EC-CUBEでRSSの日時を反映させる

EC-CUBEのRSSでは、日付けと日時が反映されないバグがあります。
バグというよりは、製作途中のようなソースコードなのですが、この機会に機能させてみましょう。

[対象ファイル1]
data/class/pages/rss/LC_Page_Rss.php

71行目付近の
「$this->timestamp = SC_Utils…」を削除します。

lfGetNewsという関数を丸ごと書き換えます。

[対象ファイル2]
data/Smarty/templates/default/rss/index.tpl

49行目あたりの「<!–{* <pubDate><!–{“r”|sf_mktime:$arrNews[cnt…」を削除
50行目あたりの「 <pubDate><!–{$arrNews[cnt].news_date|escape}–></pubDate>」を変更します。

詳細なソースコードの全文はこちらです。

EC-CUBEでIEでSSLのエラー

EC-CUBEでIEでSSL接続した場合、どのページに飛んでもセキュリティ情報のアラームが毎回表示される場合の修正方法です。
「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。 保護されていない項目を表示しますか?」

次のページはSSL(https)なのに、http://○×□▽… というように、http:// でファイルや画像を読み込んでいませんか?