【EC-CUBE】カテゴリーごとのキャプションをつけるカスタマイズ

システムバージョン:2.3.0-rc1

その1)データベースのdtb_categoryテーブルに2つのフィールドを追加する
カテゴリーの情報が登録されているdtb_categoryテーブルに新しく2つのフィールドを追加する。

category_info(タイプ: text デフォルト: NULL 空の値:OK(NULL))
info_flg(タイプ: smallint デフォルト: 0 空の値:OK(NULL))

 ↓こんな風に追加して、

 ↓こうなっていればOK。

その2)「/data/Smarty/templates/default/admin/products/category.tpl」 を編集
管理画面のテンプレートにカテゴリの説明文を記述できる textarea と親カテゴリの説明文を引き継ぐかどうかのチェックボックスを追記。一番上のカテゴリの場合は親カテゴリは無い為、親カテゴリの説明文を引き継ぐかどうかのチェックボックスを表示しない。

128行目あたり(Ver.2.3の場合)に2行追加。

<input type=”text” name=”category_name” value=”<!–{$arrForm.category_name|escape}–>” size=”30″ class=”box30″ maxlength=”<!–{$smarty.const.STEXT_LEN}–>”/>
<input type=”submit” name=”button” value=”登録”/><span class=”red10″> (上限<!–{$smarty.const.STEXT_LEN}–>文字)</span>

↑この記述の下に、↓これを2行追加。

<textarea name=”category_info” cols=”80″ rows=”10″><!–{$arrForm.category_info|escape}–></textarea><br />

<!–{if $arrForm.level != “1” && $arrForm.parent_category_id != “0”}–><input type=”checkbox” name=”info_flg” id=”info_flg” value=”1″<!–{if $arrForm.info_flg}–> checked=”checked”<!–{/if}–> /><label for=”info_flg” class=”fs10n”>親カテゴリの説明を引き継ぐ</label>  <!–{/if}–><span class=”red10″> (上限<!–{$smarty.const.LLTEXT_LEN}–>文字)</span>

その3)「/data/class/pages/admin/ products/LC_Page_Admin_Products_Category.php」に追記

110行目あたり(Ver.2.3の場合)。

// 編集項目のカテゴリ名をDBより取得する。
//$oquery = new SC_Query(); ←コメントアウト
$this->objQuery = new SC_Query();
$where = “category_id = ?”;

//$cat_name = $this->oquery->get(“dtb_category”, “category_name”, $where, array($_POST[‘category_id’])); ←コメントアウト
$col = “category_name, category_info, info_flg, level”;
$arrRet = $this->objQuery->select($col, “dtb_category”, $where, array($_POST[‘category_id’]));

// 入力項目にカテゴリ名を入力する。
//$this->arrForm[‘category_name’] = $cat_name; ←コメントアウト
$this->arrForm[‘category_name’] = $arrRet[0][‘category_name’];
$this->arrForm[‘category_info’] = $arrRet[0][‘category_info’];
$this->arrForm[‘info_flg’] = $arrRet[0][‘info_flg’];
$this->arrForm[‘level’] = $arrRet[0][‘level’];
// POSTデータを引き継ぐ
$this->arrForm[‘category_id’] = $_POST[‘category_id’];

256行目あたり(Ver.2.3の場合)。

// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval[‘create_date’] = “Now()”;
$sqlval[‘update_date’] = “Now()”;
$sqlval[‘creator_id’] = $_SESSION[‘member_id’];
$sqlval[‘parent_category_id’] = $parent_category_id;
$sqlval[‘rank’] = $rank;
$sqlval[‘level’] = $level;

//追記:親の設定を引き継ぐ時
if($sqlval[‘info_flg’]) {
$sqlval[‘category_info’] = lfGetParentInfo($objQuery, $parent_category_id);
}

// INSERTの実行
$objQuery->insert(“dtb_category”, $sqlval);

$objQuery->commit(); // トランザクションの終了
}

