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 )); } }
■その他情報