カテゴリー: CMS・ブログツール

【EC-CUBE】ヘッダーにトップページだけメインビジュアルをででんと表示する

トップページに大きくメインビジュアルを表示させる場合(ホラ、あれよ、アレ。メインビジュアルどど~ん、ってやつよ。フラッシュとか。)site_main.tplやtop.tplにいれるとカラムの影響を受けてしまうので、header.tplへトップページの場合のみエリアを表示させる変更を入れることにする。

該当出力ページが、サイトのトップページ(/index.php)だったら、<div id=”mainvisual”></div>を表示。
それ以外だったら、この部分には何も表示しない。

<!–{if $smarty.server.PHP_SELF == “/index.php”}–>
<div id=”mainvisual”>(この中にフラッシュのソース他コンテンツを入れる)</div>
<!–{else}–><!–[if}–>

以上だす。

【EC-CUBE】携帯用詳細コメントを追加する

データベースに携帯用コメントカラムを追加し、商品登録時に、携帯用には別の詳細説明を登録し、PCサイトの説明と別にする。

  • データベースにカラム(フィールド)追加
  • 商品登録のPHPスクリプト追加
  • 管理画面の商品登録・確認テンプレートを修正
  • モバイル用詳細テンプレートを修正

その1)データベースへのカラム追加

phpMyAdminでDBへアクセスし、dtb_productsの最後へ1カラム追加。

カラム名「comment7」
データ型「text」

※残りのフィールドは先のデータを参照。

その2)商品登録PHPの修正。

/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Product_Ex.php

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.phpからlfRegistProduct関数 (=商品登録関数)をコピー(L387~L493:ver.2.3.2の場合)し、LC_Page_Admin_Products_Product_Ex.phpの「デストラクタ」の下(L68:ver.2.3.2の場合※最後の「}」の手前へ。)へ貼り付け。
ソースを一部編集する。

貼り付けたソースのL78あたりにcomment7(=携帯用コメント)を追加。

 “comment4”, “comment5”, “comment6”, “comment7”, “main_list_comment”,

L97あたりにも1行追加。

$sqlval[‘comment7’] = $arrList[‘comment7’];

LC_Page_Admin_Products_Product.phpからLC_Page_Admin_Products_Product_Ex.phpへ、lfErrorCheck関数もコピー。(L546~L609:ver.2.3.2の場合)
lfRegistProduct関数の下に貼り付け。

貼り付けたソースのL183あたり
$objErr->doFunc(array(“詳細-メインコメント”, “main_comment”, $this->arrAllowedTag), array(“HTML_TAG_CHECK”));
の下に2行追加。

$objErr->doFunc(array(“携帯用詳細コメント”, “comment7”, LLTEXT_LEN), array(“SPTAB_CHECK”, “MAX_LENGTH_CHECK”));
$objErr->doFunc(array(“携帯用詳細コメント”, “comment7”, $this->arrAllowedTag), array(“HTML_TAG_CHECK”));

その3)MySql用にデータの読み込みコードを追加

これをやらないと、再編集するときに、登録画面に以前に登録したデータが読み込まれない;

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php (L304あたり:ver.2.3.3の場合)

「T1.comment6,」の下に1行追加し、「T1.comment7,」。

その4)データ登録用ADMINテンプレートの編集。

商品登録画面のテンプレートへ携帯用情報登録フォームのコード追加。

