モジュールIDの基本

それぞれのモジュールを区別する任意の英数字をモジュールIDといいます。それぞれのモジュールはこのモジュールIDを名付けることによって作動し、またこれによってブラウザ上から「何件表示するか」「何を表示するか」などのモジュールに関する設定ができるようになります。

例えば以下のようなモジュールの設定が可能です。

  • 特定のカテゴリーのエントリー一覧を表示させる
  • 特定の期間だけ表示させる
  • キーワードを対象にした一覧を表示させる
  • タグで絞り込んだ一覧を表示させる
  • エントリー一覧にページャーをつける
  • 特定のモジュールの表示件数を変える

モジュールは、モジュールIDがなくても基本的には動作しますが、モジュールの表示内容を個々に変更したい場合にモジュールIDを作成し適用します。  
モジュールIDを利用することで、URLコンテキストを利用したデータの表示だけでなく、管理画面から指定した条件設定や表示設定に合わせてモジュールを動作させることが可能です。

モジュールIDが適用できるモジュールは、ビルトインモジュールとフィールドモジュールの2つです。

カスタムユニットを使った「SVG ユニット」を作ってみよう

最近は SVG ファイルがサイト上でも使われるようになってきていますが、残念ながら a-blog cms の画像ユニットには SVG ファイルを扱うことができません。今回は、カスタムユニットを利用して「SVG ユニット」を作ってみましょう。

  1. 今回用意するカスタムユニット
  2. 管理側のフォームの実装
  3. 管理ページの設定
  4. エントリー編集画面での確認
  5. 表示側のテンプレートの実装
  6. 画像ユニットと同等までのカスタマイズ

今回用意するカスタムユニット

カスタムユニットの実装には、1つだけ追加する方法(custom.html)と、複数設定する方法(extend.html)があります。今回は複数設定する方法での実装を行います。

カスタムユニット名:custom_svg

  • SVGファイル : {svg@path}
  • サイズを指定 : {svg_x} , {svg_y}

管理側のフォームの実装

カスタムユニットの HTML を書くには、カスタムフィールドメーカー に用意されている「カスタムユニット」のフォームから準備します。

ファイルの設置場所は /themes/*テーマ名*/admin/entry/unit/extend.html で、カスタムフィールドメーカーで作った HTML を <!-- BEGIN custom_svg --> 〜 <!-- END custom_svg --> で囲みます。



種類 タイトル フィールド名
ファイル SVGファイル svg_file
テキスト 横幅 svg_x
テキスト 縦幅 svg_y

extend.html

<!-- BEGIN custom_svg -->

 * カスタムフィールド タグ *

<!-- END custom_svg -->

管理ページの設定

コンフィグの3ヶ所の設定をおこないます。「アップロード許可ファイル拡張子」は、忘れがちになりますので注意してください。

ユニット追加ボタン

管理ページ > カスタマイズ管理 > コンフィグ > エントリー > 編集設定 > ユニット追加ボタン に「custom_svg」というモードを設定します。 ラベル部分は「SVG」とすることで(SVG)ボタンが追加されることになります。


ユニット設定

管理ページ > カスタマイズ管理 > コンフィグ > エントリー > ユニット設定 の画面の最後に何も設定していない空の「SVG」ユニットが用意されていますので、(SVG)のボタンを一度クリックして SVG ユニットを追加します。


アップロード許可ファイル拡張子

管理ページ > カスタマイズ管理 > コンフィグ > エントリー > 編集設定 >アップロード許可ファイル拡張子の項目に追記します。SVGファイルはテキストファイルになりますので、「テキストファイルのアップロードを禁止」のチェックボックスを外し、ドキュメントに「 , svg 」と追加します。


エントリー編集画面での確認

この段階で SVG カスタムユニットを追加して保存が可能かどうかをテストしてみましょう。ユニットに(SVG)ボタンが追加されていて追加すると、カスタムフィールドメーカーの HTML のままであれば、以下のようなフォームが表示されます。 まずは項目が正しく出るのを確認して、OKであればスタイル等の調整をしていきましょう。


