[EC-CUBE 2.11.1] 新着商品を表示

商品登録画面の商品ステータスの「NEW」にチェックを入れた商品を、任意の件数だけPCに自動表示させるブロックの作り方です。
※EC-CUBE2.11.5 で試したコードはこちら。

html/frontparts/bloc/product_flag.php を以下のように作成します。

<?php

// {{{ requires
require_once(CLASS_EX_REALDIR . "page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_ProductFlag_Ex.php");

// }}}
// {{{ generate page

$objPage = new LC_Page_FrontParts_Bloc_ProductFlag_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();

?>

次に data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_ProductFlag_Ex.php を以下のように作成します。

<?php

// {{{ requires
require_once(CLASS_REALDIR . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc_ProductFlag.php");

/**
 * productStatus のページクラス(拡張).
 *
 * LC_Page_FrontParts_Bloc_ProductFlag をカスタマイズする場合はこのクラスを編集する.
 *
 */
class LC_Page_FrontParts_Bloc_ProductFlag_Ex extends LC_Page_FrontParts_Bloc_ProductFlag {

    // }}}
    // {{{ functions

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        parent::process();
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }
}

?>

さらに、data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_ProductFlag.php を以下のように作成します。

<?php

// {{{ requires
require_once CLASS_REALDIR . 'pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php';

/**
 * productStatus のページクラス.
 *
 * @package Page
 */
class LC_Page_FrontParts_Bloc_ProductFlag extends LC_Page_FrontParts_Bloc {

    // }}}
    // {{{ functions

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
        $bloc_file = 'productFlag.tpl';
        $this->setTplMainpage($bloc_file);
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        if (defined("MOBILE_SITE") && MOBILE_SITE) {
            $objView = new SC_MobileView();
        } else {
            $objView = new SC_SiteView();
        }
        $objSiteInfo = $objView->objSiteInfo;

        // 基本情報を渡す
        $objSiteInfo = SC_Helper_DB_Ex::sfGetBasisData();
        $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("name", "mtb_status_image", "id = ? ", array($productFlag));

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

        $col = "dtb_products.product_id, dtb_products.name, dtb_products.main_list_image, dtb_products.main_list_comment AS comment, MIN(dtb_products_class.price02) AS price02_min, MAX(dtb_products_class.price02) AS price02_max";
        $from = "dtb_products INNER JOIN dtb_products_class ON dtb_products.product_id = dtb_products_class.product_id INNER JOIN dtb_product_status ON dtb_products.product_id = dtb_product_status.product_id";
        $where = "dtb_products.del_flg = 0 AND dtb_products.status = 1 AND dtb_product_status.product_status_id = ?";
        $groupby = "dtb_products.product_id, dtb_products.name, dtb_products.main_list_image, dtb_products.main_list_comment, dtb_product_status.product_id, dtb_products.update_date";
        $this->groupby=$objQuery->setGroupBy($groupby);

        //商品の表示はupdate_dateが新しい順
        $order = "dtb_products.update_date DESC";
        $this->order=$objQuery->setOrder($order);

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

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

        $this->arrFlagProducts = array_slice($arrFlagList, 0, $listCount);

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

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }
}

?>

さらに、data/Smarty/templates/default/frontparts/bloc/productFlag.tpl を以下のように作成します。

<!--{if count($arrFlagProducts) > 0}-->
<div class="bloc_outer clearfix">
    <div id="recomend_area">
        <h2>新着商品</h2>
        <!--{section name=cnt loop=$arrFlagProducts step=2}-->
        <div class="bloc_body clearfix">
            <div class="recomendleft clearfix">
                <div class="productImage">
                    <a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrFlagProducts[cnt].product_id|u}-->">
                        <img src="<!--{$smarty.const.ROOT_URLPATH}-->resize_image.php?image=<!--{$arrFlagProducts[cnt].main_list_image|sfNoImageMainList|h}-->&amp;wi
dth=80&amp;height=80" alt="<!--{$arrFlagProducts[cnt].name|h}-->" /></a>
                </div>
                <div class="productContents">
                    <h3>
                        <a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrFlagProducts[cnt].product_id|u}-->"><!--{$arrFlagProducts[cnt].name|h}--></a>
                    </h3>
                    <!--{assign var=price01 value=`$arrFlagProducts[cnt].price01_min`}-->
                    <!--{assign var=price02 value=`$arrFlagProducts[cnt].price02_min`}-->
                    <p class="sale_price"><!--{$smarty.const.SALE_PRICE_TITLE}-->(税込):
                        <span class="price"><!--{$price02|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}--> 円</span>
                    </p>
                    <p class="mini comment"><!--{$arrFlagProducts[cnt].comment|h|nl2br}--></p>
                </div>
            </div>

            <div class="recomendright clearfix">
                <div class="productImage">
                    <!--{assign var=cnt2 value=`$smarty.section.cnt.iteration*$smarty.section.cnt.step-1`}-->
                    <!--{if $arrFlagProducts[$cnt2]|count > 0}-->

                    <a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrFlagProducts[$cnt2].product_id|u}-->">
                    <img src="<!--{$smarty.const.ROOT_URLPATH}-->resize_image.php?image=<!--{$arrFlagProducts[$cnt2].main_list_image|sfNoImageMainList|h}-->&amp;widt
h=80&amp;height=80" alt="<!--{$arrFlagProducts[$cnt2].name|h}-->" /></a>
                </div>
                <div class="productContents">
                    <h3>
                        <a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrFlagProducts[$cnt2].product_id|u}-->"><!--{$arrFlagProducts[$cnt2].name|h}--></a>
                    </h3>

                    <!--{assign var=price01 value=`$arrFlagProducts[$cnt2].price01_min`}-->
                    <!--{assign var=price02 value=`$arrFlagProducts[$cnt2].price02_min`}-->

                    <p class="sale_price"><!--{$smarty.const.SALE_PRICE_TITLE}-->(税込):
                        <span class="price"><!--{$price02|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}--> 円</span>
                    </p>
                    <p class="mini comment"><!--{$arrFlagProducts[$cnt2].comment|h|nl2br}--></p>
                    <!--{/if}-->
                </div>
            </div>

        </div>
        <!--{/section}-->
    </div>
</div>
<!--{/if}-->

PostgreSQL のスーパーユーザーである postgres にログインして、dtb_bloc に追加したブロックの情報を挿入します。
phpMyAdmin や phpPgAdmin でやっていただいても良いです。

[bash]su – postgres
psql database_name[/bash]

bloc_id の最大値を調べておきます。

# select max(bloc_id) from dtb_bloc;
 max
-----
   9
(1 row)

追加したブロックのレコードを dtb_bloc に挿入します。2つ目のパラメータが bloc_id です。

insert into dtb_bloc values(10,10,'productFlag','productFlag.tpl','productFlag',now(),now(),'frontparts/bloc/product_flag.php',0);

最後に、管理画面にログインして、デザイン管理 > PC > レイアウト設定 で、productFlag ブロックが未使用ブロックに表示されているのを確認したら、あとは適当なエリアにドラッグ&ドロップして配置します。
適当な商品で、商品ステータスを「NEW」にしてみて、商品が表示されるか確認してみてください。

2011/08/10 9:35 コードを一部修正