我正在进行Symfony 1.4的安装,我们需要重新安装以匹配新的公司品牌。新皮肤的要求之一是单选按钮具有以下语法 -
<label><input name="foo" type="radio" value="bar" id="foo_bar"><span></span></label>
然而,单选按钮的默认Symfony代码是 -
<input name="foo" type="radio" value="bar" id="foo_bar">
我可以更改模板在哪里添加其他元素以包围输入标记?我通过代码搜索了高低,我似乎无法找到生成此代码的位置。
提前致谢!
答案 0 :(得分:7)
您需要创建自定义窗口小部件类。我已经扩展了无线电小部件并改变了格式化器的功能。
您可能需要自己定制一下。但是下面的myWidgetFormSelectRadio
类会将每个无线电字段包装在您指定的标签中。
// \lib\widget\myWidgetFormSelectRadio.class.php
class myWidgetFormSelectRadio extends sfWidgetFormSelectRadio
{
protected function formatChoices($name, $value, $choices, $attributes)
{
$inputs = array();
foreach ($choices as $key => $option)
{
$baseAttributes = array(
'name' => substr($name, 0, -2),
'type' => 'radio',
'value' => self::escapeOnce($key),
'id' => $id = $this->generateId($name, self::escapeOnce($key)),
);
if (strval($key) == strval($value === false ? 0 : $value))
{
$baseAttributes['checked'] = 'checked';
}
$inputs[] = array(
'input' => $this->renderContentTag('label', $this->renderTag('input', array_merge($baseAttributes, $attributes)), array('for' => $id)),
);
}
return call_user_func($this->getOption('formatter'), $this, $inputs);
}
public function formatter($widget, $inputs)
{
$rows = array();
foreach ($inputs as $input)
{
$rows[] = $input['input'].$this->getOption('label_separator');
}
return implode($this->getOption('separator'), $rows);
}
}
然后在您的表单类
中// \lib\form\myForm.class.php
public function configure()
{
$this->widgetSchema['my_field'] = new myWidgetFormSelectRadio(array('choices' => $choices));
// ....
}
你偶然使用Twitter Bootstrap吗?如果是这样,那么您还需要扩展Symfony复选框小部件。如果你这样做,那么你可能想扩展sfWidgetFormChoice类并更改getRenderer()
方法,以便在渲染radio / checkbox字段时它使用你的myWidgetFormSelectRadio
和myWidgetFormSelectCheckbox
类。
// \lib\widget\myWidgetFormChoice.php
class myWidgetFormChoice extends sfWidgetFormChoice
{
public function getRenderer()
{
if ($this->getOption('renderer'))
{
return $this->getOption('renderer');
}
$prefix = $this->getOption('use_my_custom_widget') ? 'my' : 'sf';
if (!$class = $this->getOption('renderer_class'))
{
$type = !$this->getOption('expanded') ? '' : ($this->getOption('multiple') ? 'checkbox' : 'radio');
$class = sprintf($prefix . 'WidgetFormSelect%s', ucfirst($type));
}
return new $class(array_merge(array('choices' => new sfCallable(array($this, 'getChoices'))), $this->options['renderer_options']), $this->getAttributes());
}
}
然后在你的表单类
public function configure()
{
$this->widgetSchema['my_field'] = new myWidgetFormChoice(array(
'choices' => $choices,
'expanded' => true,
'use_my_custom_widget' => true,
));
// ....
}
答案 1 :(得分:1)
您是否使用管理生成器在后端生成表单?
如果是这样,你应该查找位于... / cache / app / enviroment / modules /
上的缓存文件夹中的表单你会注意到会有一些带有“auto”前缀的文件夹,如果你在开发环境“app_dev”中使用了这个应用程序,那么这些文件夹会由symfony自动生成以缓存模块。
然后查找需要更改视图的模块... / cache / backend / dev / modules / autoModule / templates /
您可以在此link中找到位于“模板自定义”下的每个文件的一些描述。
您需要在... / apps / backend / module / templates /文件夹中复制所需的文件,您可以创建模板文件夹。请注意,如果更改模块的config.yml,更改将应用于缓存中,因此您必须再次更新模板(从缓存中的模板复制并粘贴到您的模块/模板)
现在很难,我发现我可以使用javascript以更快速更简单的方式修改表单HTML,这就是我之前对某些symfony项目所做的,希望它有所帮助。
答案 2 :(得分:0)
Puh,Symfony 1.很久以前我就一起工作过。我诅咒了旧的symfony文档,custom widget可能是你想要的。我不认为,symfony 1形成了像symfony 2那样的主题。