表示側のテンプレートの実装

unit.html には、あらかじめ extend.html の include の記述が準備されていますので、指定の場所に extend.html を用意します。

/include/unit/extend.html

<!-- BEGIN unit#custom_svg -->
<img src="%{ARCHIVES_DIR}{svg_file@path}" width="{svg_x}" height="{svg_y}" alt="svg">
<!-- END unit#custom_svg -->

これで、正しく設定ができていれば SVG ファイルを表示が可能になります。縦横のサイズを設定してみたり、片側だけ設定してどのように表示になるかを検証してみてください。

画像ユニットと同等までのカスタマイズ

時間があれば、以下のような実装を試してみましょう。

配置、代替えテキスト、リンクなどを設定できるようにすると以下のようなフォームを作ることができるようになります。ここまで作って何かの時に使えるパーツとして持っておいてみては、いかがでしょうか。



/include/unit/extend.html

<!-- BEGIN unit#custom_svg -->
<div class="column-image-{svg_align}">
	<!-- BEGIN_IF [{svg_link}/nem] -->
	<a href="{svg_link}"><!-- END_IF -->
		<img src="%{ARCHIVES_DIR}{svg_file@path}"<!-- BEGIN x:veil --> width="{svg_x}"<!-- END x:veil --><!-- BEGIN svg_y:veil --> height="{svg_y}"<!-- END svg_y:veil --> alt="{svg_alt}">
		<!-- BEGIN_IF [{svg_link}/nem] -->
	</a>
	<!-- END_IF -->
</div>
<!-- END unit#custom_svg -->

マルチブログ環境でのトピックパスの設定

site2014テーマで子ブログを作成しても子ブログを含んだ状態でトピックパスを表示するような設定をしてみましょう。既に「Topicpathモジュール」はモジュールIDの設定がしてあります。

マルチブログ環境でのトピックパスとは

ブログが階層化していても下階層の子ブログを閲覧しているときトピックパスが一番上のブログから開始していることを指しています。トピックパスをマルチブログ環境に対応していないと子ブログを起点に表示されてしまいます。

マルチブログ環境に対応している(親ブログが起点)

親ブログ名 > 子ブログ名 > 親カテゴリー名 > 子カテゴリー名 > エントリー名

マルチブログ環境に対応していない(子ブログが起点)

子ブログ名 > 親カテゴリー名 > 子カテゴリー名 > エントリー名

マルチブログ環境に対応させるには

まず、「Topicpathモジュール」にモジュールIDの設定してモジュールIDを作成しましょう。
モジュールIDの設定で「下の階層のブログが利用することを許可する 」にチェックをしてください。
カテゴリーID(cid)エントリーID(eid)の引数にチェックがあるか確認しましょう。引数にチェックが無いとエントリーの詳細ページなどでトピックパスが正しく表示されません。


階層のブログ「下階層のブログも含める ( descendant-or-self )」、カテゴリー「下階層のカテゴリーも含める ( descendant-or-self )」に設定しましょう。


モジュールの表示設定

ブログの階層の起点「ルート」、階層の数を空、カテゴリーの階層の起点「ルート」、階層の数を空にしてください。そうすることで全ての階層を上から表示することができます。
また、起点の代替ラベルを設定すると一番上の親ブログを「HOME」のような名称で表示することができます。



entry.htmlが404 NotFoundになるケース

ライセンスやユーザー権限、テンプレート設定などにも問題が見当たらないのに
http://ドメイン名/entry.html が404 Not Foundになるケースが報告されました。

原因

entry.html.LCK ファイルがhttpdocsの直下に存在しているのが原因でした。
LCKファイルとはAdobe DreamWeaverでチェックイン・チェックアウトのファイル編集時のロック機能を利用した場合に自動作成されるファイルです。

モジュールIDの設定

指定方法としては、テンプレート上のモジュールの BEGIN_MODULE モジュール名の後に id="モジュールID" のように指定をします。以下、Entry_Headlineに対して設定した場合で説明します。

