-オープンソースのSNSエンジン OpenPNEプロジェクト-

OpenPNE3プラグインの作り方#3

12 / 01 月曜日 2008

この記事は OpenPNE3.0.x のものです。現在の最新安定版では動作しない箇所が存在します。

とうとう12月になってしまいました。
健康的な生活を送っている人であれば、
あと、31回寝ればお正月なんです。恐ろしいですね。

OpenPNE3プラグインの作り方#1
OpenPNE3プラグインの作り方#2

本日もOpenPNE3のプラグインについて、解説していきます。

前回では、新しくページを作ることができましたが、拡張を作る上で
どうしても避けて通れないのは、データをどのように保存するかです。

そこで、プラグイン独自のデータベースモデルを作成する方法を載せておきます。

とりあえず、この連載の最終目標として何を作るかだけ先に決めてしまいます。
OpenPNE.jpにある
MyNews機能であれば、簡単にできる気がするのでやってしまいましょう!

MyNews機能

プラグイン用のデータベースモデルの作成法は
symfonyのマニュアルにある通りです。
http://www.symfony-project.org/book/1_2/17-Extending-Symfony#Plug-In%20File%20Structure(英語)

プラグインのディレクトリ直下に「config」ディレクトリが作られているはずです。
その下に、「schema.yml」を作ります。

MyNewsを作る上で、
必要なフィールドは次のようになると思います。

ID     (1対1のモデルにしてもよいのですが、今回はこのテーブルのための固有のキーを割り振ることにします。)
メンバーID(コアにあるmemberモデルの外部キーとなりそうです。)
本文
更新日時

このモデルを作成するために、新しく作成した「schema.yml」を次のようにします。

propel:
  _attributes: { package: plugins.opSamplePlugin.lib.model }

  member_news:
    id: ~
    member_id : { type: integer, foreignTable: member, foreignReference: id }
    content:    { type: longvarchar }
    updated_at: ~

前回同様 YAML はタブ文字ではなく、スペース2文字でインデントするということに気を付けてください。

id と指定したフィールドに関しては、特に何もオプションを指定しないと
自動的にプライマリーキーとなり、オートインクリメントが有効になります。

●●●_id とやることにより、●●●テーブルの外部キーになります。
同じ「schema.yml」ファイル上に、そのテーブルがあれば、自動的にそのテーブルの外部キーになりますが、
memberテーブルの宣言は別の場所にあるので、しっかりと foreignTableを指定します。

* アルファ版の段階で、コアのモデルを利用するときはモデルの変更が行われることが
 ありますのでご注意ください。

updated_atは更新時に自動的に更新時時刻が登録されるフィールドになります。

このファイルを保存した後、

symfony openpne:install

コマンドを利用して、データベースモデルを再構築してください。

* 将来的には、OpenPNE3のすべてのデータベースモデルを初期化しないで
新しく作成したモデルを追加することができるようになる予定です。

これで、新たなテーブルが追加されているはずです。
ws000015.PNG
ws000018.PNG

次回は、OpenPNE3の「テンプレート拡張機能」を利用して
ホームとプロフィールのページにパーツを挿入する方法について投稿する予定です。

コメント:1

佐藤雄紀 11-05-22 (日) 12:35

OpenPNE3.6を利用させて頂いております。
プラグイン作成について気になる点があるのでご質問します。
—————————————————–
* 将来的には、OpenPNE3のすべてのデータベースモデルを初期化しないで
新しく作成したモデルを追加することができるようになる予定です。
—————————————————–
とありますが、現在はデータベースモデルを初期化せずにモデルの追加ができるようになっているのでしょうか?

現在テスト環境にてプラグイン開発を行っておりますが、初期化処理がありますので本番環境では開発は推奨されないということでしょうか?(ユーザーデータが全て消えるため)

お手数をお掛けしますが、ご教授いただければ幸いです。

よろしくお願い申し上げます。

ページの先頭に戻る