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