/data/Smarty/templates/default/admin/products/product.tpl (L243あたり、詳細-メインコメントのTD中へ。)

 <br><br>
 <div class=”center”>
  <input type=”button” name=”btn” onclick=”selectAll(‘category_id’); lfDispSwitch(‘mobile_detail’);” value=”モバイル専用詳細コメント表示/非表示”>
 </div>
 <div id=”mobile_detail” style=”<!–{if !$arrForm.comment7}–>display:none<!–{/if}–>”>
  <p>
  PCと携帯で異なる詳細コメントを表示する際には以下のフォームに携帯サイト用のコメントを入力して下さい。<br />
  入力されなかった場合は、PCサイトと同じ詳細コメント↑を表示します。<br />
  </p>
  <textarea name=”comment7″ id=”comment7″ value=”<!–{$arrForm.comment7|escape}–>” maxlength=”<!–{$smarty.const.LLTEXT_LEN}–>” style=”<!–{if $arrErr.comment7 != “”}–>background-color: <!–{$smarty.const.ERR_COLOR}–><!–{/if}–>”  cols=”60″ rows=”8″ class=”area60″><!–{$arrForm.comment7|escape}–></textarea><br /><span class=”red”> (上限<!–{$smarty.const.LLTEXT_LEN}–>文字)</span>

確認画面は、携帯用コメントを入力した場合のみ表示されるようにコードを追加。

/data/Smarty/templates/default/admin/products/confirm.tpl (L183あたり、詳細-メインコメントの/TRの後ろへ。)

<!–{if $arrForm.comment7}–>
<tr>
 <td bgcolor=”#f2f1ec” width=”160″ class=”fs12n”>モバイル詳細コメント</td>
 <td bgcolor=”#ffffff” width=”557″ class=”fs12n”>
 <!–{$arrForm.comment7|nl2br}–>
 </td>
</tr>
<!–{/if}–>

その5)モバイルサイトの表示テンプレートを編集。

/data/Smarty/templates/default/mobile/products/detail.tpl (L39あたり。詳細メインコメントの表示を変更。)

<!–{$arrProduct.main_comment|nl2br}–>

↓下記に変更。

<!–{if !$arrProduct.comment7}–><!–{$arrProduct.main_comment|nl2br}–><!–{else}–><!–{$arrProduct.comment7|nl2br}–><!–{/if}–>

携帯専用のコメントがある場合は、それを表示し、ない場合は、PC用のコメントを共用で表示する。

参考:http://www.eccube-school.jp/products/detail40.html
※DBがポスグレの場合は、上記手順と少し違うため、こちらのサイトを参照のこと。

【EC-CUBE】お問い合わせの項目を追加する(お問い合わせタイトルの選択追加)

EC-CUBEのお問い合わせでお問い合わせ内容の区分によってタイトルを選択する仕様を追加。

同様の応用で項目の追加もできる。(多分タイトル追加よりは少し簡単)

  • お問い合わせフォームでタイトル(お問い合わせカテゴリー)を選択してもらい、
  • 受付確認メールのタイトルにそのお問い合わせタイトルを表示し、
  • メールの中にもタイトルを表記する
  • タイトルは必須チェックはかけない。(かけてもいいけどとりあえず要らない;)

という処理でやってみる。

その1)お問い合わせフォームのテンプレートに選択フィールドを追加。

/data/Smarty/templates/default/contact/index.tpl (L37あたり:ver.2.3.2)

<tr>
<th>タイトル</th>
<td><select name=”contacttitle” value=”<!–{$contacttitle|default:$arrData.contacttitle|escape}–>” style=”<!–{$arrErr.contacttitle|sfGetErrorColor}–>”>
<option value=””>タイトルを選択</option>
<option label=”●●に関するお問い合わせ” value=”●●に関するお問い合わせ”>●●に関するお問い合わせ</option>
<option label=”▲▲に関するお問い合わせ” value=”▲▲に関するお問い合わせ”>▲▲に関するお問い合わせ</option>
<option label=”その他のお問い合わせ” value=”その他のお問い合わせ”>その他のお問い合わせ</option>
</select></td>
</tr>

/data/Smarty/templates/default/contact/confirm.tpl (L38あたり)

<tr>
<th>タイトル</th>
<td><!–{$arrForm.contacttitle|escape}–></td>
</tr>

その2)メールのテンプレートの本文中にも項目を追加。(※本文中には不要な場合は省略)

/data/Smarty/templates/default/mail_templates/contact_mail.tpl (L41あたり)

