スケジュール(Plugin_Schedule)にカスタムフィールドを利用する
営業日等のカレンダーを表示する機能として、「サイト管理>スケジュール」があります。
標準機能では、登録項目としてテキスト入力とセレクトによる選択があります。
カスタムフィールドを使って項目を追加する方法を説明します。
営業日等のカレンダーを表示する機能として、「サイト管理>スケジュール」があります。
標準機能では、登録項目としてテキスト入力とセレクトによる選択があります。
カスタムフィールドを使って項目を追加する方法を説明します。
この口座はa-blog cms Training Camp 2021 Autumnで行った内容です。
当日の内容がYouTubeに上がっているため、よければご覧ください。
管理画面側で読み込むCSSとJavaScriptファイルを作成して、エントリー編集画面に読み込んでおきましょう。
使用テーマ直下に admin-asset 作成し、フォルダの中に field-edit.css と field-edit.js を作成しておきます。
/使用テーマ/admin.htmlをひらき、 先程作成したcssとjsファイルを Touch_Edit の中で下記のように読み込みます。
@extends("/_layouts/admin.html")
@section("admin-css")
@parent
<!-- カスタムCSSを記述 -->
<!-- BEGIN_MODULE Touch_Edit -->
<link rel="stylesheet" href="/dest/admin.css">
<link rel="stylesheet" href="/admin-asset/field-edit.css">
<!-- END_MODULE Touch_Edit -->
@endsection
@section("admin-js")
@parent
<!-- カスタムJSを記述 -->
<script src="/dest/vendor.js" async></script>
<script src="/dest/admin.js" charset="UTF-8"></script>
<!-- BEGIN_MODULE Touch_Edit -->
<script src="/admin-asset/field-edit.js"></script>
<!-- END_MODULE Touch_Edit -->
@endsection
/使用テーマ/include/head/link.html をひらき、 作成したcssファイルを Touch_SessionWithContribution の中で下記のように読み込みます。
<!-- BEGIN_MODULE Touch_SessionWithContribution -->
<link rel="stylesheet" href="/css/acms-admin.min.css">
<link rel="stylesheet" href="/admin-asset/field-edit.css">
<!-- END_MODULE Touch_SessionWithContribution -->
/使用テーマ/include/head/js.html をひらき、 作成したjsファイルを Touch_SessionWithContribution の中で下記のように読み込みます。
<!-- BEGIN_MODULE Touch_SessionWithContribution --><!-- BEGIN_MODULE Js -->
<script src="/acms.js{arguments}" charset="UTF-8" id="acms-js"></script><!-- END_MODULE Js -->
<script src="/admin-asset/field-edit.js"></script>
<!-- END_MODULE Touch_SessionWithContribution -->
これで下準備は完了です。
/使用テーマ/admin/entry/field.html を開いておきます。
カスタムフィールドメーカーで入力欄を生成します。
カスタムフィールドメーカー
https://developer.a-blogcms.jp/tools/custom-field.html
カスタムフィールド
チェックボックス
タイトル : フィールド設定
フィールド : test_f1
項目名 : 必須解除
値 : on
テキスト
タイトル : フィールドタイトル
フィールド : test_f2
オプション > 入力チェック > バリデータ:必須 [ フィールドタイトルが入力されていません ]
※今回はJavaScriptによるバリデートを使用するにチェックは入れないでください。
生成した入力用ソースをコピーして、あらかじめ開いておいた /使用テーマ/admin/entry/field.html に貼り付けます。
管理画面 > エントリー > エントリー作成 からエントリー作成画面を表示してフィールドが追加されたことを確認します。
保存ボタンを押してバリデータによってエラー表示されることも確認しておいてください。
テーブルに見出しをつけます。
先程追加したフィールドテーブルの上に下記ソースを貼り付けてください。
<h2 class="acms-admin-admin-title2 acms-admin-margin-top-medium">必須切り替えテスト</h2>
必須ラベルをつけます。
「フィールドタイトル」の後ろ(thタグの中)に下記ソースを貼り付けてください。
<span class="acms-admin-label acms-admin-label-danger acms-admin-margin-left-mini js-test_f2_label">必須</span>
フィールドタイトルのテキストinputの長さを調整します。
フィールドタイトルのテキストinputのクラス acms-admin-form-width-full を acms-admin-form-width-large
に書き換えてください。
エラー文の余白調整を調整します。
acms-admin-text-error に acms-admin-margin-top-mini
クラスを追加してください。
エラー文にアイコンをつけます。
acms-admin-text-error 要素の中身を下記で置き換えてください。
<span class="acms-admin-icon acms-admin-icon-attention"></span><span class="acms-admin-align-middle">フィールドタイトルを入力してください</span>
スタイルが整ったかエントリー編集画面を再度確認します。
エラー文のpタグに js-test_f2-error-text
クラス を追加します。
/使用テーマ/admin-asset/field-edit.js に下記ソースを貼り付けてください。
document.addEventListener('DOMContentLoaded', function() { // チェックボックスのinput要素を取得 var checkbox = document.getElementById('input-checkbox-test_f1-on'); // 必須バリデータ要素を取得 var checkHidden = document.getElementById('test_f2-v-required'); // 必須ラベル要素を取得 var label = document.querySelector('.js-test_f2_label'); // ページロード時にチェックボックスにチェックが入っていた場合はバリデータ無効化 if (checkbox.checked) { checkHidden.disabled = true; label.style.display = 'none'; } // チェックボックスをON/OFFした時の処理 checkbox.addEventListener('change', function(event) { var errorText = document.querySelector('.js-test_f2-error-text'); if (event.target.checked) { // チェックした時はバリデータを無効化し、エラー文が出ていたら非表示にする checkHidden.disabled = true; label.style.display = 'none'; if (errorText) { errorText.style.display = 'none'; } } else { // チェック外した時はバリデータを有効化し、エラー文非表示のスタイルを消す checkHidden.disabled = false; label.style.display = ''; if (errorText) { errorText.style.display = ''; } } }); });
動きの確認をしてください。
下記ソースを /使用テーマ/admin/entry/field.html に貼り付けます。
<h2 class="acms-admin-admin-title2 acms-admin-margin-top-medium">イベント情報</h2>
<table class="acms-admin-table-admin-edit"><tbody class="js-date-prepend"></tbody></table>
今貼り付けたソースには、すでにJSで制御する時に使用する js-date-prepend
クラスがつけてあります。
h2タグ見出しもついていますが、不要な場合は削除してください。
下記ソースを /使用テーマ/admin-asset/field-edit.js に追記してください。
document.addEventListener('DOMContentLoaded', function() {
// ~ 割愛 ~
ACMS.addListener("acmsDispatch", function() {
// 公開期間をカスタムフィールド内へ移動
var datePrepend = document.querySelector('.js-date-prepend');
var entryStartDateDisplay = document.getElementById('entry-start-date-display');
var entryEndDateDisplay = document.getElementById('entry-end-date-display');
// 所得したカスタムフィールドのテーブル要素の末尾に期限要素を追加していく
datePrepend.appendChild(entryStartDateDisplay);
datePrepend.appendChild(entryEndDateDisplay);
});
});
公開日時と掲載期限が移動するかエントリー編集画面を開いて確認します。
期限入力欄が間延びしているので、詳細設定にあった時とおなじようなスタイルに調整します。
下記ソースを /使用テーマ/admin-asset/field-edit.css に貼り付けてください。
/* 公開日時と掲載期限をエントリーのカスタムフィールドに移動 */
.js-date-prepend .entryFormDateBlockWrap {
margin-right: 10px;
}
@media screen and (min-width: 480px) {
.js-date-prepend .entryFormDateBlockWrap{
display: inline-block;
}
.js-date-prepend .entryFormDateBlock {
display: inline-block;
width: 150px;
vertical-align: middle;
}
}
スタイルが整ったかエントリー編集画面を再度確認します。
/使用テーマ/admin/entry/field.html を開いておきます。
カスタムフィールドメーカーで入力欄を生成します。
カスタムフィールドメーカー
https://developer.a-blogcms.jp/tools/custom-field.html
カスタムフィールドグループ
グループのタイトル : イベント情報
フィールド名 : group_test_f3
横向きレイアウト
テキスト
タイトル : 見出し
フィールド : test_f3_item_title
テキストエリア
タイトル : テキスト
フィールド : test_f3_item_note
生成した入力用ソースをコピーして、あらかじめ開いておいた /使用テーマ/admin/entry/field.html に貼り付けます。
管理画面 > エントリー > エントリー作成 からエントリー作成画面を表示してフィールドが追加されたことを確認します。
入力欄を設置します。
先ほど生成たコードの group_test_f3:loop
内をコピーして、:loop開始コメントの上に3回ペーストしてください。
タイトルをデフォルト値に書き換えます。
ペーストしたコード内 name="test_f3_item_title[]"
要素の value をそれぞれ「出演」「企画」「協賛」に置き換えてください。
テキストをデフォルト値に書き換えます。
ペーストしたコード内の textarea 要素の中身を全て「内容を書き換えてください。不要な場合は項目ごと削除してください。」に置き換えてください。
下記IF文でペーストしたコードを囲ってください。
<!-- BEGIN_IF [%{EID}{test_f3_item_title}{test_f3_item_note}[delnl]/em] -->
~ ここにデフォルト値を設定したフィールドが入ります。 ~
<!-- END_IF -->
管理画面 > エントリー > エントリー作成 からエントリー作成画面を表示して確認します。
デフォルト値がエントリー新規作成時にのみ読み込まれて、エントリー編集時/エントリー保存失敗時に不要なフィールドが増えないことを確認してください。
デフォルト値が設定されている部分が冗長なのでSetTemplateを使いテンプレートの変数化をしていきます。 @include でも同様のことができので、どちらで対応してもOKです。
SetTemplate を用意します。 下記コードを /使用テーマ/admin/entry/field.html の上の方に貼り付けてください。
<!-- BEGIN_SetTemplate id="tpl_test_f3_item" -->
<!-- END_SetTemplate -->
デフォルト値設定しているtr要素の一つをコピーし、SetTemplateの中に貼り付けてください。
次に、SetTemplate 内の name="test_f3_item_title[]"
要素の value を {{tpl_item_title}}
で置き換えます。
GET_Template を設置します。
<!-- BEGIN_IF [%{EID}/em/_and_/<!-- BEGIN_MODULE Admin_Messages -->{message}<!-- END_MODULE Admin_Messages -->/neq/failure] -->
の中を下記で置き換えてください。
<!-- エントリー作成時のデフォルト設定 -->
<!-- GET_Template id="tpl_test_f3_item" tpl_item_title="出演" -->
<!-- GET_Template id="tpl_test_f3_item" tpl_item_title="企画" -->
<!-- GET_Template id="tpl_test_f3_item" tpl_item_title="協賛" -->
GET_Templateできているかエントリー新規作成して確認します。
「イベント情報」見出しが2つある場合は削除してください。
theadは不要かと思いますので削除してください。
name="test_f3_item_title[]"
が入っている td
を th
に変更してください。
必要であれば placeholder を入れてください。
テーブルがくっついて線が2重になっている場合は、/使用テーマ/admin-asset/field-edit.css に下記を追記してください。
.acms-admin-table-admin-edit + .acms-admin-table-admin-edit {
border-top: 0;
}
スタイルが整ったかエントリー編集画面を再度確認します。
js-lite-editor-field
クラスを name="test_f3_item_note[]"
要素につけてください。
※ 表示側の解説は本記事でしていませんが、表示する時には校正オプションの[raw]が必要になります。
カスタムフィールド用の Lite Editor JS をカスタマイズします。
/使用テーマ/admin-asset/field-edit.js に下記を追記してください。
document.addEventListener('DOMContentLoaded', function() {
// ~ 割愛
ACMS.Ready(function() {
ACMS.Config.LiteEditorFieldConf.btnPosition = 'bottom';
ACMS.Config.LiteEditorFieldConf.classNames = {
LiteEditor: 'entryFormLiteEditor',
LiteEditorBtnGroup: 'acms-admin-btn-group acms-admin-btn-group-inline',
LiteEditorBtn: 'acms-admin-btn',
LiteEditorBtnActive: 'acms-admin-btn acms-admin-btn-active',
LiteEditorBtnClose: '',
LiteEditorTooltipInput: 'acms-admin-form-width-full'
};
ACMS.Config.LiteEditorFieldConf.btnOptions = [
{ label: 'リンク', tag: 'a', className: '', sampleText: 'リンクテキスト' },
{ label: '強調', tag: 'em', className: '', sampleText: ' ' },
{ label: '重要', tag: 'strong', className: '', sampleText: ' ' }
];
});
});
Lite Editor のスタイル調整もしておきます。
js-lite-editor-field の親要素に field-lite-editor-wrap
クラスを付けてください。
次に、/使用テーマ/admin-asset/field-edit.css に下記を追記します。
.field-lite-editor-wrap .lite-editor-toolbox {
margin-top: 6px;
padding: 0;
background-color: transparent;
border: none;
border-radius: 0;
}
.field-lite-editor-wrap .lite-editor-btn-group-wrap {
padding-left: 0;
}
エントリーの編集ページが Lite Editor 化されているか確認します。
これからユーザー情報を表示させたいので、ユーザーがあまりいない場合はユーザー追加しておきましょう。 管理画面 > ユーザー の [ユーザー作成] から追加できます。 10件以上あると後から行うカスタマイズで変化がわかりやすいです。
/使用テーマ/admin/entry/field.html を開いておきます。
カスタムフィールドメーカーで入力欄を生成します。
カスタムフィールドメーカー
https://developer.a-blogcms.jp/tools/custom-field.html
カスタムフィールドグループ
グループのタイトル : 担当者
フィールド名 : group_test_f4
横向きレイアウト
セレクトボックス
タイトル : 担当者名
フィールド : test_f4_item_user
項目名 : 名前
値 : ユーザーID
生成した入力用ソースをコピーして、あらかじめ開いておいた /使用テーマ/admin/entry/field.html に貼り付けます。
エントリー編集画面を表示してフィールドが追加されたことを確認します。
User_Search モジュールのスニペットと変数表を開きます。
ビルトインモジュール
https://developer.a-blogcms.jp/document/reference/built_in.html#entry-6
※ 他のUser系モジュールでも問題ないです。
スニペットから下記の必要なものをコピぺしていきます。
値が空になっていないoption要素を囲うように貼り付けてください。
変数表から下記の必要なものをコピぺしていきます。
値が空になっていないoption要素内に貼り付けます。
group_test_f4:loop 内の option要素に中括弧が2重になっている部分があるので、その一番外側をエスケープします。
<option value="{id}" \{test_f4_item_user:selected#{id}\}>{name}</option>
管理画面 > モジュールID を開きモジュールIDを作成します。
モジュール : User_Search
モジュールID : user_search_test
名前 : カスタマイズ講座用(ユーザー情報をセレクトできるようにしてみよう)
※ モジュールIDや名前はなんでもOKです。わかりやすいものにしてください。
ブログID : ユーザーが登録されている(またはこれから登録する)ブログを選択
一度保存します。
表示設定を開き、表示件数や権限などを調整します。
※表示件数を10件以上にしておくとこの後に行うカスタマイズでの変化がわかりやすくなります。
作成したモジュールIDをコピーして、テンプレート側のモジュールに貼り付けます。
<!-- BEGIN_MODULE User_Search id="user_search_test" -->
エントリー編集画面を確認し、担当者のselectにユーザー情報が反映されていることを確認します。
現在ユーザー選択はただのselectボックスなのでユーザーが増えた場合に探すのが大変です。 こういう時は、select2.js の組み込みJSを入れておくと便利です。 ユーザーが10こ以上になるとテキスト検索がかけれるようになります。
担当者名のセレクトボックスに js-select2
クラスをつけておきましょう。
value が空の option には「選択してください」を入れておくと親切かと思います。
担当者の見出しが上の要素とくっついている場合は、余白クラスをつけておきましょう。
<h2 class="acms-admin-admin-title2 acms-admin-margin-top-medium">担当者</h2>
お疲れ様でした。
今回は裏側の作り込み方や小技紹介をさせていただきました。
この記事をみて気になる項目がありましたら表側の実装にも挑戦してみてください。
CSVインポートでは、エントリーの情報と、カスタムフィールドの値を登録することができます。この時にカスタムフィールドグループの値をCSVインポートする方法について解説します。
入力フォーム、テキストエリア、画像の項目を含んだカスタムフィールドグループのサンプルです。
カスタムフィールドグループを利用したい方はぜひ参考にしてください。
<table class="js-fieldgroup-sortable"> <!-- BEGIN bfd_field_unit_group:loop --> <tr class="sortable-item"> <td class="item-handle"> <img width="17" height="17" class="arrowHandle" src="/images/admin_arrow_vertical.gif" /> <br /> ( <a class="item-delete" href="#" onclick="return false;">×</a> ) </td> <td> <table class="nestTable"> <tr> <th>小画像</th> <th>小見出しとURL</th> <th>小概要</th> </tr> <tr> <td> <!-- BEGIN bfd_field_unit_image:veil --> <img src="%{ARCHIVES_DIR}{bfd_field_unit_image@path}" /><!-- END bfd_field_unit_image:veil --><br /> <label><input type="checkbox" name="bfd_field_unit_image@edit[{i}]" value="delete" /> 削除</label> <input type="hidden" name="bfd_field_unit_image@old[{i}]" value="{bfd_field_unit_image@path}" /> <input type="file" name="bfd_field_unit_image[{i}]" /> <input type="hidden" name="bfd_field_unit_image@width[{i}]" value="200" /> </td> <td> <input type="text" name="bfd_field_unit_lead[{i}]" value="{bfd_field_unit_lead}" size="30" /> <br /><br /> %{HTTP_ROOT} <br /><input type="text" name="bfd_field_unit_url[{i}]" value="{bfd_field_unit_url}" size="15" /> </td> <td> <textarea name="bfd_field_unit_summary[{i}]" cols="40" rows="5" class="formSizeL">{bfd_field_unit_summary}</textarea> </td> </tr> </table> </td> </tr> <!-- END bfd_field_unit_group:loop --> <tr class="sortable-item item-template"> <td class="item-handle"><img width="17" height="17" class="arrowHandle" src="/images/admin_arrow_vertical.gif" /></td> <td> <table class="nestTable"> <tr> <th>小画像</th> <th>小見出しとURL</th> <th>小概要</th> </tr> <tr> <td> <input type="file" name="bfd_field_unit_image[]" /> <input type="hidden" name="bfd_field_unit_image@width[]" value="200" /> </td> <td> <input type="text" name="bfd_field_unit_lead[]" value="" size="30" /> <br /><br /> %{HTTP_ROOT} <br /><input type="text" name="bfd_field_unit_url[]" value="" size="15" /> </td> <td> <textarea name="bfd_field_unit_summary[]" cols="40" rows="5" class="formSizeL"></textarea> </td> </tr> </table> </td> </tr> <tfoot> <tr> <td colspan="3"><input type="button" class="item-insert btnAddition" value="+ 項目を追加する" /></td> </tr> </tfoot> </table> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_lead" /> <input type="hidden" name="field[]" value="bfd_field_unit_lead" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_url" /> <input type="hidden" name="field[]" value="bfd_field_unit_url" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_summary" /> <input type="hidden" name="field[]" value="bfd_field_unit_summary" /> <input type="hidden" name="bfd_field_unit_image:extension" value="image" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_image@path" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_image@x" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_image@y" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_image@edit" /> <input type="hidden" name="@bfd_field_unit_group[]" value="bfd_field_unit_image@old" /> <input type="hidden" name="field[]" value="bfd_field_unit_image" /> <input type="hidden" name="field[]" value="@bfd_field_unit_group" />
出力するHTMLのサンプルです。
<h2>複雑なカスタムフィールドのサンプル</h2> <!-- BEGIN_MODULE Blog_Field --> <!-- BEGIN bfd_field_unit_group:loop --> <div style="width:200px; float:left; margin-right:20px;"> <!-- BEGIN bfd_field_unit_image:veil --> <img src="%{ARCHIVES_DIR}{bfd_field_unit_image@path}" alt="" width="200"> <!-- END bfd_field_unit_image:veil --> <h3><a href="%{HTTP_ROOT}{bfd_field_unit_url}">{bfd_field_unit_lead}</a></h3> <p>{bfd_field_unit_summary}</p> </div> <!-- END bfd_field_unit_group:loop --> <!-- END_MODULE Blog_Field -->