テンプレート @ AboutPetanize

システムリソースのうち、拡張性アイテム(PetanizeExtend)を拡張する機能を提供するものを「テンプレート」と言う。

アイテムのデータ項目だけでは足りなくて、好き勝手に項目を追加してごにょごにょやりたい時に使う。

特徴

テンプレートはシステムリソースである。管理者はあらかじめテンプレートのデータをインポートしておく。

tpl_items.PNG

ユーザからはこのように見える。このように管理者が登録したテンプレートのデータをテンプレートアイテムという。

楕円フキダシ・透明フキダシ・長方形フキダシ…テンプレートアイテムごとにふるまいが違い、必要なデータも変わってくる。この違いはテンプレートに付随してくるモジュールで吸収する。モジュールには、処理とデータモデルが含まれる。これらを総称してテンプレートモジュールという。このうち、処理の部分を拡張モジュール 、データモデルを拡張モデルと言う。

テンプレートから拡張性アイテムを生成するまでの流れ

ユーザが拡張性アイテムを作成する時、テンプレートアイテムを選択することから始まる。ここでは例として、フキダシテンプレートからフキダシを生成する。

テンプレートフキダシテンプレート
拡張性アイテムフキダシ

テンプレートアイテムに楕円フキダシを選択すると、それに応じた拡張モデルが入力フォームに展開されるので、テンプレートアイテムに沿った形でデータ入力を行う。

テンプレートアイテム楕円フキダシ
テンプレートモジュールCircleSpeechBalloon

なお、楕円フキダシのテンプレートモジュールには、次の拡張モジュールと拡張モデルが定義されている。入力フォームは拡張モデルに従って表示され、このフォームで入力されたデータは拡張データとしてjson文字列で保存される。

拡張モジュールSpeechBalloonModule
拡張モデルSpeechBalloon

Postすると、拡張性アイテムにテンプレートモジュール名が記録され、今後はそれを元に拡張データを展開し、利用する。

結果作成されるデータはこんな感じ。テンプレートに関係のあるカラムには*をつけておいた。

Id49
コマ32
様子
フキダシテンプレート*1
フキダシテンプレートモジュール名*CircleSpeechBalloon
重なり3
話順2
フキダシテンプレート拡張データ*
作成2014/06/10 02:09:11
更新2014/06/10 02:09:11

要件

拡張性アイテムについてはPetanizeExtendを参照。

必須カラム

テンプレートのモデルには次のカラムを用意していなければならない。このカラムから、拡張モジュールと拡張モデルを引き出す。

  • module_name:テンプレートモジュール名

拡張性アイテム

テンプレートは拡張性アイテムが作成される時に参照される。拡張性アイテムの動作に必要なデータは、拡張性アイテムにコピーされるので、作成後にテンプレートが参照される事はない。

拡張モデル

拡張モデルのデータは、モデルとしてデータベースに保存されない。拡張データはjson文字列に変換されて、拡張性アイテムにテキスト型の項目として収められる。 テンプレートには拡張モデルを持たないものもある。 テンプレートは、全体を通じて拡張モデルあり・拡張モデルなしのどちらかを選ばなければならない。

拡張データ

拡張モデルのすべてのカラムをjson文字列をしたもの。拡張性アイテムには、この状態で保存され、ブーストした時に拡張モデルに展開される。

拡張モジュール

セキュリティ

テンプレートを使って拡張するという事は、データベースのデータを使って動的に処理を実行することになる。これではデータベースのデータが汚染されていると、任意の処理を実行できてしまう。セキュリティ面から危険。そこで、マニフェスト(テキストファイル)のシステムリソース項目に記述してあるテンプレートと付き合わせて、怪しいものは実行できないようにしている。ただし、それがどの程度有効なのかは定かでは無い。

機能

テンプレートには必ず次の機能が用意されている。

self.enable_list

有効なテンプレートアイテムを返す。

テンプレートアイテムをマニフェストで無効にすることができる。無効にされたテンプレートアイテムは、拡張性アイテムの作成・更新で選択できなくなる。すでに作成されたコンテンツでは利用されたテンプレートアイテムについては参照することはできる。

self.template_manifest

システムリソースのマニフェストから、このテンプレートのマニフェストを取得する。

同じ機能がブースターに実装されているが、彼方からこちらを見る事はできない。

enable?

テンプレートアイテムがマニフェストで有効になっているかどうかを返す。

インスタンスメソッドなので、自身はテンプレートアイテムである。

システムリソースのマニフェストからテンプレートのマニフェストを取得できる。さらにそこからテンプレートアイテムの状況を調べることができるので、自分自身が有効であるかどうかを判別できる。

template_module

テンプレートモジュールを返す。

インスタンスメソッドなので、自身はテンプレートアイテムである。

モジュール名からテンプレートモジュール名を導き出せるので、ブーストマニフェストに頼らずともテンプレートモジュールを返せる。

template_path_name

システムリソースのマニフェストのテンプレート項目からテンプレート名のスネークケースを取得する。次のようなケースでは、'circle_speech_balloon'が返る。メソッド名は「パス名」になっているけど、実際はもっと広い幅の意味を持っている。

    speech_balloon_template: {
      template_items: {
        CircleSpeechBalloon: 'circle_speech_balloon',
      },
    },