<!-- BEGIN_MODULE Entry_Headline id="top_headline" -->
<ul>
<!-- BEGIN entry:loop -->
<li><a href="{url}">{title}</a></li>
<!-- END entry:loop -->
</ul>
<!-- END_MODULE Entry_Headline-->

モジュールID管理画面から[モジュールIDを作成]ボタンを押すとモジュールIDの条件設定画面に移動します。モジュールではIDを指定したモジュールを選択してください。idには「top_headline」など指定したIDを入力してください。名前はそのモジュールIDがどんな働きをしているのか分かりやすい名前にするとよいでしょう。


下階層の子ブログでもこのモジュールを利用できるようにする

グローバルの項目で下の階層のブログが利用することを許可するというチェックをすると自分より下階層の子ブログで同じモジュールIDをテンプレートに記述すると継承して使うことができます。ここにチェックを入れない場合はこのモジュールはこのブログだけに所属することになり、下階層の子ブログで使うことができません。

条件を指定する

引数にはブログID、カテゴリーID、エントリーID、ユーザーID、タグ、キーワード、カスタムフィールドなどさまざまな条件を指定することができます。

特定のカテゴリーで絞り込む

お知らせカテゴリーの一覧を表示したいときは、お知らせカテゴリーのIDを指定します。もしお知らせカテゴリーのカテゴリーIDが3の場合、入力フォームに3と入力してください。またID参照というリンクをクリックするとブログ、カテゴリー、ユーザーのIDを調べて選択するとIDを調べることができます。



特定のカスタムフィールドの値を持っているエントリーを表示する

特定のカスタムフィールドを持っているエントリーを一覧で表示することができます。

チェックボックスのカスタムフィールド(カスタムフィールド変数:pickup、値:true)でチェックしたエントリーだけ表示させる場合は、フィールド(field)のところに pickup/true と入力してください。(カスタムフィールド変数:pickup、値:true)を持っているエントリーのみ表示できます。

<label class="acms-form-checkbox" for="input-pickup-true"><input type="checkbox" name="pickup[]" value="true" id="input-pickup-true"{pickup:checked#true} /><i class="acms-ico-checkbox"></i> pickupする</label>
<input type="hidden" name="field[]" value="pickup" />


また演算子もエントリーの絞り込みに利用できます。 例えば、nem(値が空でないとき)を使うことで、pickupというカスタムフィールドに値が入っている場合にのみエントリーを表示することができます。 このフィールドで使用出来る演算子として以下のものがあります。

演算子条件意味
eq=等しい
neq!=等しくない
gt>より大きい
gte>=以上
lt<より小さい
lte<=以下
lkLIKE含まれる
nlkNOT LIKE含まれない
reREGEXP指定した正規表現に合致する
nreNOT REGEXP指定した正規表現に合致しない
emEMPTY値が空(何も入っていない)
nemNOT EMPTY値が空(何も入っていない)ではない

また、_or_ や _and_ といった演算子も使用可能です。
例えば、toho(徒歩)6分以下でprice(家賃)50000円以下の物件を表示したい場合は以下のような値がフィールドに入ります。
toho/lte/6/_and_/price/lte/50000

特定の日時のエントリーを表示させる

開始日時(start)や終了日時(end)に年月日と時分秒を入れて特定の期間内に該当するエントリーを表示させることができます。応用として、値の欄にグローバル変数を使うことで現在時刻を基準とした制御をすることもできます。この条件ではエントリーの日時を参照します。



下階層のデータを絞り込み

自分より下階層のブログやカテゴリーのデータも表示内容に含めるか選択することができます。

  • 下階層のブログを含めない場合は、自分自身のエントリーだけ表示します。
  • 下階層のブログも含める場合は、自分自身と下階層のブログのエントリーを含んだ内容を表示します。
  • 下階層のブログのみを対象とする場合は、自分の下階層のブログのエントリーだけ表示します。