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

この記事は最終更新日から1年以上が経過しています。
先日の記事ECCUBEの小技:商品一覧ページをカテゴリごとに画像で装飾を、管理画面からやる方法です。

見た目としてやってやった感はありますし、テキストを加えることもできるので、悪くは無いものです。
しかし、僕は前回のもののほうがやりやすいですね。
ひとまず、設置方法を紹介します。

データベースにカラムを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を引っ張ってくれば表示は出来ますが、そうも行かない場合がありますし。

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

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

4 Comments

  1. こんばんは。
    サイト参考にさせていただいております。

    EC-CUBEのバージョンが2.12になると、この処理をしたあとカテゴリが追加できなくなるのですが原因はおわかりになりますか?

    是非ご教授くださいませ。
    よろしくお願いします

    • お返事が遅くなり、申し訳ありません。

      このカスタマイズによる弊害があったとのことですが、カテゴリの登録時に、円焚き―で処理をさせているという事はないでしょうか?
      そういった場合があるらしく、一度、お試しください。

      ECCUBEバージョンの2.12の場合、プラグインを使ったほうが安定して、こういったカスタマイズが成る場合もありますので、一度お試しください。

      追記:円焚きーとなっておりますが、エンターキーの間違いです。

      • 昨年 EC -CUBE 2.11.4でショッピングサイト構築時にこの記事を見つけ
        大変助かりました。貴重な情報ありがとうございました。
        先日より EC -CUBE 2.12.3で再構築しカテゴリページのカスタマイズを試みておりますが
        私もdamu様同様、画像や説明文の表示が問題なく表示できるのですが
        新規にカテゴリーが作成できません。
        以下のファイルの編集に問題があるのではないかと想像いたしております。
        /data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Category_Ex.php
        /data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php
        カテゴリーコンテンツプラグインなども試みましたが、残念ながら私の環境では動作してくれません。何かヒントなどありましたらお教え下さい。

        上記の「カテゴリの登録時に、円焚き―で処理をさせているという事はないでしょうか?」の
        円焚き―とはどういった意味なのでしょうか?

    • いつもご覧いただき、ありがとうございます。

      バージョンが2.11.4であれば、問題なく動作するはずですが、もし、上手くいかないという場合は、エンターキーでの登録ではなく、登録ボタンをクリックして登録してみてください。

      今のところ、そうすることで処理は上手くいっております。

      自分の方では問題が起こってないので、対処法が思いつきません。

      お力添え出来ないようでしたら、申し訳ないです。

Leave a Reply

Your email address will not be published.


*


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください