今回は、データベースモデルについて取り扱います。

ここでやることは、ズバリschema.ymlを作成して、opVotePluginが
利用するモデルやテーブルを作ることです。

訓練されたsymfony+Doctrine使いのみなさんにとっては手馴れたものかもしれません。

schema.yml作成

Pluginのschema.ymlはプラグインのディレクトリの config/doctrine/schema.ymlです。

3. プロジェクトでE-R図を作成しましたが、そのとおりに作ります。

plugins/opVotePlugin/config/doctrine/schema.yml

options:
  charset: utf8

VoteQuestion:
  actAs: [Timestampable]
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    member_id: { type: integer(4), notnull: true }
    title: { type: string(140), notnull: true }
    body: { type: string }
  relations:
    Member: { onDelete: cascade }

VoteQuestionOption:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    vote_question_id: { type: integer(4), notnull: true }
    body: { type: string(140), notnull: true }
  relations:
    VoteQuestion: { onDelete: cascade, foreignAlias: VoteQuestionOptions }

VoteAnswer:
  actAs: [Timestampable]
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    member_id: { type: integer(4), notnull: true }
    vote_question_id: { type: integer(4), notnull: true }
    vote_question_option_id: { type: integer(4), notnull: true }
    body: { type: string }
  relations:
    Member: { onDelete: cascade }
    VoteQuestion: { onDelete: cascade, foreignAlias: VoteAnswers }
    VoteQuestionOption: { onDelete: cascade, foreignAlias: VoteAnswers }

こういった具合になるでしょう。

今回はまだ開発段階ということで、テーブル作成のために、ためらわずopenpne:installで初期化してしまってください。
なお、このコマンドの実行により、すでにSNS上に存在するデータは削除されます。

$ ./symfony openpne:install

openpne:installタスクは、デフォルトではプラグインチャネルサーバからのフェッチ等がふくまれているため、時間がかかる!と、いう方は単にDBまわりだけ初期化する方法があります。
それは、doctrine:buildタスクを直接実行することです。

$ ./symfony doctrine:build --all --and-load

おそらくデータベースには、vote_answer、vote_questionそしてvote_question_optionという3つのテーブルが作成されています。
また、プラグインのlib/にはmodel/, form/, filter/が作成されます。機能的には、symfonyにあるものと同じですが、作成されたクラス名はプレフィックスとして Pluginが付加されています。
プラグイン下に作られるモデルなどは、抽象クラスで実際には、OpenPNE3のディレクトリのlib/*/doctrine/プラグイン名 下でこの抽象クラスを実装したクラスが存在します。
もし、あなたがモデルクラスに新たなメソッドを追加するときは、プラグインにある抽象クラスのほうを編集してください。

少し高度な話 〜プラグイン新規インストール時のメカニズム

少し面倒な話になりますので特に気にしない人は読み飛ばしても構いません。OpenPNEのプラグインはPEARのチャネルサーバを利用しています。
opPlugin:installタスク では、チャネルサーバからファイルを落として、plugins/に展開しますが
もしも、以前に同じプラグイン管理されていない状態で、インストールされたとき
sns_configテーブルの name=”プラグイン名_needs_data_load” の存在するフィールドの
valueの値を1に設定します。

この状態で openpne:migrateタスク が実行されると、そのプラグイン分のテーブルが作成
されるような仕組みになっています。

このメカニズムを利用して、今までデータベースモデルがなかったプラグインのテーブルを、既存のデータを残しつつ作成することができます。
以下の方法が有効でしょう。

  • sns_configテーブルの name =”プラグイン名_needs_data_load” の存在するフィールドのvalueの値を1に設定
  • openpne:migrateタスクを実行

これで、テーブルの追加のみが行えます。

この仕様は、完成物のテーブルを作成するためのモノだと考えられるため、
開発のためであれば、素直に openpne:install か doctrine:build –all –and-load をしてしまった方が早いです。
参考までに。