PowerCMS ブログ

PowerCMS に同梱されているウェブサイト/ブログのテーマは複数のものがありますが、いずれも PowerCMS に必要なシステムテンプレートが最初から含まれています。例えば、

  • 承認依頼の際に送信されるメールのテンプレート
  • 会員サイト機能のサインアップ/プロフィール編集画面テンプレート
  • エンタープライズ検索のテンプレート

などがこれにあたります。システムテンプレートに存在しない場合は各機能デフォルトのものを使用しますが、管理画面に表示されないのでカスタマイズができません。また、システムテンプレートを新しく追加するには、

  • データベースにシステムテンプレートを追加する
  • テーマにシステムテンプレートの記述を追加する

といった、CMS 利用ユーザだけでは解決できない作業が必要になります。

しかし、Movable Type のみで構築された CMS に新しく PowerCMS を導入した場合など、前述のシステムテンプレートを含まないテーマですでにウェブサイト/ブログを作成しているケースは比較的多く存在します。PowerCMS は、こういったケースにも対応することができます。

PowerCMS では、必要なシステムテンプレートを後からインストールできる

システムテンプレートをインストールしたいウェブサイト/ブログの「デザイン」メニュー内にある「テンプレート」を選択すると、テンプレート一覧を表示することができます。この画面右の「アクション」ウィジェット内に「システムテンプレートを追加」というリンクがあります。

「アクション」ウィジェット内「システムテンプレートを追加」

これを選択することで、「利用可能なテーマ」を選択するダイアログが表示されます。この中には、現在利用中のテーマは含まれていません。

テーマを選択する

システムテンプレートをインストールしたいテーマを選択して「インストール」ボタンを押してください。「選択したテーマのシステムテンプレートをインストールしました。」というメッセージが表示されたらインストール完了です。

このとき、すでに存在するシステムテンプレートとバッティングした場合は上書きされますが、上書き前の内容はバックアップされます。テンプレート一覧画面の「ショートカット」ウィジェット内に「バックアップされたテンプレート」リンクがあり、これを選択することで旧テンプレートを確認することができます。

Movable Type 標準の Eiger、Rainier 等のテーマはもちろん、制作したオリジナルテーマでも使えます。「システムテンプレートを追加」を是非お試しください!

カテゴリー
PowerCMS 4サイト制作全般設定・管理画面カスタマイズ

先日のブログ記事で ContactForm のベーステンプレートを代替テンプレートでカスタマイズする方法を紹介しました。

先のエントリには書きましたが、代替テンプレートでのカスタマイズをでは下記の点で改善の余地があります。

  • ダイナミックパブリッシング(DynamicMTML)に対応できない
  • フォームやブログ/ウェブサイトによって違うモジュールを利用したい場合、mt:Ifタグによって分岐をさせなければならない(フォームの種類が多い場合、冗長なテンプレートになってしまう)

そこで、ベーステンプレートをテンプレートモジュールとして作成し、各フォームの設定画面毎にベーステンプレートを選択できるようにするプラグインを作成しました。

まず、先の記事などを参考に、ContactFormのベーステンプレートをテンプレートモジュールとして作成します。プラグインをインストールすると、フォームの作成・編集画面に追加されたベーステンプレートID入力欄が表示されるようになります。ここに、モジュールの template_id を入力します。こうすることで、formタグを含む ContactForm のベーステンプレートをフォーム毎に指定することができるようになります。

フォームの作成・編集画面に追加されたベーステンプレートID入力欄

空欄の場合は、オリジナルのベーステンプレートが適用されます。このプラグインは ダイナミック・パブリッシング(DynamicMTML)にも対応しています。

カテゴリー
テンプレート作成Tipsプラグイン技術情報

今年になって書いた2つめのプラグイン、ResourceObject プラグインの紹介記事です。ふと思いついて書いたのですが、利用できるシーンは色々ありそうです。

Data APIのパフォーマンス問題と静的JSON作成

Data APIを活用してアプリケーションを公開している時、サイトの規模が大きくなってくると Data API (mt-data-api.cgi)のパフォーマンスが気になってくると思います。Data APIはアクセスがある度に動的にデータを生成しますので、多くのアクセスが集中するようなサイトであれば JSONデータを静的に生成して配信したくなる、といった経験はMT開発者なら一度は経験しているのではないでしょうか。

実はData API以前にもMTの記事などをJSON出力するようなことをやっている方は多くてtinybeansさんの「flexibleSearch.js - 超高速Ajax検索を実現するjQueryプラグイン」などは、もろにこのようなこと(JSONをMTタグで静的出力する)をやっています。

このようなことを実現する実装に対して、Movable Type Advent Calendar 2016でアイデアマンズの宮永さんが以下のようなエントリーを上げていらっしゃいます。

〝 確実に解析し利用できるJSONデータを出力するには、Movable Typeのことをよく理解している必要があります。

 encode_jsonを忘れてしまい、テストデータでは大丈夫だったけどユーザーがダブルクオーテーション使ったりしてJSONが壊れてしまった...とかMTあるあるですね。

 でも、こうは思いませんか? データフォーマットの書式に気を使うのは人間の仕事だろうか、と。〟

確かにJSONフォーマットを人力でMTMLを書いて出力するテンプレート・タグを書くのは人間の仕事ではないような気がします。

ただし、上記のようなプラグインを利用してデータ構造を定義することは、自由なフォーマットを定義できるメリットがある一方で、そもそも「Data API (mt-data-api.cgi)のパフォーマンスが気になって」静的ファイル化を検討しているのに、そのテンプレートをユーザーが書かなければならないというのも何だか変な話だと思いました。Data APIが出力するJSONを組み立てているのだから、MTにデータを組み立ててもらって、そいつを出力すればいいのでは?

ResourceObjectプラグインでJSONデータを簡単出力

このプラグインでは、テンプレート・タグ「MTResourceObject」を利用可能にします(ダイナミックパブリッシングには未対応)。

Data APIのResource定義に沿ってオブジェクトをJSON形式で出力します。stashモディファイア(またはmodelモディファイア)で取得するオブジェクトの datasourceを指定できます(省略時 entry)。versionモディファイアでData APIのバージョンを指定します(省略時3)。以下のテンプレートは、現在のコンテキストに沿った記事をData APIのレスポンスと同じ形で出力します。

<mt:Entries glue="," lastn="0" ><mt:if name="__first__">{
"totalResults":"<mt:EntriesCount>",
"items": [</mt:if>
<mt:ResourceObject stash="entry" version="2">
<mt:if name="__last__">]}</mt:if></mt:Entries>

model、idモディファイアを指定することで特定のオブジェクトをData APIのResource定義に沿ってJSON出力します。

<mt:ResourceObject model="page" id="123" version="2">
カテゴリー
テンプレート作成Tipsプラグイン技術情報

ページの先頭へ