多くの調査の後、私はいくつかの種類のソリューションを管理しましたが、もっと正確なものがありますか?
sfWidgetFormDoctrineChoiceを使用するのではなく、sfWidgetFormSelectRadioを使用しましたが(チェックボックスも可能ですが、他のウィジェットやウィジェットを選択できるかどうかわかりません)この特別なケースではSelectRadioで十分でした...)
以前のDoctrineChoiceウィジェットを記入するために使用していた前回のクエリの結果で、ウィジェットのchoicesオプションが満たされていました。それぞれの選択肢のキーと値:
$imgs = Doctrine_Core::getTable('ProjImages')->getImages();
$choices = array('' => '');
foreach ($imgs as $img):
$choices[$img->getId()] = $img->getId();
endforeach;
次に、「フォーマットR:$選択肢に反映されている私のウィジェットには、画像を 『『私も選択しないためのオプションを必要とするので、バリで=> falseオプション』必要」ウィジェットにオプション
$this->widgetSchema['img'] = new sfWidgetFormSelectRadio(array(
'choices' => $choices,
'formatter' => array($this, 'showAsImages')
));
$this->validatorSchema['img'] = new sfValidatorChoice(array(
'choices' => $choices,
'required' => false
));
私が使用しました』配列を最初の( '' => '')として選択します。
最後に、私は、フォーマッタコールバックを書いた:
public function showAsImages($widget, $inputs)
{
$rows = array();
foreach ($inputs as $input)
{
$domdoc = new DOMDocument();
$domdoc->loadHTML($input['label']);
$node = $domdoc->getElementsByTagName('label')->item(0);
if ($node->nodeValue != "")
{
$img = Doctrine_Core::getTable('ProjImages')->find(array($node->nodeValue));
$input['label'] = '<label '.$node->attributes->item(0)->name .
'="'.$node->attributes->item(0)->value.'">' .
'<img src="'.$img->getImg().'" alt="image" />' .
'</label>';
}
$rows[] = $widget->renderContentTag('li',
$input['input'].
$widget->getOption('label_separator').
$input['label']);
}
return $widget->renderContentTag('ul',
implode($widget->getOption('separator'), $rows),
array('class' => $widget->getOption('class')));
}
Iは、(すべてのsfWidgetFormSelectRadioの元のデフォルトのフォーマッタのソースコードを使用し、それに基づいて、私は各入力要素の「ラベル」を改変しました残りのコードは、私が使ったソースコードとまったく同じです)。
各入力要素のラベルについては、DOMDocumentオブジェクトを使用して値(イメージのID)を取得し、次にDBクエリを作成してイメージを取得し、 'label'を< img> tag ...空の選択肢が見つかった場合は、デフォルトの 'label'を使用します...
それは...私はフォーマッタのコールバックがもう少し仕事を得ることができると思いますこの問題を解決するには、どのような提案やもっと良い解決策が歓迎されています...わかりますように、私はウィジェットの 'フォーマッタ'オプションに依存しています。 ..
読んでいただきありがとうございます!