1

Form.Class のウィジェットは次のとおりです。

$this->widgetSchema['schools'] = new sfWidgetFormChoice(array(
    'choices'        => Doctrine_Core::getTable('school')->getUsersSchools($userId),
    'renderer_class' => 'sfWidgetFormSelectDoubleList', 
    'renderer_options' => array(
        'label_unassociated' => 'Unassociated',
        'label_associated' => 'Associated'
    )));

上記は問題なく機能しますが、保存されている値は上記の選択リストに関連付けられていません。取得した配列の ID を値として保存する必要があります。代わりに、取得されるリストは時系列であり、ID は無視されます。

schoolTable クエリは次のとおりです。

 public function getUsersSchools($id){
          $q =Doctrine_Query::create()
             ->select('id')
             ->from('school')
             ->where('user_id = ?', $id)
             ->execute();
         return $q;
     }
4

1 に答える 1

1

私があなたの質問を正しく理解できれば、関連付けられた学校 ID を保存したいと考えています。代わりにウィジェットを使用するsfWidgetFormDoctrineChoiceと、主キーを ID として使用するため、すぐに使用できます。

$query = Doctrine_Core::getTable('school')->queryForSelect($userId);
$this->setWidget('schools', new sfWidgetFormDoctrineChoice(array(
  'model' => 'school',
  'query' => $query,
  'multiple' => true,
  'renderer_class' => 'sfWidgetFormSelectDoubleList', 
  'renderer_options' => array(
    'label_unassociated' => 'Unassociated',
    'label_associated' => 'Associated'
  ),
)));
$this->setValidator('schools', new sfValidatorDoctrineChoice(array(
  'model' => 'schoool',
  'query' => $query,
  'multiple' => true,
)));

// in SchoolTable class
public function queryForSelect($userId)
{
  return $this->createQuery('s')
    ->andWhere('s.user_id = ?', $userId)
  ;
}

適切なスキーマがある場合(学校は多対多の関連付けである必要があると思います)、現在の from にはschools_listフィールド(生成されたベース from で適切に定義されている)が必要であり、そのフィールドを変更してレンダリングすることができますsfWidgetFormSelectDoubleList:

$this->widgetSchema['schools_list']->setOption('renderer_class', 'sfWidgetFormSelectDoubleList');
$this->widgetSchema['schools_list']->setOption('renderer_options', array(
  'label_unassociated' => 'Unassociated',
  'label_associated' => 'Associated'
));
于 2012-11-04T20:32:02.590 に答える