Hatena::Groupasakura

浅倉卓司@blog風味? このページをアンテナに追加 RSSフィード

Error : RSSが取得できませんでした。

2009-01-19(Mon)

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

| 17:19 |  OpenPNE3のプラグインの作り方を読んでて気になったんだけど、 - 浅倉卓司@blog風味? を含むブックマーク  OpenPNE3のプラグインの作り方を読んでて気になったんだけど、 - 浅倉卓司@blog風味? のブックマークコメント

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


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

<?php
$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では上記で表示した入力フォームから値を受け取る部分が記述されているわけですが、

<?php
// (コメント行省略)..

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 についても詳しく調べてないので外してるかもしれないけどね。

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

ooharabucyouooharabucyou2009/01/20 13:06川原です。

この記述は、旧バージョンの説明で
テンプレート拡張が、本来テンプレートを書くべきのパーシャルにしか対応してなかったということもあり、このようになっています。
(現在はロジックを書くことができる、コンポーネントにも対応しています。)

さらにモデルからデータを取得するときの指定等は
MemberNewsPeerに新しいメソッドを追加したりして、モデル取得を
するべきだったかもしれません。

現在ブログなどを元にドキュメントが作成されている状態です。
今後、改良がなされると思います。ご意見ありがとうございます。

asakura-tasakura-t2009/01/20 13:59どうもですー。
そもそもsymfonyに不案内なので現在ドキュメントを読んでいるところで、さっきコンポーネントの解説にたどり着いたところだったりしますので(笑)。
そのうち(一番多機能そうな)opDiaryPluginのコードでも読もうかと思っているところです。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20090119
2004 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2008 | 02 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 02 | 03 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2013 | 01 | 05 | 07 |
2014 | 01 | 02 |
2016 | 01 |
2017 | 01 | 05 |
Error : RSSが取得できませんでした。