前回は各ページにヘッダー上部(ページ最初)にh1タグでキーワードを含めた文書を表示させるカスタマイズでしたが、今回は応用編でカテゴリー(一覧)ページも同じようにカスタマイズします。
ただカスタマイズ内容はカテゴリ毎に文章や画像を載せるカスタマイズをしている前提です。
データベースのdtb_categoryにカラム名:category_info データ型: textを追加します。
data/smarty/templates/admin/products/category.tplに下記を追加します。
<table>
<tr>
<th>ヘッダーh1テキスト</th>
<td><span><!--{$arrErr.category_h1_txt}--></span>
<input type="text" name="category_h1_txt" value="<!--{$arrForm.category_h1_txt|h}-->" size="60" /></td>
</tr>
</table>
data/class_extends/products/LC_Products_List_Ex.phpに下記を追加する。
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);
$objQuery = new SC_Query();
$this->category_h1_txt = $objQuery->get("category_h1_txt", "dtb_category", "category_id = ?", $arrCategory_id);
return $arrCategory_id[0];
}
data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Category_Ex.phpに下記を追加する。
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, category_h1_txt, 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['category_h1_txt'] = $arrRet[0]['category_h1_txt'];
$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['category_h1_txt'] = $objFormParam->getValue('category_h1_txt');
$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['category_h1_txt'] = $objFormParam->getValue('category_h1_txt');
$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');
$this->arrForm['category_h1_txt'] = $objFormParam->getValue('category_h1_txt');
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'),
$objFormParam->getValue('category_h1_txt'),
$_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"));
$objFormParam->addParam("カテゴリh1テキスト", "category_h1_txt", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_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, $category_h1_txt, $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;
$arrCategory['category_h1_txt'] = $category_h1_txt;
//追記:親の設定を引き継ぐ時
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;
}
ヘッダーに下記に書き直す。
!=”"で空じゃなければってことになり、elseifでもしくは~となるので、最初のifでカテゴリーのh1チェックで、2個目が各詳細ページのh1チェックで、それ以外(ホームや設定していないページなど)になります。
<!--{if $category_h1_txt != ""}-->
<h1 id="head_top"><!--{$category_h1_txt}--></h1>
<!--{elseif $arrProduct.h1_txt != ""}-->
<h1 id="head_top"><!--{$arrProduct.h1_txt}--></h1>
<!--{else}-->
<h1 id="head_top">7種類以上のメキシコ唐辛子を使った本格タコスの販売。激辛サルサソースで辛さ調節ができ、子供から大人まで楽しめ、タコスパーティー等に活躍!</h1>
<!--{/if}-->