【问题标题】:Add CSS attributes to Symfony form labels?向 Symfony 表单标签添加 CSS 属性?
【发布时间】:2011-03-08 21:11:32
【问题描述】:

我尝试在我的自定义 sfForm 中为标签添加一些 css 属性,但我无法实现。

在我的自定义类 myForm extends sfForm 中,我动态创建所有文本字段:

public function configure()
{
    $widgetFixtures = array();
    foreach ($fixtures as $fixture) {  
     $widgetFixtures[$fixture->getId()] = new sfWidgetFormInputText(  
            array('label' => $fixture->getTeamNameDom()),  
            // I would like to add something like: array('class' => $fixture->getCSS()),
            array('value' => $fixture->getScore1(), 'readonly' => 'readonly')
            );
    }
    $this->setWidgets($widgetFixtures);
}

我尝试使用setFormFormatterName 格式化渲染,但没有成功。

注意:我不能在模板中使用renderLabel($value, $attributes = array()),因为我从数据库中获取了 CSS 类(如您所见,我必须使用:$fixture->getCSS())。

有人能帮我解释一下吗?

非常感谢。

【问题讨论】:

    标签: css forms symfony1 label symfony-forms


    【解决方案1】:

    这是我解决它的方法。
    我采纳了 johnwards 和 Richsage 的两个建议并将它们放在一起:
    “这类东西应该在视图/操作中处理。”
    “访问选项/属性传递给 Widget 本身。”

    首先,我将 CSS 类添加到输入本身(即使我不会使用它)。

    在我的自定义类myForm extends sfForm,

    foreach ($fixtures as $fixture) {    
         $widgetFixtures[$fixture->getId()] = new sfWidgetFormInputText(  
             array('label' => $fixture->getTeamNameDom()),  
             array('value' => $fixture->getScore1(), 
                   'readonly' => 'readonly',  
                   'class' => $fixture->getCSS())  
             );  
    }  
    

    然后,在模板中,我不使用echo $form;,而是将CSS类添加到标签中,如下所示:

    foreach ($form as $widgetId => $widget) {  
        ...
        $labelClass = $widget->getWidget()->getAttribute('class');  
        echo '<td>'.$widget->renderLabel(null, array('class' => $labelClass)).'</td>';  
        ...
    }
    

    也许这不是解决此问题的最佳方法,但它确实有效。

    感谢大家的反馈!

    【讨论】:

      【解决方案2】:

      您尝试做的似乎是可能的,但您的灰色语法似乎有点不对劲。试试这个:

          $widgetFixtures[$fixture->getId()] = new sfWidgetFormInputText(  
              array('label' => $fixture->getTeamNameDom()),  
              array('class' => $fixture->getCSS()),
              array('value' => $fixture->getScore1(), 'readonly' => 'readonly')
          );
      

      ...或在此处查看“sfWidgetForm 基类”部分:http://www.symfony-project.org/forms/1_4/en/A-Widgets

      【讨论】:

      • sfWidgetFormInputText 只接受 2 个参数 $options=array() 和 $attributes=array()。我已经查看了 symfony 网站,但找不到任何关于将 css 属性添加到标签的信息......像“setLabel($name, $value)”这样的函数并不能解决问题
      【解决方案3】:

      类属性需要在所有表单小部件的第二个参数中作为数组传入。

      $this->setWidget('foo', new sfWidgetFormInputText(array(),array('class','fooclass'));
      

      【讨论】:

      • 如果我错了请告诉我,但我认为这种语法会将 CSS 类添加到输入文本中。我的问题是将 CSS 类分配给它的标签。
      • 啊不抱歉,早上我的错误。自定义表单时,您将无法轻松做到这一点。对于表单框架,您开始变得有点太复杂了。这种事情应该在视图/动作中处理。
      【解决方案4】:

      如果您想将 CSS 添加到标签 - 特别是呈现标签的方法,您可以尝试覆盖小部件类。然后你可以做类似的事情

      $foo = new myWidgetFormInputText(array("myCSSClass" => $fixture->getCSS()));
      

      然后在您的小部件中覆盖您的 renderLabel() 方法或类似方法。您的小部件将有权访问您传入的选项 - 在上面的示例中,myCSSClass 是选项键。然后,您可以将此类值应用于小部件的标签。

      【讨论】:

      • 小部件没有 renderLabel 方法,它们在表单字段上。 symfony-project.org/api/1_2/sfFormField 在动作/视图中更简单的情况下,有很多非常笨拙的东西才能让它工作
      【解决方案5】:

      比这容易得多。只需将 CSS 应用于标签的标签...

      label[for=payment_cardNumber]
      {
          margin-top: 20px;
          color: red;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 2023-03-17
        • 2018-12-29
        • 2014-01-08
        • 2014-04-26
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多