■タイトル:<!–{$arrForm.contacttitle}–>

その3)LC_Page_Contact.phpのコードの修正・追加

/data/class/pages/contact/LC_Page_Contact.php

(L79あたり)コード追加。

array( “column” => “contacttitle”, “convert” => “aKV” ),

(L258あたり)コード追加。(お客様送信メール用のタイトルをセット)

$fromMail_title = $objPage->arrForm[‘contacttitle’];

(L261あたり)同じコード追加。(自分送信メール用のタイトルをセット)

$fromMail_title = $objPage->arrForm[‘contacttitle’];

(L263あたり)コード変更。

$subject = $helperMail->sfMakeSubject($objQuery, $objMailText, $this, “お問い合わせがありました。”);

これを↓

$subject = $helperMail->sfMakeSubject($objQuery, $objMailText, $this, $fromMail_title);

(L276あたり)コード変更。

$subject = $helperMail->sfMakeSubject($objQuery, $objMailText, $this, “お問い合わせを受け付けました。”);

これを↓

$subject = $helperMail->sfMakeSubject($objQuery, $objMailText, $this, $fromMail_title);

その他)

/data/Smarty/templates/default/contact/mail_title.tpl

L24あたり。
→【 】内へショップネームが入るようになっている。その後上記のタイトルが入ります。変更が必要であればここも変える。但し、これはサイト全体の設定になるため、注文メールなども同様の設定になるので注意。

【EC-CUBE】受注管理でデータの更新ができない場合にエラーメッセージを出す

受注データの更新ができていなくてもアラートがでなかったのを、ちゃんとエラーメッセージが出るようにする。(エラーなく更新できるようにバグ修正するわけではないので誤解なきよう注意。)

/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

L151あたりの

   if(count($this->arrErr) == 0) {
       $this->lfRegistData($_POST[‘order_id’]);
       // DBから受注情報を再読込
       $this->lfGetOrderData($order_id);
       $this->tpl_onload = “window.alert(‘受注履歴を編集しました。’);”;
     }

これを↓下記に。

   if(count($this->arrErr) == 0) {
      $this->lfRegistData($_POST[‘order_id’]);
      // DBから受注情報を再読込
      $this->lfGetOrderData($order_id);
      $this->tpl_onload = “window.alert(‘受注履歴を編集しました。’);”;
    } else {
       $this->tpl_onload = “window.alert(‘受注履歴が編集できませんでした。”.array_shift($this->arrErr).”‘);”;
    }

【EC-CUBE】売り上げ集計をバッチモードにして動作を軽減(再びCRON)

EC-CUBEの売り上げ集計は2つのモードが選択でき、デフォルトは、リアルタイム集計。処理が長くなると、タイムアウトしてしまったり、ダウンしてしまう。

  1. リアルタイム・・・「月度で集計する」や「期間で集計する」ボタンが押されたときにその場で集計→集計データ格納→集計データ取得→表示、と行う方法。
  2. バッチモード・・・あらかじめ売上データを集計しておき、「月度で集計する」や「期間で集計する」ボタンが押されたときには、すでに集計して格納済みのデータを取得→表示、と行う方法。

その1)管理モードの変更

管理画面→システム管理→パラメータ管理で、
DAILY_BATCH_MODEを[false]から[true]に変更。

その2)/data/script/execute_batch_daily.phpを作成。

/**
* デイリーバッチ起動スクリプト
*/

require_once( dirname(__FILE__) . “/../install.php” );
define( “CLASS_PATH”, DATA_PATH . ‘class/’ );
define( “CLASS_EX_PATH”, DATA_PATH . ‘class_extends/’ );
define( “CACHE_PATH”, DATA_PATH . ‘cache/’ );

