- EC-CUBEで商品コードで検索可能にする方法
- 2015.07.03
商品コードで検索する必要があったので対応方法をメモします。
ECCUBEバージョン:2.13.3
対象ファイル
data/class/pages/products/LC_Page_Products_List.php対象関数
上記ファイル内の以下の関数を変更するだけです。
lfGetSearchCondition●変更前
// 分割したキーワードを一つずつwhere文に追加
foreach ($names as $val) {
if (strlen($val) > 0) {
$searchCondition[‘where’] .= ‘ AND ( alldtl.name ILIKE ? OR alldtl.comment3 ILIKE ?) ‘;
$searchCondition[‘arrval’][] = “%$val%”;
$searchCondition[‘arrval’][] = “%$val%”;
}
}●変更後
// 分割したキーワードを一つずつwhere文に追加
foreach ($names as $val) {
if (strlen($val) > 0) {
$searchCondition[‘where’] .= ‘ AND ( alldtl.name ILIKE ? OR alldtl.comment3 ILIKE ? OR product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code ILIKE ? AND del_flg = 0) ) ‘;
$searchCondition[‘arrval’][] = “%$val%”;
$searchCondition[‘arrval’][] = “%$val%”;
$searchCondition[‘arrval’][] = “%$val%”;}
}管理画面の「商品管理>商品マスター」で商品コードでの検索機能があったので下記のファイルのsearch_product_codeの処理部分を参考に変更しました。
(参考ファイル)data/class/pages/admin/products/LC_Page_Admin_Products.php
ECCUBE
- ECCUBEで注文完了メールに注文商品の画像を入れる
- 2015.07.01
EC-CUBEバージョン:2.13.3
対象ファイル
data/class/helper/SC_Helper_Mail.php
data/Smarty/templates/default/mail_templates/order_mail.tpl対象関数
sfSendOrderMail●変更前
$objPage->tpl_header = $mailtemplate[‘header’];
$objPage->tpl_footer = $mailtemplate[‘footer’];$arrTplVar->arrOrderDetail = $objQuery->select(‘*’, ‘dtb_order_detail’, $where, array($order_id));
if ($send) {
if ($objSendMail->sendMail()) {
$this->sfSaveMailHistory($order_id, $template_id, $tosubject, $body);
}
}●変更後
//DBから読み込むメールテンプレートの改行をHTML用の改行に変換
$objPage->tpl_header = nl2br($mailtemplate[‘header’]);
$objPage->tpl_footer = nl2br($mailtemplate[‘footer’]);//画像のファイル名を取得
$arrTplVar->arrOrderDetail = $objQuery->select(‘*,(SELECT main_image FROM dtb_products WHERE product_id = dtb_order_detail.product_id) as main_image ‘, ‘dtb_order_detail’, $where, array($order_id));//HTMLメールを送るように変更
if ($send) {
if ($objSendMail->sendHtmlMail()) {
$this->sfSaveMailHistory($order_id, $template_id, $tosubject, $body);
}
}そしてHTMLメールに変更する為、メールテンプレートのorder_mail.tpl内の改行したい部分に<br />タグを挿入。
また、sectionループ内で、画像を挿入したい部分に下記のように追加する。<img src="http://ドメイン名/upload/save_image/<!–{$arrOrderDetail[cnt].main_image}–>" />
ECCUBE
- EC-CUBEで会員機能を無くし更に「お支払方法・お届け時間等の指定」ページも無くす
- 2015.06.20
ECCUBEバージョン:2.13.3
対象ファイル
data/class/pages/shopping/LC_Page_Shopping.php
data/Smarty/templates/default/shopping/confirm.tpl対象関数
LC_Page_Shopping.php内のaction【以下変更箇所抜粋】
●変更前
// お客様情報登録
case ‘nonmember_confirm’:
$this->tpl_mainpage = $nonmember_mainpage;
$this->tpl_title = $nonmember_title;
$this->lfInitParam($objFormParam);
$objFormParam->setParam($_POST);
$this->arrErr = $this->lfCheckError($objFormParam);if (SC_Utils_Ex::isBlank($this->arrErr)) {
$this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam);$arrParams = $objFormParam->getHashArray();
$shipping_id = $arrParams[‘deliv_check’] == ‘1’ ? 1 : 0;
$objPurchase->setShipmentItemTempForSole($objCartSess, $shipping_id);$objSiteSess->setRegistFlag();
SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
SC_Response_Ex::actionExit();
}
break;default:
// 前のページから戻ってきた場合は, お客様情報入力ページ
if (isset($_GET[‘from’]) && $_GET[‘from’] == ‘nonmember’) {
$this->tpl_mainpage = $nonmember_mainpage;
$this->tpl_title = $nonmember_title;
$this->lfInitParam($objFormParam);
} else {
// 通常はログインページ
$this->lfInitLoginFormParam($objFormParam);
}$this->setFormParams($objFormParam, $objPurchase, $this->tpl_uniqid);
break;●変更後
// お客様情報登録
case ‘nonmember_confirm’:
$this->tpl_mainpage = $nonmember_mainpage;
$this->tpl_title = $nonmember_title;
$this->lfInitParam($objFormParam);
$objFormParam->setParam($_POST);
$this->arrErr = $this->lfCheckError($objFormParam);if (SC_Utils_Ex::isBlank($this->arrErr)) {
$this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam);$arrParams = $objFormParam->getHashArray();
$shipping_id = $arrParams[‘deliv_check’] == ‘1’ ? 1 : 0;
$objPurchase->setShipmentItemTempForSole($objCartSess, $shipping_id);$objSiteSess->setRegistFlag();
SC_Response_Ex::sendRedirect(SHOPPING_CONFIRM_URLPATH);
// SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
SC_Response_Ex::actionExit();
}
break;default:
// 前のページから戻ってきた場合は, お客様情報入力ページ
// if (isset($_GET[‘from’]) && $_GET[‘from’] == ‘nonmember’) {
$this->tpl_mainpage = $nonmember_mainpage;
$this->tpl_title = $nonmember_title;
$this->lfInitParam($objFormParam);
// } else {
// 通常はログインページ
// $this->lfInitLoginFormParam($objFormParam);
// }$this->setFormParams($objFormParam, $objPurchase, $this->tpl_uniqid);
break;メンテナンス性を考え、実際には「LC_Page_Shopping_Ex.php」に変更箇所だけ記述して上書きしています。
まず、defaultの所で、ログインページを表示するのをやめゲスト購入だけ表示するようにしました。
またサイト内ではMyページ等へのリンクも全て削除する必要があります。次にnonmember_confirmの所でリダイレクト先をSHOPPING_CONFIRM_URLPATHに変更しています。
最後にconfirm.phpの「戻る」ボタンのリンク先を<a href="./payment.php">から<a href="payment.php?mode=return">に変更して戻り先をお客様情報入力画面に変更しました。
ECCUBE
- EC-CUBEでスマートフォンからのアクセスでPCサイトを表示する
- 2015.03.18
最近、EC-CUBE案件が増えてます。
予算等の関係でPCサイトのみのECサイトを制作する場合、
スマートフォンからのアクセスの際にPC用のサイトを表示する必要がありましたのでその方法をまとめておきます。
※EC-CUBEのバージョンは2.13.3です。●対象ファイル
/data/class_extends/SC_Display_Ex.php●変更箇所
/data/class/SC_Display.phpのファイルのdetectDevice関数をコピーして
SC_Display_Ex.phpのclass内にペーストします。public static function detectDevice($reset = FALSE)
{
if (is_null(SC_Display_Ex::$device) || $reset) {
$nu = new Net_UserAgent_Mobile();
$su = new SC_SmartphoneUserAgent_Ex();
if ($nu->isMobile()) {
SC_Display_Ex::$device = DEVICE_TYPE_MOBILE;
// } elseif ($su->isSmartphone()) {
// SC_Display_Ex::$device = DEVICE_TYPE_SMARTPHONE;
} else {
SC_Display_Ex::$device = DEVICE_TYPE_PC;
}
}return SC_Display_Ex::$device;
}これで、スマートフォンの時でもPCサイトを表示するようになります。
ちなみに、スマートフォンと携帯のいずれのアクセスの時もPCサイトを表示するようにするには
下記のようになると思います。public static function detectDevice($reset = FALSE)
{
if (is_null(SC_Display_Ex::$device) || $reset) {
$nu = new Net_UserAgent_Mobile();
$su = new SC_SmartphoneUserAgent_Ex();
// if ($nu->isMobile()) {
// SC_Display_Ex::$device = DEVICE_TYPE_MOBILE;
// } elseif ($su->isSmartphone()) {
// SC_Display_Ex::$device = DEVICE_TYPE_SMARTPHONE;
// } else {
SC_Display_Ex::$device = DEVICE_TYPE_PC;
// }
}return SC_Display_Ex::$device;
}要するに、SC_Display_Ex::$device = DEVICE_TYPE_PC;だけにするという事ですね。
- ECCUBEのお客様の声を商品詳細以外のページで実装する
- 2015.03.03
ECCUBEで構築されたサイトで、新規にページを追加して商品のランディングページのようなものを作成した際に、商品詳細にあるレビュー機能を実装したかったので調べましたが、そのようなニーズが無いのか、希望するものが見つからなかった為、レビュー機能を表示する方法をまとめておきます。
まず、お客様の声のSmartyのソースは下記のようになっておりますので、これを追加したページのテンプレートファイルに貼り付けます。
※ソースは必要に応じて適宜変更してください。<!–この商品に対するお客様の声–>
<div id=”customervoice_area”>
<h2><img src=”<!–{$TPL_URLPATH}–>img/title/tit_product_voice.png” alt=”この商品に対するお客様の声” /></h2><div class=”review_bloc clearfix”>
<p>この商品に対するご感想をぜひお寄せください。</p>
<div class=”review_btn”>
<!–{if count($arrReview) < $smarty.const.REVIEW_REGIST_MAX}–>
<!–★新規コメントを書き込む★–>
<a href=”../products/review.php”
onclick=”eccube.openWindow(‘../products/review.php?product_id=●●●●●’,’review’,’600′,’640′); return false;”
target=”_blank”>
<img class=”hover_change_image” src=”<!–{$TPL_URLPATH}–>img/button/btn_comment.jpg” alt=”新規コメントを書き込む” />
</a>
<!–{/if}–>
</div>
</div><!–{if count($arrReview) > 0}–>
<ul>
<!–{section name=cnt loop=$arrReview}–>
<li>
<p class=”voicetitle”><!–{$arrReview[cnt].title|h}–></p>
<p class=”voicedate”><!–{$arrReview[cnt].create_date|sfDispDBDate:false}–> 投稿者:<!–{if $arrReview[cnt].reviewer_url}–><a href=”<!–{$arrReview[cnt].reviewer_url}–>” target=”_blank”><!–{$arrReview[cnt].reviewer_name|h}–></a><!–{else}–><!–{$arrReview[cnt].reviewer_name|h}–><!–{/if}–> おすすめレベル:<span class=”recommend_level”><!–{assign var=level value=$arrReview[cnt].recommend_level}–><!–{$arrRECOMMEND[$level]|h}–></span></p>
<p class=”voicecomment”><!–{$arrReview[cnt].comment|h|nl2br}–></p>
</li>
<!–{/section}–>
</ul>
<!–{/if}–>
</div>
<!–お客様の声ここまで–>※product_idは該当する商品のidを指定します。
このソースを見ると、必要な情報は「$arrReview」と「$arrRECOMMEND」という配列に入っているようなので、
user_dataフォルダの中の新規に追加したファイル名のPHPファイルに追加していきます。
まず、変数の宣言をします。
/** @var array レビュー情報 */
public $arrReview;/** おすすめレベル */
public $arrRECOMMEND;次に関数を下記の通り変更する。
function init()
{
parent::init();
$masterData = new SC_DB_MasterData_Ex();
$this->arrRECOMMEND = $masterData->getMasterData(‘mtb_recommend’);
}function action()
{
//レビュー情報の取得
$this->arrReview = $this->lfGetReviewData();}
action関数で使われるlfGetReviewData関数を追加する
//商品ごとのレビュー情報を取得する
function lfGetReviewData() {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col = “create_date, reviewer_url, reviewer_name, recommend_level, title, comment”;
$from = “dtb_review”;
$where = “del_flg = 0 AND status = 1 AND product_id = ?”;
$objQuery->setOrder(‘create_date DESC’);
$objQuery->setLimit(REVIEW_REGIST_MAX);
$arrWhereVal = array(“4”);
$arrReview = $objQuery->select($col, $from, $where, $arrWhereVal);
return $arrReview;
}※$arrWhereValは、表示したい商品のproduct_idを指定します。
これで、レビューの表示と投稿ができるようになりました。