// カテゴリの編集
function lfUpdateCat($category_id) {
$objQuery = new SC_Query();
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval[‘update_date’] = “Now()”;
$where = “category_id = ?”;

//追記:親の設定を引き継ぐ時
if($sqlval[‘info_flg’]) {
$parent_category_id = $objQuery->get(“dtb_category”, “parent_category_id”, $where, array($category_id));
$sqlval[‘category_info’] = lfGetParentInfo($objQuery, $parent_category_id);
}
$objQuery->update(“dtb_category”, $sqlval, $where, array($category_id));
}

// カテゴリの取得
function lfGetCat($parent_category_id) {
$objQuery = new SC_Query();

if($parent_category_id == “”) {
$parent_category_id = ‘0’;
}

$col = “category_id, category_name, level, rank”;
$where = “del_flg = 0 AND parent_category_id = ?”;
$objQuery->setoption(“ORDER BY rank DESC”);
$arrRet = $objQuery->select($col, “dtb_category”, $where, array($parent_category_id));
return $arrRet;
}

/* パラメータ情報の初期化 */
function lfInitParam() {
$this->objFormParam->addParam(“カテゴリ名”, “category_name”, STEXT_LEN, “KVa”, array(“EXIST_CHECK”,”SPTAB_CHECK”,”MAX_LENGTH_CHECK”));

$this->objFormParam->addParam(“カテゴリ情報”, “category_info”, LLTEXT_LEN, “KVa”, array(“SPTAB_CHECK”,”MAX_LENGTH_CHECK”));
$this->objFormParam->addParam(“引き継ぎ”, “info_flg”, INT_LEN, “n”, array(“MAX_LENGTH_CHECK”, “NUM_CHECK”));

} ←これ、注意!「}」は、追加していない。
/* 入力内容のチェック */
function lfCheckError($array)

コードの一番最後(Ver.2.3の場合)に追加。

// 追記:親のcategory_infoを取得する
function lfGetParentInfo($objQuery, $pid) {
$where = “category_id = ?”;
$parent_info = $objQuery->get(“dtb_category”, “category_info”, $where, array($pid));
return $parent_info;
}

その4)/data/class/pages/products/LC_Page_Products_List.php」に追記

115行目あたり(Ver.2.3の場合)。

// タイトル編集
$tpl_subtitle = “”;
if ($_GET[‘mode’] == ‘search’) {
$tpl_subtitle = “検索結果”;
} elseif (empty($arrCategory_id[0])) {
$tpl_subtitle = “全商品”;
} else {
$tpl_subtitle = $objDb->sfGetCatCombName($arrCategory_id[0]);
}

$objQuery = new SC_Query();
$this->category_info = $objQuery->get(“dtb_category”, “category_info”, “category_id = ?”, $arrCategory_id);
$count = $objQuery->count(“dtb_best_products”, “category_id = ?”, $arrCategory_id);

// 以下の条件でBEST商品を表示する
// ・BEST最大数の商品が登録されている。
// ・カテゴリIDがルートIDである。

その5)管理画面から商品一覧ページのメインを修正(list.tpl)

管理画面の「デザイン管理」→「ページ詳細設定」→「商品一覧ページ」で、任意の場所に以下のタグを挿入。

<!–{if $category_info}–><!–{$category_info}–><!–{/if}–>

参考:http://www.eccube-school.jp/products/detail43.html

注意! 「パンくずリストの実装」とアタる!
このやり方(http://www.eccube-school.jp/products/detail43.html)で、LC_Page_Products_List_Ex.phpを使用する場合、下記のパンくず実装を先にやるか、LC_Page_Products_List_Ex.phpで実装しないと、マージされないので注意!すること。
https://bton.papalabs.net/?p=340

この記事のほうは、_EXを使ってないので、同じファイルを上書きすることになるから問題ない。でも、本来は、_EXを使ったほうがいいので、_EXのファイルのほうで、パンくずを実装するってほうがいいのかも。