タグ: オープンソース

【EC-CUBE】商品一覧ページの商品の並べ替え降順を追加する

一覧ページの並べ替えリンクで、価格順に昇順だけでなく降順を追加する。
新着順も同様に変更可能。

その1)/data/Smarty/templates/default/list.tplに降順並べ替え用のリンクを追加

L69あたりから(ver.2.3.2例)のソースに価格降順用のソースを追記。「価格順」のソースをコピペして編集すればOK。

 <!–件数ここから–>
  <!–{if $tpl_linemax > 0}–>
  <ul class=”pagenumberarea”>
    <li class=”left”><span class=”pagenumber”><!–{$tpl_linemax}–></span>件の商品がございます。</li>
    <li class=”center”><!–{$tpl_strnavi}–></li>
    <li class=”right”><!–{if $orderby != ‘price’}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘price’)”>価格順</a>
    <!–{else}–>
        <strong>価格順</strong>
    <!–{/if}–>&nbsp;
  <!–{if $orderby != ‘price2’}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘price2’)”>価格降順</a>
    <!–{else}–>
        <strong>価格降順</strong>
    <!–{/if}–>&nbsp;
    <!–{if $orderby != “date”}–>
        <a href=”javascript:fnModeSubmit(”, ‘orderby’, ‘date’)”>新着順</a>
    <!–{else}–>
        <strong>新着順</strong>
    <!–{/if}–>
    </li>
  </ul><!–件数ここまで–>
  <!–{else}–>
    <!–{include file=”frontparts/search_zero.tpl”}–>
  <!–{/if}–>

その2)/data/class/pages/products/LC_Page_Products_List.phpに価格降順用のソースを追記。

こちらも同様に、上の「価格順」のソースをコピペして編集すればOK。

L393あたりから

        //価格順
        case ‘price’:
            $col = “DISTINCT price02_min, product_id, product_code_min, product_code_max,”
                . ” name, comment1, comment2, comment3,”
                . ” main_list_comment, main_image, main_list_image,”
                . ” price01_min, price01_max, price02_max,”
                . ” stock_min, stock_max, stock_unlimited_min, stock_unlimited_max,”
                . ” point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee,”
                . ” status, product_flag, create_date, del_flg”;
            $from = “vw_products_allclass AS T1”;
            $order = “price02_min, product_id”;
            break;

というソースがあるので、その下にコピーして下記のように編集。

        //価格順
        case ‘price2’:
            $col = “DISTINCT price02_min, product_id, product_code_min, product_code_max,”
                . ” name, comment1, comment2, comment3,”
                . ” main_list_comment, main_image, main_list_image,”
                . ” price01_min, price01_max, price02_max,”
                . ” stock_min, stock_max, stock_unlimited_min, stock_unlimited_max,”
                . ” point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee,”
                . ” status, product_flag, create_date, del_flg”;
            $from = “vw_products_allclass AS T1”;
            $order = “price02_min DESC, product_id”;
            break;

これで、追加OK。新着順を古いものから並べたいときは、同様の手順でその下の「新着順」のコードをコピペして、一番下の「$order = “create_date DESC, product_id”;」を「$order = “create_date, product_id”;」(DESCを削除)とすればよい。

【EC-CUBE】データベース内の文字化け対策

DBを作ったら、先にphpMyAdminでDBに接続。

上のタブで、SQLを開き、まずは、

status

または、

show variables like “char%”;

と打ち込んで、現在の文字コードを確認。

サーバの設定にあたる「character_set_server」以外をUTF8に揃える。

ので、

set names utf8;
または、
alter database 〜DB名 character set utf8; (←たぶんこっち。)

で変更。確認して変更されていればOK。

これで変更できない場合は、phpMyAdminのトップページなどから、「照合順序」で変えればいいかと。

character_set_serverは、サーバの設定なので、個別には変更できないが、専用サーバなどであれば、my.conf等で変更可能。

my.cnfの[mysqld]のところにdefault-character-set=utf8と書いておけばOK。

2.3.2以前の場合は、それだけでは、システム動作時に文字化けに戻ってしまうので、

data/class/SC_DbConn.php

L64~
$this->conn = $objDbConn; 
の手前に、

if (DB_TYPE == 'mysql') {
$objDbConn->query('SET NAMES utf8');
}

を追加。(参考:http://svn.ec-cube.net/open_trac/changeset/17559)この場合、my.cnfの設定は必要ない。

【EC-CUBE】新着商品をブロックで表示する

1)まずはオススメ商品のPHPソース3つをコピーして新着商品用にファイル名変更。

  • /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5.php
  • /data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5_Ex.php
  • /frontparts/bloc/best5.php

をそれぞれコピーし、Best5のところをNewに変更する。

  • /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_New.php
  • /data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Ex.php
  • /frontparts/bloc/new.php

2)PHPソースの中の変数などBest5→Newへbest5→newへ置き換えする。(数箇所ある)

