symfony 1.4将图像显示为选择小部件中的选项

时间:2011-02-23 19:20:47

标签: symfony1 widget symfony-1.4 symfony-forms

我有一个带有特定选择小部件(DoctrineChoice)的表单。选项指的是服务器中的某个图像文件,我使用了expandder = true选项(对于复选框/单选按钮)

有没有办法通过显示每个选项的图像来显示小部件?默认情况下,我只获取数据库中选项的ID。

使用firebug,我注意到生成的HTML有一个带有每个选项id的标签,而且,我设法用某个图像更改它,所以我猜我需要做的就是更改每个选项的标签的文本。尽管如此,小部件的“标签”选项只是改变了整个选择的标签,所以不会这样做......

谢谢!

1 个答案:

答案 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;标签...当然,如果我碰巧找到空的选择,我使用默认的'标签'......

就是这样......我认为格式化程序回调可以得到更多的工作,所以欢迎任何建议,甚至是问题的更好解决方案......正如你所看到的,我依赖于'格式化程序'小部件的选项,就我所知,只有一些小部件接受这个选项......

感谢阅读!