require_once(CLASS_EX_PATH . “util_extends/GC_Utils_Ex.php”);
require_once(CLASS_EX_PATH . “util_extends/SC_Utils_Ex.php”);
require_once(CLASS_EX_PATH . “db_extends/SC_DB_MasterData_Ex.php”);
require_once(CLASS_EX_PATH . “db_extends/SC_DB_DBFactory_Ex.php”);
require_once(CLASS_PATH . “SC_DbConn.php”);
require_once(CLASS_PATH . “SC_Query.php”);
require_once(CLASS_PATH . “SC_SelectSql.php”);

require_once(CLASS_EX_PATH . ‘batch_extends/SC_Batch_Daily_Ex.php’);
require_once(CLASS_EX_PATH . “SC_Initial_Ex.php”);
// アプリケーション初期化処理
$objInit = new SC_Initial_Ex();
$objInit->init();

$usage = <<

php -f execute_batch_daily.php start term
集計期間を指定して売上集計をします。

 start 集計開始日。何日前の売上から集計するか。1 から 365以内で指定。
 term 集計対象期間。何日分の売上を集計するか。1 から 365以内で指定。

例:昨日の売上を集計します。
php -f execute_batch_daily.php 1 1

USAGE;

if ( $argc != 3 ) {
echo ( $usage );
exit(1);
}

$start = $argv[1];
$term = $argv[2];
if ( !is_numeric( $start ) || !is_numeric( $term ) ) {
echo ( $usage );
exit(1);
}

$start = intval( $start );
$term = intval( $term );

if ( $start < 1 || $start > 365 || $term < 1 || $term > 365 ) {
echo ( $usage );
exit(1);
}

if ( $term > $start ) {
echo ( $usage );
exit(1);
}

$objBatch = new SC_Batch_Daily_EX();
$objBatch->lfStartDailyTotal( $term, $start, true );
?>

その3)/data/class/batch/SC_Batch_Daily.phpを修正。

L92,93(ver.2.3.2の場合)

// 削除された受注データの受注詳細情報の削除
$objQuery = new SC_Query();
//$where = “order_id IN (SELECT order_id FROM dtb_order WHERE del_flg = 1)”; ←コメントアウト
//$objQuery->delete(“dtb_order_detail”, $where); ←コメントアウト

// 最後に更新された日付を取得

// 最後に更新された日付を取得

L102(ver.2.3.2の場合)

// 最後のバッチ実行からLOAD_BATCH_PASS秒経過していないと実行しない。
if($pass < LOAD_BATCH_PASS) {
//GC_Utils_Ex::gfPrintLog(“LAST BATCH ” . $arrRet[0][‘create_date’] . ” > ” . $batch_pass . ” -> EXIT BATCH $batch_date”); ←コメントアウト
$batch_next = date( “Y-m-d H:i:s”, strtotime($batch_last) + LOAD_BATCH_PASS ); ←追加
GC_Utils_Ex::gfPrintLog(“LAST BATCH ” . $batch_last . ” NEXT BATCH AFTER $batch_next -> EXIT BATCH”); ←追加

return;
}

L107(ver.2.3.2の場合)

// 集計
//for ($i = $start; $i < $term; $i++) { ←コメントアウト
for ($i = $start, $k = 0; $k < $term; $i–, $k++ ) { ←追加
// 基本時間から$i日分さかのぼる
$tmp_time = $now_time – ($i * 24 * 3600);

L154(ver.2.3.2の場合)

GC_Utils_Ex::gfPrintLog(“LOADING BATCH $batch_date”);
$this->lfBatOrderDaily($tmp_time);
$this->lfBatOrderDailyHour($tmp_time);
$this->lfBatOrderAge($tmp_time);
// タイムアウトを防ぐ ←追加
SC_Utils_Ex::sfFlush(); ←追加

}
}

※そもそも集計時にSQLエラーになるところがあるので、先に
http://www.bton.net46.net/?p=724
の修正を行っておくこと。

その4)CRONの設定

0 2 * * * /usr/local/bin/php -f /path/to/eccube/data/script/execute_batch_daily.php 1 1 2>&1 > /dev/null

参考サイト:http://d.hatena.ne.jp/yuhei_kagaya/20081019