我有一个带有特定选择小部件(DoctrineChoice)的表单。选项指的是服务器中的某个图像文件,我使用了expandder = true选项(对于复选框/单选按钮)
有没有办法通过显示每个选项的图像来显示小部件?默认情况下,我只获取数据库中选项的ID。
使用firebug,我注意到生成的HTML有一个带有每个选项id的标签,而且,我设法用某个图像更改它,所以我猜我需要做的就是更改每个选项的标签的文本。尽管如此,小部件的“标签”选项只是改变了整个选择的标签,所以不会这样做......
谢谢!
答案 0 :(得分:2)
好的,经过大量的研究,我已经设法解决了一些问题,但也许还有更正确的方法?
我没有使用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选项,因为我还需要在我的小部件中选择'无图像'的选项,这在$ 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),然后进行数据库查询以获取图像,然后使用&lt重新组装'label' ; img&gt;标签...当然,如果我碰巧找到空的选择,我使用默认的'标签'......
就是这样......我认为格式化程序回调可以得到更多的工作,所以欢迎任何建议,甚至是问题的更好解决方案......正如你所看到的,我依赖于'格式化程序'小部件的选项,就我所知,只有一些小部件接受这个选项......
感谢阅读!