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

Symfony1 symfony 1.4在选择小部件中将图像显示为选项,symfony1,widget,symfony-1.4,symfony-forms,Symfony1,Widget,Symfony 1.4,Symfony Forms,我有一个带有特定选择小部件(DoctrineChoice)的表单。这些选项涉及服务器中的特定图像文件,我使用expander=true选项(用于复选框/单选按钮) 有没有办法通过显示每个选项的图像来显示小部件?默认情况下,我只获取数据库中选项的id 使用firebug,我注意到生成的HTML有一个标记,每个选项都有一个id,而且,我设法用一个特定的图像来更改它,所以我猜我所需要做的就是更改每个选项标签的文本。尽管如此,小部件的“标签”选项只会更改整个选择的标签,所以这不起作用 谢谢 好吧,经过大

我有一个带有特定选择小部件(DoctrineChoice)的表单。这些选项涉及服务器中的特定图像文件,我使用expander=true选项(用于复选框/单选按钮)

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

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


谢谢

好吧,经过大量研究,我找到了某种解决方案,但也许还有更正确的方法

我没有使用sfWidgetFormDoctrineChoice,而是使用了sfWidgetFormSelectRadio(但复选框也可以,但我不知道它是否可以与其他小部件一起使用,甚至也不知道它是否可以与选择小部件一起使用):/仅仅因为我的业务规则需要它,在这种特殊情况下,SelectRadio就足够了……)

小部件的choices选项填充了我用于填充前一个DoctrineChoice小部件的前一个查询的结果,该小部件之前已处理,因此每个记录的Id是每个选项的键和值:

$imgs = Doctrine_Core::getTable('ProjImages')->getImages();
$choices = array('' => '');
foreach ($imgs as $img):
  $choices[$img->getId()] = $img->getId();
endforeach;
接下来,我还将“格式化程序”选项传递给小部件:

$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')));
}
公共函数showAsImages($widget,$inputs)
{
$rows=array();
foreach($inputs作为$input)
{
$domdoc=新的DOMDocument();
$domdoc->loadHTML($input['label']);
$node=$domdoc->getElementsByTagName('label')->项(0);
如果($node->nodeValue!=“”)
{
$img=Core::getTable('ProjImages')->find(数组($node->nodeValue));
$input['label']=''。
'getImg()。'alt=“image”/>'。
'';
}
$rows[]=$widget->renderContentTag('li',
$input['input']。
$widget->getOption('label\u separator')。
$input['label']);
}
返回$widget->renderContentTag('ul',
内爆($widget->getOption('separator'),$rows),
数组('class'=>$widget->getOption('class'));
}
我使用了sfWidgetFormSelectRadio的原始默认格式化程序的源代码,并在此基础上修改了每个输入元素的“标签”(所有其余代码与我使用的源代码完全相同)

对于每个输入元素的标签,我使用DOMDocument对象获取值(图像的id),然后进行DB查询以获取图像,然后用标记重新组合“标签”…当然,如果我碰巧找到空的选择,我使用默认的“标签”

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

谢谢你的阅读