OpenPNE3のプラグインの作り方を読んでて気になったんだけど、

OpenPNE3のプラグインの作り方を読んでて気になったんだけど、

 OpenPNE3を使ってみようと思ってとりあえずプラグインの書き方を読んでみたら「OpenPNE3プラグインの作り方#5」「同#6」でちょっと気になる部分があったのでメモ。

 #5で入力フォームの表示をしているのですが、ここで提示している「_sampleParts.php」ってテンプレートですよね。「opSamplePlugin/apps/pc_frontend/modules/hello/templates/」ディレクトリに設置してるし。で、そこに書かれるコードが


$criteria = new Criteria();
$criteria->add(MemberNewsPeer::MEMBER_ID, $sf_user->getMember()->getId());
$memberNews = MemberNewsPeer::doSelectOne($criteria);

$form = new MemberNewsForm($memberNews);

include_box('MyNews', 'MyNews', '', array('form' => $form, 'url' => 'hello/updateNews'));

――ってのはどうなのかな、と。これってテンプレートに書くべきロジックではないですよね?

 プラグインを読み込むときに $form をテンプレートに渡すコードを別にどこかで記述できるようにしておくべきじゃないのかなぁ。

 #6では上記で表示した入力フォームから値を受け取る部分が記述されているわけですが、


// (コメント行省略)..

class helloActions extends sfActions
{
  // (コメント行省略)..
  public function executeIndex($request)
  {
    return sfView::SUCCESS;
  }

  public function executeUpdateNews($request)
  {
    // POSTリクエストかどうかを確認する
    if ($request->isMethod(sfRequest::POST))
    {
// ↓ここから
      // member_news から 自分のメンバーIDが一致する1行を取りだす
      $criteria = new Criteria();
      $criteria->add(MemberNewsPeer::MEMBER_ID,$this->getUser()->getMember()->getId());
      $memberNews = MemberNewsPeer::doSelectOne($criteria);

      // 前回作成した memberNewsFormの初期値として先ほど取りだした1行をセットする
      $memberNewsForm = new MemberNewsForm($memberNews);
// ↑ここまで

      // POSTされたパラメータを取得する
      $param = $request->getParameter('member_news');
      $param['member_id'] = $this->getUser()->getMember()->getId();

      // パラメータをバインドする
      $memberNewsForm->bind($param);

      // 入力された値が妥当かどうかを確かめる
      if ($memberNewsForm->isValid())
      {
        // データベースに保存
        $memberNewsForm->save();
      }
    }
    // 最後に自分のホームにリダイレクトする
    return $this->redirect('@homepage');
  }
}

――この $memberNewsForm と前出の $form って全く同じものに見えるので、この $memberNewsForm を作成する部分は共通化すべきじゃないのかな、とか。

 helloActionsクラスに $memberNewsForm を生成するメソッドを追加して _sampleParts.php で呼び出すのがいいのか、あるいはhelloActionsクラスとは別に $memberNewsForm(と、$memberNews)を取得するためのクラスを用意するのとどちらがいいのかは分かんないけどさ(symfonyの作法は知らないので。なんかあるでしょ?>作法)。

 #6の _sampleParts2.php の記述も同じ意味でイマイチな気がしてます。

 あと、$member_id みたいな頻繁に参照しそうな値がメソッドチェーンでしか取得できないのはパフォーマンス的に問題ないのかな? ってのも気になるところです。

 OpenPNEについても symfony についても詳しく調べてないので外してるかもしれないけどね。

(このプラグインについては「更新しました」メッセージをどうやって出すんじゃろ、ってのも気になったけど。あるいは更新に失敗した場合のフォローとか)