3)LC_Page_FrontParts_Bloc_New.phpのソースを変更。(Ver.2.3RC1の場合L55~)

    function process() {

        if (defined(“MOBILE_SITE”) && MOBILE_SITE) {
            $objView = new SC_MobileView();
        } else {
            $objView = new SC_SiteView();
        }
        $objSiteInfo = $objView->objSiteInfo;

~(中略:この中身を下記ソースに入れ替え)

        $objView->display($this->tpl_mainpage);
    }

———-(モバイルについて記載している↓この手前まで)
    /**
     * モバイルページを初期化する.
———-

  function process() {
if (defined(“MOBILE_SITE”) && MOBILE_SITE) {
$objView = new SC_MobileView();
} else {
$objView = new SC_SiteView();
}
$objSiteInfo = $objView->objSiteInfo;

// 基本情報を渡す
$objSiteInfo = new SC_SiteInfo();
$this->arrInfo = $objSiteInfo->data;
$objQuery = new SC_Query();

//検索したい商品のステータスを設定
//NEW→1, 残りわずか→2, ポイント2倍→3, オススメ→4, 限定品→5
$productFlag = 1;

//検索する商品のステータスをランダムに決定し、表示させたい場合は以下のコメントを外してください。
//$id_count = $objQuery->count(mtb_status);
//$productFlag = rand(1,$id_count);

$this->statusName =$objQuery->get(“mtb_status_image”, “name”, “id={$productFlag}”);

//表示する商品の件数
$listCount = 8;

$ret = “”;
$arrTmp[$productFlag] = “1”;

for($i = 1; $i <= $productFlag; $i++) {
if($arrTmp[$i] == “1”) {
$ret.= “1”;
} else {
$ret.= “_”;
}
}

if($ret != “”) {
$ret.= “%”;
}
//$col = “dtb_products.product_id, dtb_products.name, dtb_products.main_image,
// MIN(dtb_products_class.price02) AS price02_min, MAX(dtb_products_class.price02) AS price02_max”;
//$from = “dtb_products INNER JOIN dtb_products_class using(product_id)”;
//$where = “product_flag LIKE \”{$ret}\””;
//$groupby = “product_id”;
//$this->groupby=$objQuery->setgroupby($groupby);
//商品の表示はupdate_dateが新しい順
//$order = “dtb_products.update_date DESC”;
//$this->order=$objQuery->setorder($order);

$col = “DISTINCT price02_min, product_id, price02_max, main_list_image, status, product_flag, name”;
$from = “vw_products_allclass AS T1”;
$where = “del_flg = 0 AND status = 1 AND product_flag LIKE ‘{$ret}'”;
//商品の表示はproduct_id逆順
$order = “product_id DESC”;
$this->order=$objQuery->setorder($order);

$arrFlagList = $objQuery->select($col, $from, $where);

//商品の表示をランダムに抽出する場合は以下のコメントを外してください。
//srand((double)microtime()*1000000); //乱数生成器を初期化
//shuffle($arrFlagList);

$this->arrFlagProducts = array_slice($arrFlagList, 0, $listCount);
//この変数名をテンプレの値の呼び出しに使うので注意。

$objSubView = new SC_SiteView();
$objSubView->assignobj($this);
$objSubView->display($this->tpl_mainpage);
}

元のソースの最後のほうの商品検索functionは不要なので、削除。

4)上記の3つのファイルをアップロード。

5)新着商品用のブロックを作り、DBを修正する。

まず、管理画面で「デザイン管理」→「ブロック編集」でブロック名「新着商品表示」/ファイル名「new(.tpl)」を作成する。
内容は、おすすめ商品用ブロック(best5.tpl)をコピーして保存。

phpMyAdminでデータベースを開いて、「dtb_bloc」テーブルの中を見ると、新商品用ブロックのデータ、NEWが追加されているので、その中の、php_path(最初はnullとなっている)に「frontparts/bloc/new.php」と値をセット。

各ファイルの中で変数名がEC-CUBEのバージョンアップによって変更になったりすることがある。そのときは、BEST5のソースを参考にして、適宜調整するとよい。

例えば、$arrBest5は→$arrFlagProductsとなる。

これでOK。ブロックのレイアウトは表示したいように適宜変更。

参考:http://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=1276&forum=6

【EC-CUBE】ヘッダーにログインやかごの中ブロックを表示するには

ヘッダーを編集して、

「ログイン」を表示したい場合

<!--{include_php file=`$smarty.const.HTML_PATH`frontparts/bloc/login.php}-->

「商品検索」を表示したい場合

<!--{include_php file=`$smarty.const.HTML_PATH`frontparts/bloc/search_products.php}-->

「かごの中」を表示したい場合

<!--{include_php file=`$smarty.const.HTML_PATH`frontparts/bloc/cart.php}-->

をそれぞれヘッダーのソースに追加する。(ver.2.3RC1にて動作検証)

フッターは未検証だが、多分同様にすれば可能。