在symfony中为所有表单小部件添加类

Rya*_*yan 1 symfony1 symfony-forms

我试图找到一种更好的方法来分配类来形成symfony中的元素.目前,我似乎无法手动分配每一个.即:

$this->widgetSchema['title']->setAttribute("class","fieldInput");
$this->widgetSchema['tag_line']->setAttribute("class","fieldInput");
$this->widgetSchema['description']->setAttribute("class","fieldInput");
// etc
Run Code Online (Sandbox Code Playgroud)

我尝试过没有成功的事情

1)循环遍历$ this-> widgetSchema,将其视为一个数组并将属性设置为每个键

2)$ this-> widgetSchema-> setAttribute()但这只是将类应用于生成的标签,而不是表单元素

必须有一种方法来击中所有的领域,而无需专门指导他们?

谁能指出我正确的方向?

nac*_*tin 9

有一种方法:

创建一个sfWidgetFormSchemaFormatterlib/widget,其中包含例如this(来自symfonians的代码):

class sfWidgetFormSchemaFormatterDiv extends sfWidgetFormSchemaFormatter
{
  protected
    $rowFormat       = "<div class=\"form-row%is_error%\">\n  %label%\n  %error%\n   %hel<div class='myfieldclass'%field%</div>\n p%\n%hidden_fields%</div>\n",
    $errorRowFormat  = "%errors%\n",
    $helpFormat      = '<div class="form-help">%help%</div>',
    $decoratorFormat = "\n  %content%";

  public function formatRow($label, $field, $errors = array(), $help = '', $hiddenFields = null)
  {
    return strtr(parent::formatRow($label, $field, $errors, $help, $hiddenFields), array(
      '%is_error%'    => (count($errors) > 0) ? ' field_error' : '',
      //'%is_required%' => $field,
    ));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的表单中,执行:

$oDecorator = new sfWidgetFormSchemaFormatterDiv($this->getWidgetSchema());
$this->getWidgetSchema()->addFormFormatter('div', $oDecorator);
$this->getWidgetSchema()->setFormFormatterName('div');
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用选择器.myfieldclass input或任何您想要的样式设置元素样式,这是更改表单结构/外观的好方法.


小智 7

从表单类中:

foreach ($this->getWidgetSchema()->getFields() as $field)
{
  $field->setAttribute('class', 'custom-class');
}
Run Code Online (Sandbox Code Playgroud)

如果您有许多需要它的表单类,您也可以从自定义sfWidgetFormSchemaFormatter类的构造函数中调用该代码:

public function __construct(sfWidgetFormSchema $widgetSchema)
{
    parent::__construct($widgetSchema);

    foreach ($this->getWidgetSchema()->getFields() as $field)
    {
        $field->setAttribute('class', 'custom-class');
    }
}
Run Code Online (Sandbox Code Playgroud)