エントリーの一括変更機能をマスターしよう!
Ver. 2.11 で新しく追加された「エントリーの一括編集」機能を体験してみましょう。
Ver. 2.11 で新しく追加された「エントリーの一括編集」機能を体験してみましょう。
秋合宿 a-blog cms Training Camp 2014 Autumnの募集を開始いたしました。
前回は愛知・三重・静岡・福井・石川・長野・京都・奈良・大阪・兵庫・東京・香川・広島・山口の14エリアから集まり、合計43人の方にご参加いただきました。会場は前回とはちがって師崎荘で行います。
日時 | 2014年11月21日(金)13:00 – 22:00 2014年11月22日(土)9:00 – 12:00 |
---|---|
費用 | 20,000円(1泊2食付) |
プレゼント | 参加者全員:独自ドメイン拡張+1(30,000円相当) 発表者全員:非商用利用スタンダードライセンス(個人ブログとかに使ってください) ※ どちらも年内を申請期限とします。 |
会場 | 師崎荘(集合は セントレア 12:00 を予定しています) |
受付 | 受付用に名刺を1枚ご用意下さい。(皆さんと名刺交換する事になりますので多めに持ってきて下さい) |
注意事項 | 今回の費用は2日間通しでの費用になります。 部屋は大部屋になる可能性があります。 キャンセル料が発生するのは利用3日前からになります。 |
申し込み | a-blog cms Training Camp 2014 Autumn : ATND |
営業日等のカレンダーを表示する機能として、「サイト管理>スケジュール」があります。
標準機能では、登録項目としてテキスト入力とセレクトによる選択があります。
カスタムフィールドを使って項目を追加する方法を説明します。
このハンズオン記事ではVer.2.11から追加された、開発環境が整ったテーマ「Develop」を触ってみましょう。
ここでは、ローカル環境に a-blog cms をインストール状態を例に解説していきます(ablogcms.io では行えません)。環境が異なる場合はご自身の環境に合わせて読み替えてください。
このハンズオンでは、npm(Node Package Manager)が必要です。インストールされていない方は、 https://nodejs.org/ja/download から環境にあったインストーラーをダウンロードしてインストールください。
Ver.2.11より同梱された新しいテーマです。a-blog cms を開発する際によく使うテンプレートをシンプルにしたものを同梱していますが、フロントエンドに関する開発環境も整えられています。
機能 | 概要 |
---|---|
SCSSのコンパイル | SCSSをCSSにコンパイルします。 |
JSファイルの結合 | 複数のJSファイルを1つのファイルに結合します。 |
コードのLintチェック | ESLintやstylelintを使用して、JSやSCSSおよびCSSのコードをチェックします。 |
Live Reload | ファイルの変更があった場合に、ブラウザを自動的にリロードします。 |
ソースコードの整形 | EditorConfigを使い、ソースコードを整形します。 |
SVGアイコンの使用 | Font Awesome 5 のSVG with JavaScriptを利用して、SVGアイコンを表示します。 |
ローカル環境に a-blog cms をインストールしてください。ターミナルで、developテーマを設置しているディレクトリまで移動します。
$ cd /themes/develop/
移動できたら、npm をインストールします。
$ npm install
※現在お配りしているdevelopテーマではstylelintが入らないようになっているので、以下のように別途インストールしてください。
$ npm i stylelint stylelint-config-rational-order stylelint-config-recommended stylelint-scss --save
テーマ名(デフォルト: develop)を変更した場合は、package.json の config.theme を変更してください。もし、LiveReload を使用する場合は、実行しているローカル環境のアドレスに合わせて config.local を変更してください。
"config": { "local": "localhost", "theme": "テーマ名" },
コマンドは、npm run **
になります。**
の部分に下記のコマンドが入ります。
コマンド | 概要 |
---|---|
start | CSSとJSファイルの変更を監視してビルドを行う。LiveReloadあり。 |
dev | CSSとJSファイルの変更を監視してビルドを行う。 |
build | CSSとJSファイルのビルドを行う。納品時には使用する。 |
※ npm run start
と npm run dev
では、JavaScriptに余分なコードが入ったり、最適化されません。納品時には必ず npm run build
を行なってください。
一度、npm run start
と実行すると、以下のページが立ち上がるのを確認してみてください。
基本的なテーマの使い方は以上となります。 それでは、このハンズオン記事では以下のことを行なっていきます。
パフォーマンス向上のために、組み込みJSを外す場合は、include/head/js.html で読み込んでいる組み込み JSをTouch_SessionWithContribution を使って、投稿者以上の場合だけ読み込むようにします。
developテーマの/include/head/js.htmlには以下のように記述されています。タッチモジュールの冒頭に「!(エクスクラメーション)」が記述されているので、今回は削除してください。
<!-- 組み込みJSを使わない場合、エクスクラメーションを外して、投稿者以上の場合だけ読み込むようにする --> <!-- !BEGIN_MODULE Touch_SessionWithContribution --> <script src="%{JS_LIB_JQUERY_DIR}jquery-%{JS_LIB_JQUERY_DIR_VERSION}.min.js" charset="UTF-8"></script><!-- BEGIN_MODULE Js --> <script src="/acms.js{arguments}" charset="UTF-8" id="acms-js"></script><!-- END_MODULE Js --> <!-- !END_MODULE Touch_SessionWithContribution -->
以下のようになります。
<!-- 組み込みJSを使わない場合、エクスクラメーションを外して、投稿者以上の場合だけ読み込むようにする --> <!-- BEGIN_MODULE Touch_SessionWithContribution --> <script src="%{JS_LIB_JQUERY_DIR}jquery-%{JS_LIB_JQUERY_DIR_VERSION}.min.js" charset="UTF-8"></script><!-- BEGIN_MODULE Js --> <script src="/acms.js{arguments}" charset="UTF-8" id="acms-js"></script><!-- END_MODULE Js --> <!-- END_MODULE Touch_SessionWithContribution -->
組み込みJSを読み込まない場合、スライダーや画像ビューワーなどのすべての組み込みJSが動作しなくなるためご注意ください。
必要な機能やライブラリは、自分でインストール、実装する必要があります。
バンドル環境が整っていますので、 npm経由でライブラリをインストールし、 importする方式をお勧めします。以下 Lazy Load を実装する例になります。
$ npm i vanilla-lazyload
import LazyLoad from 'vanilla-lazyload';
domContentLoaded(() => { new LazyLoad({elements_selector: '.js-lazy-load'}); });
HTMLに以下のソースコードを記述して、表示してみましょう。 成功した場合、一瞬プレースホルダー画像が現れた後、すぐに猫の写真が表示されます。
<img data-src="http://placekitten.com/400/300" src="/images/placeholder/image.svg" width="400" class="js-lazy-load">
カスタムスタイルは、include/head/preload.html で読んでいます。 以下記述のように preload 属性を使って読み込むようにしており、非同期でスタイルを読み込んでいます。
<link rel="preload" href="/dest/bundle.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="/dest/bundle.css"></noscript>
preload属性を使って、非同期にスタイルを読むようにしたことで、スタイル読み込みでブロックされずレンダリングが速くなります。 ただその影響で、スタイルが当たっていないHTMLが一瞬表示される可能性があります。これを解決するために、Above the fold(ファーストビュー)のCSSをインライン化して読み込みます。
<style> <!-- ファーストビュー(above the fold )のインラインCSS を挿入。インラインCSSは webpackでbuildすると、dest/index.html に生成される。 --> </style>
ハンズオンしやすいように、簡単なスタイルを用意したファイルを用意しました。以下のファイルをご利用ください。
所定の場所にファイルをおいたら、$ npm run start
すると以下のようなページが作成されます。
ページの表示を確認できたら、上記の手順に沿ってnpm run build
してみてください。
ちゃんとファーストビューのインラインのCSSが読み込まれているかどうかは、ブラウザの開発者ツールから確認できます。Google Chrome をお使いの場合は、下記の手順で確認できます。
そうすると、通常であればCSSが当たっていない素のHTML表示されますが、スタイルが当たったHTML要素が確認できます。もし、CSSが当たっていないHTMLが表示された場合は、手順を見直してください。
preload.htmlではファーストビューで使用しているCSSを記述すればいいので、今後開発して行く際はいつものように制作していただければ大丈夫です。
アイコンの利用を考え、developテーマでは、Font Awesome 5 の SVG with JavaScript が利用できるようになっています。
SVG with JavaScript では必要なアイコンのみインポートして利用します。 アイコンの種類により、インポートするパッケージが違うので気をつけてください。例えばブランドアイコン系は、@fortawesome/free-brands-svg-icons から読み込みます。
import { faUser, faSignOutAlt } from '@fortawesome/free-solid-svg-icons'; import { faFacebook, faTwitter, faInstagram } from '@fortawesome/free-brands-svg-icons';
命名規則はクラス名(ケバブケース)をキャメルケースにしたものになります。
.fa-sign-out-alt
のアイコンを使いたい場合は、 faSignOutAlt を読み込みます。
import { faSignOutAlt } from '@fortawesome/free-solid-svg-icons';
インポートしたアイコンを以下のように使用できるように登録します。使用するアイコン全てを指定します。
library.add(faUser, faSignOutAlt, faFacebook, faTwitter, faInstagram);
あとは、以下のようにアイコンを表示させることができます。
<i class="fab fa-twitter"></i> <i class="fab fa-facebook"></i> <i class="fas fa-sign-out-alt"></i>
Font Awsome の公式サイトから好きなアイコンを探して、developテーマで使えるようにしてみましょう。
この口座は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>
お疲れ様でした。
今回は裏側の作り込み方や小技紹介をさせていただきました。
この記事をみて気になる項目がありましたら表側の実装にも挑戦してみてください。