Хорошо, после долгих исследований мне удалось найти какое-то решение, но, может быть, есть что-то более правильное?
Вместо использования sfWidgetFormDoctrineChoice я использовал sfWidgetFormSelectRadio (но Checkbox тоже может, ноЯ не знаю, может ли он работать с другими виджетами или даже выбирать виджеты тоже: / только потому, что этого требуют мои бизнес-правила, в данном конкретном случае было достаточно SelectRadio ...)
Опция выбора извиджет был заполнен результатами предыдущего запроса, который я использовал для заполнения предыдущего виджета DoctrineChoice, который был обработан ранее, поэтому идентификатор каждой записи был ключом и значением каждого выбора:
$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, чтобы получить значение (идентификатор изображения), затем сделал запрос в БД, чтобы получить изображение, и затем снова собрал метку.'с тегом ... Конечно, если мне удастся найти пустой выбор, я использую метку по умолчанию ...
И это все ... Я думаю, что обратный вызов форматтераможно получить дополнительную работу, поэтому приветствуются любые предложения или даже более эффективные решения проблемы ... Как вы можете видеть, я зависим от опции 'formatter' виджета, и насколько я вижу, только некоторыевиджеты принимают эту опцию ...
Спасибо за чтение!