EC-CUBEで管理画面からカテゴリ毎の画像や説明文を追加する

先日の記事ECCUBEの小技:商品一覧ページをカテゴリごとに画像で装飾を、管理画面からやる方法です。

見た目としてやってやった感はありますし、テキストを加えることもできるので、悪くは無いものです。
しかし、僕は前回のもののほうがやりやすいですね。
ひとまず、設置方法を紹介します。
この記事は最終更新日から1年以上が経過しています。

データベースにカラムを2つ追加

詳しい情報は以下の記事にありますが、まとめます。
EC-CUBE2.11 カスタマイズショップ / 2.11.0以上でカテゴリ毎に説明文や画像を載せる追加機能

データベースですが、phpMyAdminでいじります。
ECCUBEのデータベース>dtb_categoryに移動。
上部メニューの構造をクリック。

中段ほどにある1個のカラム追加する テーブルの末尾 で『実行する』ボタン。

一つ目は カラム名: category_info データ型: text

二つ目は カラム名: info_flg データ型: smallint

画像を見てもらえば、間違える事は無いと思います。

ファイルの編集4つ

まず、管理画面の成形から。
前回のECCUBEの小技:WYSIWYGエディタ『CKEditor』を管理画面に設置を活かして、こちらにもエディタを追加します。

