【CS-Cart】カテゴリーデータにカスタムフィールドを追加する(アドオン開発)

【CS-Cart】カテゴリーデータにカスタムフィールドを追加する(アドオン開発)

バシャログ。アドベントカレンダー11日目は fujihara がお届けします。 今回はCS-Cartのアドオン開発でカテゴリーデータにカスタムフィールドを追加する方法をご紹介します。

はじめに

CS-Cartは元から完成されているイメージですが追加でデータを持ちたいということもあるかと思います。 初めて追加したカスタムフィールドがカテゴリーでしたので今回はカテゴリーにカスタムフィールドを追加する方法をご紹介します。

ファイル構成

CS-Cartのトップディレクトリから下層にかけて今回は4つのファイルを作成、変更します。アドオンの名前は cbrains とします。


 {CS-Cart Root}/app/addons/cbrains/addon.xml
                   /func.php
                   /init.php
 {CS-Cart Root}/design/backend/templates/addons/cbrains/hooks/categories/detailed_content.pre.tpl

addon.xml

addon.xmlの説明は今回は省略します。 このファイルでカラムを追加します。カテゴリーデータは主に categories, category_descriptions テーブルにデータがあります。(他にもあります) categoriesテーブルは1カテゴリー1レコード, category_descriptionsテーブルは1カテゴリx有効言語数分のレコードなので category_descriptionsにカラムを追加します。言語設定が変わった場合、入力されたフィールドの値に対して言語ファイルに追記するより、 管理画面から編集できた方が良いのでcategory_descriptionsテーブルにしました。


  ....
  <queries>
    <item for="install">
      ALTER TABLE `?:category_descriptions` ADD COLUMN IF NOT EXISTS `additional_field` varchar(255) NOT NULL DEFAULT '';
    </item>
  </queries>

上記を設定するとアドオンのインストール時に上記クエリーが実行されます。今回はaddtional_fieldというカラムをvarchar(255)で追加しました。 カラムがない場合のみ追加するクエリーになっています。これでカラムの追加は完了です。

init.php

ここではCS-Cartに用意されているフックにアドオンの関数を登録します。 以下でCS-Cart関数:fn_get_categories内で実行されるget_categoriesフックを登録します。


<?php

if (!defined('AREA')) { die('Access denied');}

fn_register_hooks(
    'get_categories'
);

func.php

init.phpに登録したフックの関数を記述します。get_categoriesフックの場合の関数名はfn_{addon_name}_get_categoriesになります。


....

function fn_cbrains_get_categories($params, $join, $condition, &$fields)
{
    // 取得するフィールド(配列) に追加したカラムも取るよう設定
    $fields[] = '?:category_descriptions.additional_field';
    return true;
}
....

//CS-Cart内でフックが呼ばれる時
//fn_set_hook('get_categories', $params, $join, $condition, $fields, $group_by, $sortings, $lang_code);

CS-Cart内でフックが呼ばれる際に上記の変数が渡されます。これを上書きします。今回は取得するフィールドに先程 追加したカラムを追加するので$fields変数を上書きするため引数は$fieldsまでとしています。これでカテゴリーデータを取得した際に 追加したフィールドも取れるようになりました。

detailed_content.pre.tpl

最後に編集用フィールドを管理画面に設けます。管理画面のカテゴリー編集にはアドオン用のテンプレートフックが用意されているので そちらを作成します。


<h4 class="subheader">追加したフィールド</h4>
<label class="control-label" for="additional_field">
追加したカスタムフィールド
</label>
<div class="control-group">
<div class="controls">
<input type="text" id="additional_field" name="category_data[additional_field]" value="{$category_data.additional_field}" size="55" class="input-large"/>
</div>
</div>

fujiwara_20191218_no1.png

保存はnameをcategory_data[xxxxxx]としておけば保存ボタンを押した際に勝手に保存してくれます。

まとめ

今回はカテゴリーデータにカスタムフィールドを追加する方法をご紹介しました。いかがでしたでしょうか? 商品などにも適用できるのでよろしければお試しください。保存時にデータを整形したいなどする場合はカテゴリーの場合は update_category_postフックを使用しますので併せてお試しください。
明日はkoyaの投稿です、お楽しみに。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