Symfony 1.4 表单模板

问题描述 投票:0回答:3

我正在安装 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">

我可以更改以添加附加元素来包围输入标签的模板在哪里? 我对代码进行了彻底的搜索,但似乎找不到生成此代码的位置。

提前致谢!

php symfony1 symfony-forms symfony-1.4
3个回答
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()
方法,以便在渲染单选/复选框字段时使用您的
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
投票

您是否使用管理生成器在后端生成表单?

如果是这样,您应该在位于 .../cache/app/enviroment/modules/ 的缓存文件夹中查找表单

您会注意到,如果您在开发环境“app_dev”中使用该应用程序,将会有一些带有“auto”前缀的文件夹,这些文件夹是由 symfony 自动生成的,用于缓存模块。

然后在.../cache/backend/dev/modules/autoModule/templates/上查找需要更改视图的模块

您可以在此链接中找到模板自定义下每个文件的一些说明。

您需要将所需的文件复制到 .../apps/backend/module/templates/ 文件夹中,您可以创建模板文件夹。请注意,如果您更改模块的 config.yml,则更改将应用到缓存中,因此您必须再次更新模板(从缓存上的模板复制并粘贴到您的模块/模板)

现在困难的是,我发现我可以使用javascript以更快速、更简单的方式修改表单HTML,这就是我之前对一些symfony项目所做的,希望它有所帮助。


0
投票

Puh,Symfony 1。很久以前我就使用过。我挖掘了旧的 symfony 文档,并且 custom widget 可能就是你想要的。我不认为 symfony 1 有像 symfony 2 那样的表单主题。

© www.soinside.com 2019 - 2024. All rights reserved.