カスタムコンテンツとは、管理画面においてノーコードでオリジナルコンテンツのフィールドを定義し、そのコンテンツに対する管理機能とフロントエンドに表示するための仕組みを提供する機能です。
管理画面から登録したデータはREST API で取得する事も可能です。これにより、baserCMS5はヘッドレスのデータAPIプラットフォームとして機能します。
データ構成については、ER図 をご覧ください。
カスタムフィールドでフィールドマスタを作成し、カスタムリンクで、でコンテンツのフィールド設計を行い、カスタムエントリーでそのコンテンツに対してのデータを登録します。
WordPressのカスタムフィールドとの違いは、フィールド定義をレコードではなく、データベーステーブルのカラムとして作成するため、データベースのレコード量が少なく検索動作も高速となります。
カスタムフィールドとは、オリジナルのフィールドを定義できる機能です。
テキスト、テキストエリア、ラジオボタンなどのフィールドタイプは、プラグイン内直下の plugins ディレクトリ内で、個別にプラグインとして管理します。
初期状態では次のフィールタイプを提供し、独自のカスタムフィールドをプラグインとして開発が可能です。
エントリーにおける入力チェックとして次のものを提供します。
エントリーにおける入力チェックとして正規表現を指定したチェックができます。
なお、エラーとなった場合のエラーメッセージも設定できます。
エントリーにおける入力変換として次のもの選択できます。
カスタムテーブルとは、コンテンツ管理で利用できるコンテンツテーブル、または、カテゴリやタグのマスターとして利用するためのマスターテーブルです。
カスタムテーブルを作成すると、内部的に次の命名規則でデータベースのテーブルを自動生成します。
custom_entry_{カスタムテーブルID}_{カスタムテーブル識別名}
また、初期カラムとして次のカラムをデータベースのテーブルに自動追加します。ただし、
新しいテーブル名入力して一度保存すると、テーブルとフィールドの紐付けができるようになります。
「利用できるフィールド」に定義したカスタムフィールドの一覧が表示されていますので、必要なものを「利用中のフィールド」にドラッグアンドドロップで移動します。
「利用中のフィールド」における並び順が、管理画面のカスタムエントリー入力画面の並び順となり、適宜、ドラッグアンドドロップで並び順を入れ替えることができます。
「利用中のフィールド」のフィールドの「設定」をクリックすると名称を変更できます。
関連フィールドは、カスタムテーブルとカスタムフィールドの関連情報です。
カスタムテーブルの「利用中のフィールド」のフィールドの「詳細編集」ボタンをクリックする事で、入力必須や、説明文、注意書き、前見出し、後見出しなど、管理画面のカスタムエントリー入力画面の表示に関わる部分の設定ができ、こちらも画面下部でプレビューを確認する事ができます。
テーブルは、マスターメンテナンス用の管理画面としても利用する事ができますが、フロントページに表示するには、コンテンツ管理でカスタムコンテンツを作成し、テーブルと紐付ける必要があります
カスタムコンテンツの編集画面を開き、「テーブル」にてカスタムテーブルを選択することで紐付けることができます。
公開状態が「公開する」となっている場合、画面左のメニューにコンテンツ名を表示します。
templates/CustomContent/
に配置したフォルダを対象として一覧に表示します。カスタムエントリーは、カスタムテーブルに登録する実際のデータを指します。
スラッグを利用するとURLにエントリーIDでなく、任意の文字列を利用する事ができます。なお、スラッグについては数値のみは利用できません。
# スラッグなし
/{カスタムコンテンツ名}/view/{記事NO}
# スラッグあり
/{カスタムコンテンツ名}/view/{スラッグ}
カスタムコンテンツとカスタムエントリーによってフロントページの一覧と詳細を提供します。
初期状態でこちらのレイアウトは、自動生成したものになっていますが、実際には、テンプレート上でフロントページ用のヘルパ関数を利用して自由に項目を配置する使い方を想定しています。
カスタムコンテンツで設定したコンテンツテンプレートを利用します。
# default の場合
# 一覧
/templates/CustomContent/default/index.php
# 詳細
/templates/CustomContent/default/view.php
ヘルパを利用する事でエントリーのフィールドの値を取得する事ができます。
echo $this->CustomContent->getFieldValue($entry, 'field_name');
ループフィールドを利用している場合の利用例は次のとおりです。
// ループフィールドかどうか判定
$isLoop = $this->CustomContent->isLoop($customEntry, 'group_normal');
// 子のエントリーを取得
$entryChildren = $this->CustomContent->getFieldValue($customEntry, 'group_normal');
// 子のフィールド定義を取得
$linkChildren = $this->CustomContent->getLinkChildren($customEntry, 'group_normal');
if ($isLoop && $entryChildren && $linkChildren) {
foreach($entryChildren as $entryChild) {
foreach($linkChildren as $linkChild) {
echo $this->CustomContent->getFieldValue($entryChild, $linkChild->name);
}
}
}
カスタムエントリーは、WebAPIからも取得が可能です。
(事前にWebAPIの有効化が必要です)
エンドポイントは次のとおりです。
# 一覧
/baser/api/bc-custom-content/custom_entries.json?custom_table_id=1
# 詳細
/baser/api/bc-custom-content/custom_entries/1.json?custom_table_id=1
必ず、クエリパラメータに custom_table_id
を指定する必要があります。
独自のフィールドタイプはプラグインとして開発します。
必要な最小構成は次のとおりです。
- config/
- setting.php
- src/
- View/
- Helper/
- {PluginName}Helper.php
- Plugin.php
- config.php
プラグインとして動作させるために、Pluginクラスを設置します。中身は空でも構いませんが BcPlugin
を継承します。
// /src/Plugin.php
namespace {PluginName};
use BaserCore\BcPlugin;
class Plugin extends BcPlugin{
}
type
に BcCustomContentPlugin
を定義することで、カスタムコンテンツのプラグインとして認識できるようになります。
// /config.php
return [
'type' => ['BcCustomContentPlugin'],
'title' => __d('baser_core', 'カスタムコンテンツ:TELフィールド'),
'description' => __d('baser_core', 'カスタムコンテンツにTELフィールドを提供する'),
'author' => 'baserCMS User Community',
'url' => 'https://basercms.net',
];
カスタムフィールドの編集画面にて「タイプ」として認識させるためには、対象プラグイン配下の /config/setting.php
にタイプの設定を定義します。
BcCustomContent.fieldTypes
配下に、プラグイン名をキーとして定義します。つまり、プラグインごとに1つ定義できます。
return [
'BcCustomContent' => [
'fieldTypes' => [
{PluginName} => [
// 設定値を定義する
]
]
]
];
category : タイプのセレクトボックスにおけるグループ(基本 |
日付 | 選択 | コンテンツ | その他) |
label
: 見出しラベルcolumnType
: DBのカラム型controlType
: コントロールのタイプ(検索時の条件生成などに利用) preview
: プレビューに対応しているかどうか(デフォルト false)useDefaultValue
: 初期値の利用(デフォルト true)useSize
: 横幅の利用(デフォルト false)useMaxLength
: 最大文字数の利用(デフォルト false)useAutoConvert
: 自動変換の利用(デフォルト false)useCounter
: カウンターの利用(デフォルト false)usePlaceholder
: プレースホルダーの利用(デフォルト false)useCheckEmail
: Eメール形式チェックの利用(デフォルト false)useCheckEmailConfirm
: Eメール比較チェックの利用(デフォルト false)useCheckNumber
: 数値チェックの利用(デフォルト false)useCheckHankaku
: 半角チェックの利用(デフォルト false)useZenkakuKatakana
: 全角カタカナチェックの利用(デフォルト false)useZenkakuHiragana
: 全角ひらがなチェックの利用(デフォルト false)useCheckDatetime
: 日付チェックの利用(デフォルト false)useCheckRegex
: 正規表現チェックの利用(デフォルト false)useCheckMaxFileSize
: ファイルアップロードサイズ制限の利用(デフォルト false)useCheckFileExt
: ファイル拡張子チェックの利用(デフォルト false)loop
: ループ機能に対応しているかどうか(デフォルト false)return [
'BcCustomContent' => [
'fieldTypes' => [
'BcCcText' => [
'category' => '基本',
'label' => 'テキスト',
'columnType' => 'string',
'controlType' => 'text',
'preview' => true,
'useSize' => true,
'useMaxLength' => true,
'useAutoConvert' => true,
'useCounter' => true,
'usePlaceholder' => true,
'useCheckEmail' => true,
'useCheckEmailConfirm' => true,
'useCheckNumber' => true,
'useCheckHankaku' => true,
'useCheckZenkakuKatakana' => true,
'useCheckZenkakuHiragana' => true,
'useCheckDatetime' => true,
'useCheckRegex' => true,
'useCheckMaxFileSize' => false,
'useCheckFileExt' => false,
'useDefaultValue' => true,
'loop' => true
]
]
]
];
4つのメソッドを定義します。
// BcCcText の例
// /src/View/Helper/BcCcTexthelper
namespace BcCcText\View\Helper;
use BaserCore\View\Helper\BcAdminFormHelper;
use BcCustomContent\Model\Entity\CustomField;
use BcCustomContent\Model\Entity\CustomLink;
use Cake\View\Helper;
class BcCcTextHelper extends Helper
{
public $helpers = [
'BaserCore.BcAdminForm' => ['templates' => 'BaserCore.bc_form']
];
public function control(CustomLink $link, array $options = []): string
{
$field = $link->custom_field;
$options = array_merge([
'type' => 'text',
'size' => $field->size,
'maxlength' => $field->max_length,
'placeholder' => $field->placeholder
], $options);
if (!empty($field->counter)) {
$options['counter'] = true;
}
return $this->BcAdminForm->control($link->name, $options);
}
public function preview(CustomLink $link)
{
$options = [
':size' => 'entity.size',
':maxlength' => 'entity.max_length',
':placeholder' => 'entity.placeholder',
':value' => 'entity.default_value'
];
return $this->control($link, $options);
}
public function searchControl(CustomLink $link, array $options = []): string
{
$options = array_merge([
'size' => '',
'max_length' => '',
'placeholder' => ''
], $options);
return $this->control($link, $options);
}
public function get($fieldValue, CustomLink $link, array $options = [])
{
return h($fieldValue);
}
}