symfonyのフォームでリストボックスの選択肢を絞る


symfonyの話。前回に引き続き、具体的な例を書く。

■やりたいこと:Hostの編集画面で、Domain一覧のリストボックスの選択肢を絞りたい

テーブルDomainとHostがあって、Host.domain_idがDomain.idを参照してるとする。

テーブルHostのモジュールを作成すると、編集画面でdomain_idの箇所はドメイン名の一覧のリストボックス(プルダウン)が表示される。そこまではいいんだけど、全てのドメインをそこに表示するのではなくて、そのユーザーが所有しているドメインのみを表示させたいとする。

■やること

○一覧に表示させたいものだけを取得するクエリーを作成

lib/model/DomainTableで、「渡されたユーザーIDのユーザーが所有するドメインのみを取得するクエリー」を返すメソッドを追加。

class DomainTable extends Doctrine_Table
{
public function getQueryDomainsOfUser($user_id)
{
# queryを返すことに注意
return $this->createQuery('a')
->addWhere('a.user_id = ?', $user_id);
}
}

○Hostのactions.class.phpにて、ユーザーIDをフォームに渡すような処理を追加。

public function executeNew(sfWebRequest $request)
{
$this->form = new HostForm(null, array('user_id' => $this->getUser()->getGuardUser()->getId()));
}
public function executeEdit(sfWebRequest $request)
{
$this->forward404Unless($host = Doctrine::getTable('Host')->find(array($request->getParameter('id'))), sprintf('Object host does not exist (%s).', $request->getParameter('id')));
$this->form = new HostForm($host, array('user_id' => $this->getUser()->getGuardUser()->getId()));
}

○フォーム(HostForm)内で、必要なドメイン一覧を取得して、プルダウンを作成。

class HostForm extends BaseHostForm
{
public function configure()
{
# actions.list.phpより渡された$user_idを、先ほど作ったDomainTableのメソッドに渡す
$query = Doctrine::getTable('Domain')->getQueryDomainsOfUser($this->getOption('user_id')) ;
# その$queryの結果(=そのユーザーが所有するドメイン一覧)を使って、プルダウンを作成
$this->widgetSchema['domain_id'] = new sfWidgetFormDoctrineChoice(array(
'model' => $this->getRelatedModelName('Domain'),
'query' => $query,
'add_empty' => false
));
}
}

■その他情報

  • 環境:symfony 1.4
  • 参考にしたのはこのページ
  • widgetについてのリファレンス的な説明はここ(symfony 1.2のものだけど、特に問題なし)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です