我正在使用 Symfony 1.4 sfWidgetFormDoctrineChoice
我已将复选框添加到表单中,从而成功提取模型数据。我想做的是在复选框旁边添加一个缩略图以及标题。
$this->setWidget('bulkUploadVideos', new sfWidgetFormDoctrineChoice(array(
'model' => 'MediaAsset',
'query' => Doctrine_Query::create()->select('u.url')->from('MediaAsset u')->orderBy('id DESC'),
'add_empty' => false,
'multiple' => true,
'expanded' => true
)
));
这在将查询拉入像这样排列的复选框列表中做得非常出色:
⧠ 绿色牛仔裤
⧠马古先生
⧠ 下垂
在“媒体资产”表中,我还有一个要包含在布局中的图像 url。所以它看起来像这样:
|-img 缩略图- | ⧠ 绿色牛仔裤
|-img 缩略图- | ⧠ 马古先生
|-img 缩略图- | ⧠ 下垂
我想也许使用格式化程序类,但我没有看到表单有任何变化。
lib/form/formatters/sfWidgetFormSchemaFormatterAllVideos.class.php
<?php
class sfWidgetFormSchemaFormatterAllVideos extends sfWidgetFormSchemaFormatter {
protected
$rowFormat = "<span class=\"my-label-class\">%label%</span>\n <span>%error%%field%%help%%hidden_fields%</span>`n",
$errorRowFormat = "<span class=\"my-error-class\" colspan=\"2\">\n%errors%</span>\n",
$helpFormat = '<br />%help%',
$decoratorFormat = "<div class='custom-video-layout'>\n %content%</div>";
}
然后我把它放在 MediaAssetsForm.class.php 的底部
public function configure() {
parent::configure();
...
..
...
$this->getWidgetSchema()->setFormFormatterName('AllVideos');
唉,页面布局看起来一模一样。我是否错误地调用了格式化程序,或者是否有更简单的方法来执行此操作?
顺便说一句,仍然没有回答如何将图像 url 从表中查询到每个复选框的输出的问题。这是我想解决的主要问题。表格中每条记录的缩略图。
格式化程序用于渲染整个表单,您需要的是更改其中一个小部件的渲染。
sfwidgetFormDoctrineChoice
有一个选项renderer
,它接受格式化程序作为参数。您需要的是sfWidgetFormSelectCheckbox
。我要做的是:
创建您自己的类,它将扩展
sfWidgetFormSelectCheckbox
类。例如
class sfWidgetFormMySelectWithThumbs extends sfWidgetFormSelectCheckbox {
}
扩展
configure
功能,以便使用另一个选项来保存缩略图数组。
public function configure($options = array(), $arguments = array()) {
parent::configure($options, $arguments);
$this->addOption('thumbnails', array());
}
更改
formatChoices
函数,以便将图像添加到复选框前面(您可以复制并修改原始 formatChoices
函数)。
...
$sources = $this->getOption('thumbnails');
...
$inputs[$id] = array(
'input' => sprintf('| %s | %s',
$this->renderTag('img', array('src' => $sources[$key])),
$this->renderTag('input', array_merge($baseAttributes, $attributes))
),
'label' => $this->renderContentTag('label', self::escapeOnce($option), array('for' => $id)),
);
在小部件中使用格式化程序类:
$this->setWidget('bulkUploadVideos', new sfWidgetFormDoctrineChoice(array(
...
'renderer' => new sfWidgetFormMySelectWithThumbs(array('thumbnails' => $thumbanils))
)
));
当然,您需要以数组形式检索缩略图列表,其中数组键与用于复选框值的 id 相同,但这不应该是问题。