5月 05

新商品のみを表示するブロックを作ろう。

このブロックは、EC-CUBEの開発コミュニティであがっていたスレッド「新入荷商品をブロックに表示したい」を参考にさせて頂きました。参考というよりも、ほとんど丸々頂いている(duckeiさんに心より感謝)

まず、新規ブロックの作り方から。

  1. 管理画面より、「デザイン管理」→「ブロック編集」にて、
    ブロック名(新商品)、ファイル名(new)を追加。
    その下の大きなテキストボックスには、best5.tplの中身をコピペ。
  2. DBのdtb_blocに新商品ブロックのデータが追加されているので、
    php_path:frontparts/bloc/new.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
    上記3ファイルをそれぞれコピーし、Best5(best5)をNew(new)にファイル名を変更。
  4. LC_Page_FrontParts_Bloc_New.php
    LC_Page_FrontParts_Bloc_New_Ex.php
    new.php
    の中身の”Best5″(best5)を”New”(new)に置換。

とりあえずこれでブロック完成。(たぶん)
コピーしただけなので、まだ中身はおすすめ商品のまま。

次、LC_Page_FrontParts_Bloc_New.phpを以下のように修正。

function process() {

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

$objQuery = new SC_Query();

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

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

$this->statusName =$objQuery->get("mtb_status_image", "name", "id={$productNew}");

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

$ret = "";
$arrTmp[$productNew] = "1";

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

if($ret != "") {
$ret.= "%";
}

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

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

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

$this->arrNewProducts = $arrNewList;

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

元々、新商品以外のステータスにも対応させているため、純粋なる新商品検索処理ではない。
なので、パラメータを変更するだけで、使い回しができる。

テンプレートは/user_data/packages/default/bloc/new.tplに生成されている。
ソースのarrBestProductsをarrNewListに置換。
これで、新商品だけを表示することができる。

新商品ブロックを作ろう(カテゴリ指定)もご覧あれ。

written by sixbird \\ tags: ,


10 Responses to “新商品ブロックを作ろう”

  1. 1. tonton Says:

    こんにちは。いつもこちらのサイトを拝見させて頂いています。ありがとうございます。

    こちらのコラムなのですが、どうも2.3.2にバージョン上がったタイミングくらいで、使用しているロジックが変わったのか、何度やっても表示されなくなってしまいました。

    ちゃんと覚えてはいないのですが、2.3RC1でやってみたときはできていたように思うのですが・・・
    残念です;
    また、アップデートされましたら、宜しくお願いします。楽しみにしています。

  2. 2. 藤原 Says:

    お世話になっております。
    ページで解説されている通りにやってみましたが、うまく表示されません。
    EC-CUBEは、正式版2.3.0を使用しています。

    そのままコピペして良いのか、それとも全角のダブルクウォートやシングルクウォートを半角にしてからペーストしなければならないのか、よくわかりません。
    とりあえず、半角に変換してからペーストしてみました。

    トップページに新商品ブロックを設置してみましたが、何も表示されない状態です。

    $arrTmp[$productNew] = “1″;
    上記は全角のダブルクウォートと半角のダブルクウォートが使われています。

    $ret.= “_”;
    上記は両方とも全角が使われています。

    お手数をおかけしますが、アドバイスを頂けると助かります。
    もし可能であれば、修正されたファイル一式を頂ければ確実かもしれません。
    とても便利なプログラムなので、是非利用したく思っております。

    何卒、よろしくお願い致します。

    PS.カテゴリ版の方も試してみましたが、何も表示されない状態になってしまいます。

  3. 3. 藤原 Says:

    度々すみません。

    LC_Page_FrontParts_Bloc_New.phpに記述する内容で確認があります。
    LC_Page_FrontParts_Bloc_Best5.phpをコピーした状態で中を見てみると、「$objSubView」では無く「$objView」になっています。

    例えば「$objSubView->display($this->tpl_mainpage);」ではなく、「$objView->display($this->tpl_mainpage);」になっています。

    何日も苦戦していますが、未だにできません。
    アドバイスをお願い致します。

  4. 4. sixbird Says:

    こちらでソースをエディタにコピペして確認しましたが、全角にはなりませんでした。
    コピペのときに変換されているのかもしれないですね。

    ただ、基本的にPHPは全て半角です。
    全角ではエラーになってしまいます。(コメントでの全角はOK)
    ですので、もし全角があった場合は、半角にしてください。

  5. 5. sixbird Says:

    この記事をポストしたのが去年の5月ですので、バージョンが違いによりソースも一部違う箇所があるかと思います。

    “$objSubView” が “$objView” になっている場合は、
     $objSubView = new SC_SiteView();
    の箇所を、
     $objView = new SC_SiteView();
    にしてあげればいけると思います。

  6. 6. 藤原 Says:

    お返事ありがとうございます。

    エディターで全角を半角にする処理をして、あとはざっと目で見て修正してみました。
    ですが、やはり上手くいきません。何も表示されない状態です。

    LC_Page_FrontParts_Bloc_New.phpについてですが、
    function process() {

    }
    の間の記述を、こちらに記載されている内容に書き換えれば良いのですよね?

    もうほとんどお手上げな状態になってしまってます(ー_ー;
    ですが、もうちょっとがんばってみたいので、引き続きお力添えを頂けると助かります。

  7. 7. sixbird Says:

    何も表示されない状態です。

    何も表示されないというのは、画面が真っ白ということでしょうか?
    もしそのようでしたら、PHPエラーになっている可能性があります。
    ログをご覧下さい。

    こちらに記載されている内容に書き換えれば良いのですよね?

    はい、基本的にはそれでうまくいくはずです。
    ただバージョンの違いによってダメな場合もあるかと思います。

  8. 8. 藤原 Says:

    お返事ありがとうございます。
    何も表示されないというのは、新商品ブロック設置した箇所には、何も表示されないと言う意味です。

    ですが、やっと上手く表示させる事ができました。
    私はMacからのアクセスなので、上手くコピー&ペーストができなかったのかもしれません。
    と言うより、掲載されているプログラムの表示がWinから見るのと少し違ってしまうのかも。
    カテゴリ版の方のプログラムを利用しようとしましたが、「$where = ” substring(product_flag,1,1) = ‘1′”;」の記述が、Macから見ると「‘1′」が両方とも「’」にはなっていません。
    そのままコピー&ペーストしたら、上記の箇所に異常があるとエラーが出たため、「’」に書き換えたら表示されるようになりました。

    ここでまた1つ問題が発生しました。
    画像が表示されません。
    いろんな記述を試してみましたが、グレーの四角が表示されるだけで商品の画像が表示されませんでした。
    ソースを見てみると、画像パスを取得できていないみたいです。
    そこで、本家のコミュニティーで検索して探してみました。
    いろいろと検索に該当しましたが、解決方法を探す事ができました。
    参考URL:http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2797&forum=11&post_id=10661#forumpost10661

    上記を参考にして、
    $col = ” product_id, price02_min, price02_max, main_image, name”;

    $col = ” product_id, price02_min, price02_max, main_image, name, main_list_image”;
    にしたら、画像も無事に表示できるようになりました。

    ここ数日間ずっと苦戦していましたが、これでこの便利なプログラムを活用できるようになりました。

    あとカテゴリ版についてですが、表示する商品数を指定したり、ランダム表示にしたりできないでしょうか?
    設定している商品数が多いと、画面に表示される商品数も多くなり重くなってしまうので。

    カテゴリ版にも、表示数設定やランダム機能の追加をお願い致します。

    とりあえず、無事に表示できるようになって良かったです(^ー^)

  9. 9. sixbird Says:

    無事表示されてよかったです。
    SQLの取得フィールドにmain_list_imageを追加しておきます。

    シングルコーテーションの件ですが、これはソースコードをフォーマットするWordpressのプラグインに問題があったようです。
    違うプラグインに取り替えましたので、これで問題ない(はず)です。余計なお手間をかけてしまってすいませんでした(汗)

    「表示数設定やランダム機能」はSQLをちょこっと弄ればすぐできます。
    あとでカテゴリ別の方にアップしておきます。

  10. 10. 藤原 Says:

    sixbird様、ご要望にお答えして頂きありがとうございます。

    カテゴリ版に商品数設定やランダム機能が付いたので、カテゴリごとの新着商品やオススメ商品を表示できるようになり、EC-CUBEにデフォルトで付いているオススメ機能よりも、かなり便利になりました。

    あとMacからみても、シングルクウォートやダブルクウォートも、問題なく見れるようになりました。

    「売れ筋商品表示」の方も、楽しみにお待ちしております。

    今回、新着商品の表示機能を付ける事ができたのは、とても助かりました。

    今後も、便利な機能を作成されるのを期待しております(^ー^)

Leave a Reply