ようやく EC-CUBE2.11.5 をテスト環境に入れてみました。
そこで時々質問が来る「新着商品を自動表示」が、2.11.5 でできるかなと試してみました。
結論から言うと、特に問題なくできたのですが、
当時のコードを見直すと、なんだか訳わからんことになっているので、
もう少しわかりやすく書き直してみました。
仕様は前回と同じです。
商品ステータスで「NEW」を設定した商品の中から、一定数の商品を表示させるブロックです。
1.html/frontparts/bloc/new_products.php を作成
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
*
* http://www.lockon.co.jp/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// {{{ requires
require_once realpath(dirname(__FILE__)) . '/../../require.php';
require_once(CLASS_EX_REALDIR . "page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Products_Ex.php");
// }}}
// {{{ generate page
$objPage = new LC_Page_FrontParts_Bloc_New_Products_Ex();
$objPage->blocItems = $params['items'];
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();
?>
2.data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Products_Ex.php を作成する
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
*
* http://www.lockon.co.jp/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// {{{ requires
require_once(CLASS_REALDIR . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Products.php");
/**
* New_Products のページクラス(拡張).
*
* LC_Page_FrontParts_Bloc_New_Products をカスタマイズする場合はこのクラスを編集する.
*
*/
class LC_Page_FrontParts_Bloc_New_Products_Ex extends LC_Page_FrontParts_Bloc_New_Products {
// }}}
// {{{ functions
/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
parent::process();
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
}
?>
3.data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_New_Products.php を編集する
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
*
* http://www.lockon.co.jp/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// {{{ requires
require_once CLASS_REALDIR . 'pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php';
/**
* New_Products のページクラス.
*
* @package Page
*/
class LC_Page_FrontParts_Bloc_New_Products extends LC_Page_FrontParts_Bloc {
// }}}
// {{{ functions
/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
$this->action();
$this->sendResponse();
}
/**
* Page のアクション.
*
* @return void
*/
function action() {
// 基本情報を渡す
$objSiteInfo = SC_Helper_DB_Ex::sfGetBasisData();
$this->arrInfo = $objSiteInfo->data;
// 新着商品のステータスIDを設定(デフォルトでは NEW=1)
$new_product_id = 1;
//表示する商品の件数
$limit = 4;
// 新着商品取得
$this->arrNewProducts = $this->getNewProducts($new_product_id, $limit);
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
/**
* 新着商品取得.
*
* @param int 新着商品のステータスID
* @return array 新着商品配列
*/
function getNewProducts($new_product_id, $limit){
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col = <<< __EOS__
p.product_id,
p.name,
p.main_list_image,
p.main_list_comment AS comment,
MIN(pc.price02) AS price02_min,
MAX(pc.price02) AS price02_max
__EOS__;
$from = <<< __EOS__
dtb_products as p
LEFT JOIN dtb_products_class as pc
ON p.product_id = pc.product_id
LEFT JOIN dtb_product_status as ps
ON p.product_id = ps.product_id
__EOS__;
$where = "p.del_flg = 0 AND p.status = 1 AND ps.product_status_id = ?";
$groupby = "p.product_id, p.name, p.main_list_image, p.main_list_comment, ps.product_id, p.update_date";
$objQuery->setGroupBy($groupby);
$objQuery->setOrder('p.update_date DESC');
$objQuery->setLimit($limit);
return $objQuery->select($col, $from, $where, array($new_product_id));
}
}
?>
4.data/Smarty/templates/default/frontparts/bloc/new_products.tpl を作成(CSSは適宜修正してください。)
<!--{if count($arrNewProducts) > 0}-->
<div class="bloc_outer clearfix">
<div id="recommend_area">
<h2>新着商品</h2>
<!--{section name=cnt loop=$arrNewProducts step=2}-->
<div class="bloc_body clearfix">
<div class="product_item clearfix">
<div class="productImage">
<a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrNewProducts[cnt].product_id|u}-->">
<img src="<!--{$smarty.const.ROOT_URLPATH}-->resize_image.php?image=<!--{$arrNewProducts[cnt].main_list_image|sfNoImageMainList|h}-->&width=80&height=80" alt="<!--{$arrNewProducts[cnt].name|h}-->" /></a>
</div>
<div class="productContents">
<h3>
<a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrNewProducts[cnt].product_id|u}-->"><!--{$arrNewProducts[cnt].name|h}--></a>
</h3>
<!--{assign var=price01 value=`$arrNewProducts[cnt].price01_min`}-->
<!--{assign var=price02 value=`$arrNewProducts[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"><!--{$arrNewProducts[cnt].comment|h|nl2br}--></p>
</div>
</div>
<div class="product_item clearfix">
<div class="productImage">
<!--{assign var=cnt2 value=`$smarty.section.cnt.iteration*$smarty.section.cnt.step-1`}-->
<!--{if $arrNewProducts[$cnt2]|count > 0}-->
<a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrNewProducts[$cnt2].product_id|u}-->">
<img src="<!--{$smarty.const.ROOT_URLPATH}-->resize_image.php?image=<!--{$arrNewProducts[$cnt2].main_list_image|sfNoImageMainList|h}-->&width=80&height=80" alt="<!--{$arrNewProducts[$cnt2].name|h}-->" /></a>
</div>
<div class="productContents">
<h3>
<a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrNewProducts[$cnt2].product_id|u}-->"><!--{$arrNewProducts[$cnt2].name|h}--></a>
</h3>
<!--{assign var=price01 value=`$arrNewProducts[$cnt2].price01_min`}-->
<!--{assign var=price02 value=`$arrNewProducts[$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"><!--{$arrNewProducts[$cnt2].comment|h|nl2br}--></p>
<!--{/if}-->
</div>
</div>
</div>
<!--{/section}-->
</div>
</div>
<!--{/if}-->
5.データベース(dtb_bloc)に新規ブロック用のレコードを登録します。phpMyAdminなどを使って行ってください。
bloc_id は、他のブロックと重複しないIDにしてください。
| カラム名 | 値 |
|---|---|
| device_type_id | 10 |
| bloc_id | 10 |
| bloc_name | new_products |
| tpl_path | new_products.tpl |
| filename | new_products |
| create_date | now() |
| update_date | now() |
| php_path | frontparts/bloc/new_products.php |
| deletable_flg | 0 |












ピンバック: [EC-CUBE 2.11.1] 新着商品を自動表示 | NAKWEB × EC-CUBE
ピンバック: EC-CUBE NEWS | EC-CUBEに関するニュースやブログの最新情報をお届けします
ピンバック: [EC-CUBE 2.11.5] 新着商品を表示する その2 | NAKWEB × EC-CUBE
ピンバック: [EC-CUBE 2.11.5] 新着商品を表示する その3 | NAKWEB × EC-CUBE
できました!
今独学でEC-CUBEを試している所です。PHPやデータベースが初心者で湧かないのでこのように丁寧にわかりやすく書かれているととても助かります。
2つ質問があります。
新商品を登録した後、NEWのチェックを外しても表示されてしまいます。NEWのチェックを外したら新着商品から外れるようにしたいのですがどのようにしたらできるのでしょうか。
私の設定のミスなのでしょうか。
もう1点。
掲載数を8点に設定しました。
全商品8点に対して新商品が3点という状態で試しました。
7点表示されました。3点以外はNEWのチェックが入っていません。
新商品が8点に達していない場合は、ランダムに表示されるのでしょうか?
お手数をおかけいたしますが
教えていただけないでしょうか。よろしくお願いいたします。
お世話になります。
当サイトの情報により、PCサイトにて新着商品ブロックを表示させることができました。ありがとうございます。
この新着商品を横に4列に表示させたくてECCubeの開発コミュニティにある以下を参考に致しました。結果はIE6,7では期待通り横4列に表示されるのですが、Firefox,Safari等では横2列に表示されます。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=10468&forum=10
どこでどう調整すれば宜しいかお分かりになりますでしょうか。
一応、block.cssファイルで、firefox、Safari様のハックなどを施し試しましたが、機能しない模様でございます。
chocomame73 様
すいません、ご返事できずだいぶ時間が経過してしまいました。
NEWのチェックを外すと、新着商品からはずれるとは思うのですが、まだ問題は継続していますか?
4pain8pain 様
キャッシュが影響しているということはありませんか?
他PCでも2列表示になりますか?
fukap様
返信感謝致します。
他の3台のPCで試しましたが、結果は同じで、IE系は4列表示されますが、Firefox、Safariは2列表示で残りが次の行に表示されます。
4pain8pain 様
こういうケースでは、Forefoxプラグインの Fireebugなどを使って、
地道にHTMLやCSSを見直していくしかないと思います。
はじめまして、sakuraと申します。
いつも参考にさせていただいております。
以前にお作りになった「[EC-CUBE 2.11.1] 新着商品を表示」では、新着商品のランダム表示があったと思うのですが、「[EC-CUBE 2.11.5] 新着商品を表示する」で、ランダム表示するにはどのようにすればいいでしょうか。
ご回答いただけると、非常にありがたいです。
そういえばランダム表示がありましたね。
自分としては意義を感じていなかったので、はずしてしまいましたが。
以前のコードを見ればわかりますが、ランダム表示は以下の部分で実現されていたと思います。
//商品の表示をランダムに抽出する場合は以下のコメントを外してください。 //srand((double)microtime()*1000000); //乱数生成器を初期化 //shuffle($arrFlagList);なのでこのコードを付けてあげれば良いと思います。
ただし、$arrFlagList の代わりに、$arrNewProducts とかを使うといいですかね。
たぶん、以下のような感じで動くんじゃないかな。
function action() { // 基本情報を渡す $objSiteInfo = SC_Helper_DB_Ex::sfGetBasisData(); $this->arrInfo = $objSiteInfo->data; // 新着商品のステータスIDを設定(デフォルトでは NEW=1) $new_product_id = 1; //表示する商品の件数 $limit = 4; // 新着商品取得 $arrNewProducts = $this->getNewProducts($new_product_id, $limit); //商品の表示をランダムに抽出する場合は以下のコメントを外してください。 //srand((double)microtime()*1000000); //乱数生成器を初期化 //shuffle($arrNewProducts); $this->arrNewProducts = $arrNewProducts; }fukap 様
ありがとうございます。
ランダム表示成功しました。
これからも、こちらのサイトを参考にさせていたきますので、頑張ってください。
はじめまして、 tuyaと申します。
Verは[2.12.2]を使用しております。
以前から参考にさせていただいております。
new_products.tpl の記載で
<!--{assign var=price02 value=`$arrNewProducts[cnt].price02_min`}-->と販売価格を表示していますが
この箇所を条件分岐にしたいのですが
可能でしょうか。
例えば1とか2とかの値を判定して
“ワケあり”とか”交渉可”など
text表示させたいと思っています。
ご回答いただければ、非常にありがたいです。
よろしくお願いいたします。
2.12.2 とかになると、良いプラグインとかないですか?
探せばありそうな気がしますが。
ちなみにご質問の条件分岐ですが、難しくはないと思いますよ。
販売価格の値によって、条件分岐したいということでしょうか。
もしそうであれば、
<!--{if $price02 == 1}--> 1の場合の表示 <!--{elseif $price02 == 2}--> 2の場合の表示 <!--{else}--> それ以外の表示 <!--{/if}-->って感じじゃないですかね、たぶん。
fukap 様
ありがとうございます。
教えていただいたものを
税込価格部分
に記載する事で無事表示させる事ができました。
考えているものに近づけそうです。
一部デフォルトの表示(税込価格表示)が
でているのですが
これはキャッシュによるものでしょうか。
これは自分でもうちょっと調べてみます。
これからも参考にさせていただきたいと思います。ありがとうございました。
fukap 様 お世話になっております。
以前の記載
https://ec-cube.nakweb.com/blog/318.html
でのご質問のように
category_nameを取得表示したいのですが
同じ様に$col、$fromへの記載が
必要になりますでしょうか。
記載方法がわからず質問させていただきました。
お手数をおかけしますが
教えていただけませんでしょうか。
よろしくお願いいたします。
$col, $from への記載は必要だと思います。
以下のような感じでしょうか。希望のものと異なるかもしれませんが。
これ以上はご勘弁を。
/** * 新着商品取得. * * @param int 新着商品のステータスID * @return array 新着商品配列 */ function getNewProducts($new_product_id, $limit){ $objQuery =& SC_Query_Ex::getSingletonInstance(); $col = <<< __EOS__ p.product_id, p.name, p.main_list_image, p.main_list_comment AS comment, MIN(pc.price02) AS price02_min, MAX(pc.price02) AS price02_max, MIN(c.category_name) as category_name __EOS__; $from = <<< __EOS__ dtb_products as p LEFT JOIN dtb_products_class as pc ON p.product_id = pc.product_id LEFT JOIN dtb_product_status as ps ON p.product_id = ps.product_id LEFT JOIN dtb_product_categories as pc2 ON p.product_id = pc2.product_id LEFT JOIN dtb_category as c ON pc2.category_id = c.category_id __EOS__; $where = "p.del_flg = 0 AND p.status = 1 AND ps.product_status_id = ?"; $groupby = "p.product_id, p.name, p.main_list_image, p.main_list_comment, ps.product_id, p.update_date"; $objQuery->setGroupBy($groupby); $objQuery->setOrder('p.update_date DESC'); $objQuery->setLimit($limit); return $objQuery->select($col, $from, $where, array($new_product_id)); }fukap 様
お忙しいところ
回答いただきありがとうございました。
教えていただいた表記で
取得表示させる事ができました。
丁寧に教えていただいて
本当にありがとうございました。
fukap様
価格の箇所ですが、規格を2種類選択させた場合は
上手く表示されず0円になってしまうのですが
どのように修正したらよいのでしょうか。
何卒よろしくお願致します。
maru様
試していないので、間違っているかもしれませんが。
data/Smarty/templates/default/frontparts/bloc/new_products.tpl の17行目あたりを
以下のような感じに書き換えると、うまくいきませんかね?
<!--{assign var=price01 value=`$arrNewProducts[cnt].price01_min`}--> <!--{assign var=price02 value=`$arrNewProducts[cnt].price02_min`}--> <!--{assign var=price02_max value=`$arrNewProducts[cnt].price02_max`}--> <p class="sale_price"><!--{$smarty.const.SALE_PRICE_TITLE}-->(税込): <span class="price"> <!--{if price02 != price02_max}--> <!--{$price02_max|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}-->~ <!--{/if}--> <!--{$price02|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}--> 円 </span> </p>お世話になります。
ecキューブ初心者になります。
こちらのコードをコピペし、動かしたところ下記エラーがでて表示ができません。
—————
—————
ecキューブのバージョンは 2.13.2になります。
ご教示頂ければ幸いです。
matsuさん、こんにちは。
お使いのバージョンは2.13.2とのことですので、
コードの読み替えが必要になってくると思います。
fukap様
ご回答ありがとうございます。
コードの読み替えが必要とのことですが、具体的にどのようにすればよろしいのでしょうか?
無知ですみません。。
考え方はそのまま利用できると思いますが、
お使いの2.13.2はコード内容が2.11.5とは異なっていますので、
コードを書き換える必要があります。
2.13.2用にコードを書き直す予定は今のところございませんので、
どうしてもご入用でしたら有償でご依頼いただきますようお願いいたします。
fukap様
ご回答ありがとうございます。
一度、自分でやってみて、難しそうな場合はご依頼するかとおもいます。
その際は、よろしくお願いいたいます。
fukap様
新着商品ブロックの商品削除に関するご質問でございます。
管理者画面から登録した商品を削除いたしますと、サイト上ではデフォルトで最初からある商品一覧、あるいはおすすめ商品ブロックの商品を削除いたしますが、新たに付け加えた本件のような新着商品ブロックの商品を削除するのでしょうか。
管理者画面の商品削除によって、新着商品ブロックの商品も削除させるにはどうしたら宜しいのでしょうか。
fukap様
大変失礼いたしました。
自己解決いたしました。
税込価格となっておりますが、表示は税別価格だと思うのですが?
ご指摘ありがとうございます。
確認させていただきます。