わかりました、多くの調査の後、私はある種の解決策を管理しましたが、おそらくもっと正しいものがありますか?
sfWidgetFormDoctrineChoice を使用する代わりに、sfWidgetFormSelectRadio を使用しました (ただし、Checkbox も使用できますが、他のウィジェットで動作するかどうか、またはウィジェットを選択することさえできるかどうかはわかりません :/ ビジネス ルールで必要なため、SelectRadio で十分でした)この特定のケースでは...)
ウィジェットの選択肢オプションは、前の DoctrineChoice ウィジェットを埋めるために使用していた前のクエリの結果で埋められました。以前に処理されたので、各レコードの Id は各選択肢のキーと値でした:
$imgs = Doctrine_Core::getTable('ProjImages')->getImages();
$choices = array('' => '');
foreach ($imgs as $img):
$choices[$img->getId()] = $img->getId();
endforeach;
次に、'formatter' オプションもウィジェットに渡しました。
$this->widgetSchema['img'] = new sfWidgetFormSelectRadio(array(
'choices' => $choices,
'formatter' => array($this, 'showAsImages')
));
$this->validatorSchema['img'] = new sfValidatorChoice(array(
'choices' => $choices,
'required' => false
));
バリデーターで 'required'=>false オプションを使用しました。これは、ウィジェットで 'no image' を選択するオプションも必要であるためです。これは、最初の ('' => '') 選択肢として $choices 配列に反映されます。
最後に、フォーマッタ コールバックを次のように記述しました。
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')));
}
sfWidgetFormSelectRadio の元のデフォルト フォーマッタのソース コードを使用し、それに基づいて、各入力要素の「ラベル」を変更しました (残りのコードはすべて、使用したソース コードとまったく同じです)。
各入力要素のラベルについては、DOMDocument オブジェクトを使用して値 (画像の ID) を取得し、DB クエリを作成して画像を取得し、< img > タグを使用して「ラベル」を再構築しました。 ...もちろん、空の選択肢を見つけた場合は、デフォルトの「ラベル」を使用します...
それだけでした...フォーマッタコールバックはもう少し作業を進めることができると思いますので、提案や問題のより良い解決策を歓迎します...ご覧のとおり、私はウィジェット、そして私が見る限り、一部のウィジェットのみがこのオプションを受け入れます...
読んでくれてありがとう!