/data/Smarty/templates/admin/products/category.tpl
94行目付近から以下に変更

        
<div class="now_dir">
	<script type="text/javascript">
	var editor = CKEDITOR.replace( 'editor' );
	</script>
	
	<!--{if $arrErr.category_name}-->
	<span class="attention"><!--{$arrErr.category_name}--></span>
	<!--{/if}-->
	<input type="text" name="category_name" value="<!--{$arrForm.category_name|h}-->" size="30" class="box30" maxlength="<!--{$smarty.const.STEXT_LEN}-->" />
	
	<div>
	<textarea class="ckeditor" id="editor" name="category_info" cols="110" rows="15"><!--{$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>
	</div>
	
	<a class="btn-normal" href="javascript:;" onclick="fnModeSubmit('edit','',''); return false;"><span class="btn-next">登録</span></a><span class="attention">&nbsp;(上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>
</div>

/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Category_Ex.php
一挙全て変更

<?php
// {{{ requires
require_once CLASS_REALDIR . 'pages/admin/products/LC_Page_Admin_Products_Category.php';
/**
* カテゴリ管理 のページクラス(拡張).
*
* LC_Page_Admin_Products_Category をカスタマイズする場合はこのクラスを編集する.
*
* @package Page
* @author LOCKON CO.,LTD.
* @version $Id: LC_Page_Admin_Products_Category_Ex.php 20764 2011-03-22 06:26:40Z nanasess $
*/
class LC_Page_Admin_Products_Category_Ex extends LC_Page_Admin_Products_Category {
// }}}
// {{{ functions
/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
parent::process();
}
/**
* 編集対象のカテゴリ名を, 入力ボックスへ表示する.
*
* @param SC_FormParam $objFormParam
* @return void
*/
function doPreEdit(&$objFormParam) {
$category_id = $objFormParam->getValue('category_id');
$objQuery =& SC_Query_Ex::getSingletonInstance();
// 編集対象のカテゴリ名をDBより取得する
$where = "category_id = ?";
// $category_name = $objQuery->get("category_name", "dtb_category", $where, array($category_id));
$col = "category_name, category_info, info_flg, level";
$arrRet = $objQuery->select($col, "dtb_category", $where, array($_POST['category_id']));
// 入力ボックスへカテゴリ名を保持する.
// $this->arrForm['category_name'] = $category_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'];
// カテゴリIDを保持する.
$this->arrForm['category_id']   = $category_id;
}
/**
* カテゴリの編集を実行する.
*
* 下記の場合は, 編集を実行せず、エラーメッセージを表示する
*
* - カテゴリ名がすでに使用されている場合
*
* @param SC_FormParam $objFormParam
* @return void
*/
function doEdit(&$objFormParam) {
// 入力項目チェック
$arrErr = $objFormParam->checkError();
if (count($arrErr) > 0) {
$this->arrErr = $arrErr;
$this->arrForm['category_id']   = $objFormParam->getValue('category_id');
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
$this->arrForm['category_info'] = $objFormParam->getValue('category_info');
$this->arrForm['info_flg'] = $objFormParam->getValue('info_flg');
return;
}
// 重複チェック
$objQuery =& SC_Query_Ex::getSingletonInstance();
$where = "parent_category_id = ? AND category_id <> ? AND category_name = ?";
$count = $objQuery->count("dtb_category",
$where,
array($objFormParam->getValue('parent_category_id'),
$objFormParam->getValue('category_id'),
$objFormParam->getValue('category_name')));
if ($count > 0) {
$this->arrErr['category_name']  = "※ 既に同じ内容の登録が存在します。<br/>";
$this->arrForm['category_id']   = $objFormParam->getValue('category_id');
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
return;
}
// カテゴリ更新
$arrCategory = array();
$arrCategory['category_name'] = $objFormParam->getValue('category_name');
$arrCategory['category_info'] = $objFormParam->getValue('category_info');
$arrCategory['info_flg'] = $objFormParam->getValue('info_flg');
$arrCategory['update_date']   = 'NOW()';
$this->updateCategory($objFormParam->getValue('category_id'), $arrCategory);
}
/**
* カテゴリの登録を実行する.
*
* 下記の場合は, 登録を実行せず、エラーメッセージを表示する
*
* - カテゴリ登録数の上限を超える場合
* - 階層登録数の上限を超える場合
* - カテゴリ名がすでに使用されている場合
*
* @param SC_FormParam $objFormParam
* @return void
*/
function doRegister(&$objFormParam) {
// 入力項目チェック
$arrErr = $objFormParam->checkError();
if (count($arrErr) > 0) {
$this->arrErr = $arrErr;
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
$this->arrForm['category_info'] = $objFormParam->getValue('category_info');
$this->arrForm['info_flg'] = $objFormParam->getValue('info_flg');
return;
}
// 登録数上限チェック
$objQuery =& SC_Query_Ex::getSingletonInstance();
$where = "del_flg = 0";
$count = $objQuery->count("dtb_category", $where);
if ($count >= CATEGORY_MAX) {
$this->arrErr['category_name']  = "※ カテゴリの登録最大数を超えました。<br/>";
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
return;
}
// 階層上限チェック
if ($this->isOverLevel($objFormParam->getValue('parent_category_id'))) {
$this->arrErr['category_name']  = "※ " . LEVEL_MAX . "階層以上の登録はできません。<br/>";
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
return;
}
// 重複チェック
$where = "parent_category_id = ? AND category_name = ?";
$count = $objQuery->count("dtb_category",
$where,
array($objFormParam->getValue('parent_category_id'),
$objFormParam->getValue('category_name')));
if ($count > 0) {
$this->arrErr['category_name']  = "※ 既に同じ内容の登録が存在します。<br/>";
$this->arrForm['category_name'] = $objFormParam->getValue('category_name');
return;
}
// カテゴリ登録
$this->registerCategory($objFormParam->getValue('parent_category_id'),
$objFormParam->getValue('category_name'),
$objFormParam->getValue('category_info'),
$objFormParam->getValue('info_flg'),
$_SESSION['member_id']);
}
/**
* カテゴリの表示順序を上へ移動する.
*
* @param SC_FormParam $objFormParam
* @return void
*/
function doUp(&$objFormParam) {
$category_id = $objFormParam->getValue('category_id');
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objQuery->begin();
$up_id = $this->lfGetUpRankID($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
if ($up_id != "") {
// 上のグループのrankから減算する数
$my_count = $this->lfCountChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
// 自分のグループのrankに加算する数
$up_count = $this->lfCountChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $up_id);
if ($my_count > 0 && $up_count > 0) {
// 自分のグループに加算
$this->lfUpRankChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id, $up_count);
// 上のグループから減算
$this->lfDownRankChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $up_id, $my_count);
}
}
$objQuery->commit();
}
/**
* カテゴリの表示順序を下へ移動する.
*
* @param SC_FormParam $objFormParam
* @return void
*/
function doDown(&$objFormParam) {
$category_id = $objFormParam->getValue('category_id');
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objQuery->begin();
$down_id = $this->lfGetDownRankID($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
if ($down_id != "") {
// 下のグループのrankに加算する数
$my_count = $this->lfCountChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
// 自分のグループのrankから減算する数
$down_count = $this->lfCountChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $down_id);
if ($my_count > 0 && $down_count > 0) {
// 自分のグループから減算
$this->lfUpRankChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $down_id, $my_count);
// 下のグループに加算
$this->lfDownRankChilds($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id, $down_count);
}
}
$objQuery->commit();
}
/**
* パラメータの初期化を行う
*
* @param SC_FormParam $objFormParam
* @return void
*/
function initParam(&$objFormParam) {
$objFormParam->addParam("親カテゴリID", "parent_category_id", null, null, array());
$objFormParam->addParam("カテゴリID", "category_id", null, null, array());
$objFormParam->addParam("カテゴリ名", "category_name", STEXT_LEN, 'KVa', array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
$objFormParam->addParam("カテゴリ説明", "category_info", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
$objFormParam->addParam("親カテゴリコピーフラグ", "info_flg", INT_LEN, "n", array("MAX_LENGTH_CHECK", "NUM_CHECK"));
}
/**
* 親カテゴリIDでカテゴリを検索する.
*
* - 表示順の降順でソートする
* - 有効なカテゴリを返す(del_flag = 0)
*
* @param SC_Query $objQuery
* @param int $parent_category_id 親カテゴリID
* @return array カテゴリの配列
*/
function findCategoiesByParentCategoryId($parent_category_id) {
if (!$parent_category_id) {
$parent_category_id = 0;
}
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col   = "category_id, category_name, level, rank";
$where = "del_flg = 0 AND parent_category_id = ?";
$objQuery->setOption("ORDER BY rank DESC");
return $objQuery->select($col, "dtb_category", $where, array($parent_category_id));
}
/**
* カテゴリを更新する
*
* @param integer $category_id 更新対象のカテゴリID
* @param array 更新する カラム名 => 値 の連想配列
* @return void
*/
function updateCategory($category_id, $arrCategory) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objQuery->begin();
$where = "category_id = ?";
//追記:親の設定を引き継ぐ時
if($arrCategory['info_flg']) {
$parent_category_id = $objQuery->get("parent_category_id", "dtb_category", $where, array($category_id));
$arrCategory['category_info'] = $this->lfGetParentInfo($objQuery, $parent_category_id);
}
$objQuery->update("dtb_category", $arrCategory, $where, array($category_id));
$objQuery->commit();
}
/**
* カテゴリを登録する
*
* @param integer 親カテゴリID
* @param string カテゴリ名
* @param integer 作成者のID
* @return void
*/
function registerCategory($parent_category_id, $category_name, $category_info, $info_flg, $creator_id) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objQuery->begin();
$rank = null;
if ($parent_category_id == 0) {
// ROOT階層で最大のランクを取得する。
$where = "parent_category_id = ?";
$rank = $objQuery->max('rank', "dtb_category", $where, array($parent_category_id)) + 1;
} else {
// 親のランクを自分のランクとする。
$where = "category_id = ?";
$rank = $objQuery->get('rank', "dtb_category", $where, array($parent_category_id));
// 追加レコードのランク以上のレコードを一つあげる。
$sqlup = "UPDATE dtb_category SET rank = (rank + 1) WHERE rank >= ?";
$objQuery->exec($sqlup, array($rank));
}
$where = "category_id = ?";
// 自分のレベルを取得する(親のレベル + 1)
$level = $objQuery->get('level', "dtb_category", $where, array($parent_category_id)) + 1;
$arrCategory = array();
$arrCategory['category_name'] = $category_name;
$arrCategory['parent_category_id'] = $parent_category_id;
$arrCategory['create_date'] = "Now()";
$arrCategory['update_date'] = "Now()";
$arrCategory['creator_id']  = $creator_id;
$arrCategory['rank']        = $rank;
$arrCategory['level']       = $level;
$arrCategory['category_id'] = $objQuery->nextVal('dtb_category_category_id');
$arrCategory['category_info'] = $category_info;
$arrCategory['info_flg'] = $info_flg;
//追記:親の設定を引き継ぐ時
if($arrCategory['info_flg']) {
$arrCategory['category_info'] = $this->lfGetParentInfo($objQuery, $parent_category_id);
}
$objQuery->insert("dtb_category", $arrCategory);
$objQuery->commit();    // トランザクションの終了
}
/**
* カテゴリの階層が上限を超えているかを判定する
*
* @param integer 親カテゴリID
* @param 超えている場合 true
*/
function isOverLevel($parent_category_id) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$level = $objQuery->get('level', "dtb_category", "category_id = ?", array($parent_category_id));
return $level >= LEVEL_MAX;
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
// 追記:親のcategory_infoを取得する
function lfGetParentInfo($objQuery, $pid) {
$where = "category_id = ?";
$parent_info = $objQuery->get("category_info", "dtb_category", $where, array($pid));
return $parent_info;
}
}
?>

