EC-CUBEで管理画面からカテゴリ毎の画像や説明文を追加する
データベースにカラムを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"> (上限<!--{$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を引っ張ってくれば表示は出来ますが、そうも行かない場合がありますし。
結局、もう一歩という感じですね。
他人に提供するものとしては。
今後も改善案を勉強していきます。
それでは。