/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php
一挙変更

<?php
// {{{ requires
require_once CLASS_REALDIR . 'pages/products/LC_Page_Products_List.php';
/**
* LC_Page_Products_List のページクラス(拡張).
*
* LC_Page_Products_List をカスタマイズする場合はこのクラスを編集する.
*
* @package Page
* @author LOCKON CO.,LTD.
* @version $Id: LC_Page_Products_List_Ex.php 20764 2011-03-22 06:26:40Z nanasess $
*/
class LC_Page_Products_List_Ex extends LC_Page_Products_List {
// }}}
// {{{ functions
/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
parent::process();
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
/**
* カテゴリIDの取得
*
* @return integer カテゴリID
*/
function lfGetCategoryId($category_id) {
// 指定なしの場合、0 を返す
if (empty($category_id)) return 0;
// 正当性チェック
if (!SC_Utils_Ex::sfIsInt($category_id)
|| SC_Utils_Ex::sfIsZeroFilling($category_id)
|| !SC_Helper_DB_Ex::sfIsRecord('dtb_category', 'category_id', (array)$category_id, 'del_flg = 0')
) {
SC_Utils_Ex::sfDispSiteError(CATEGORY_NOT_FOUND);
}
// 指定されたカテゴリIDを元に正しいカテゴリIDを取得する。
$arrCategory_id = SC_Helper_DB_Ex::sfGetCategoryId('', $category_id);
if (empty($arrCategory_id)) {
SC_Utils_Ex::sfDispSiteError(CATEGORY_NOT_FOUND);
}
$objQuery = new SC_Query();
// 追加:カテゴリ説明
$this->category_info = $objQuery->get("category_info", "dtb_category", "category_id = ?", $arrCategory_id);
return $arrCategory_id[0];
}
}
?>

/data/Smarty/templates/default/products/list.tpl
88行目付近<!–★タイトル★–>の下へ

<!--★カテゴリ説明★-->
<!--{if $category_info}--><div id="category_info"><!--{$category_info}--></div><!--{/if}-->

以上です。

操作はカテゴリ登録に毛が生えた程度だと思いますが、しつこく触って慣れて下さい。
なんとなく、勝手が違うように感じますから。

総括

こういう機能を付ければ、あまりPCに詳しくない人にも色々できると思ってしまいそうですが、まだ不便な点があります。

それを軽減しようとエディタを取りつけたわけですが、それでも画像をアップする機能がついていないので、どのようにして画像を表示するかという点が、まだ不便です。
URLを引っ張ってくれば表示は出来ますが、そうも行かない場合がありますし。

結局、もう一歩という感じですね。
他人に提供するものとしては。

今後も改善案を勉強していきます。
それでは。

ブログ運営

株式会社ちょもらんま

https://qomolangma.jp