Symfony2表单类型自定义

时间:2012-12-21 05:14:22

标签: forms symfony entity

我需要帮助,因为即使在阅读和检查我在互联网上找到的所有资源后,我也无法自己解决这个问题。

我有一个Image实体。它有3个映射属性。

  1. ID
  2. 位置
  3. thumb_location
  4. 我有自定义的ImageSelectType表单类型,它扩展了AbstractType:

    buildForm函数如下所示:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $em = $options['em'];
    
        $qb = $em->createQueryBuilder();
        $result = $qb->select('i')
                ->from('BloggerBlogBundle:Image', 'i')
                ->leftJoin('i.articles', 'a')
                ->where('a is NULL')
                ;
    
        $builder
            ->add('images', 'entity', array(
                    'class' => 'BloggerBlogBundle:Image',
                    'query_builder' => $result,
                                        'required' => true,
                                        'multiple' => false,
                                        'expanded' => true,
                )
            )
                            ->setAttribute('widget', 'imageSelect')
            ;
    }
    

    所以它需要任何文章都没有使用的所有图像,并用它们填充表单。通过这些选项,我得到了radiobuttons,如下所示:

    <div id="image_images">
        <input type="radio" id="image_images_67" name="image[images]" required="required" value="67"><label for="image_images_67" class="required">c5252b4ffc9c50540218e25be1353b33aaa4ee05.png</label>
        <input type="radio" id="image_images_68" name="image[images]" required="required" value="68"><label for="image_images_68" class="required">fcfc7d7d05d63b1f55dff8cbff0bedeb3c917dfc.jpeg</label>
    </div>
    

    我现在想要的是所有radiobuttons都有自定义的html5数据属性data-thumb="thumbnail/location.png",它是该radiobutton所代表的图像对象的thumb_location属性值。

    我希望我足够清楚。如果需要更多信息,我会提供。 我已经阅读了很多关于此的内容,但我认为我认为事情实际上更复杂。有一次,我只是想说'哦,忘掉它,我只是手动渲染'并使用:

    {% for choice in form.vars.choices %}
        <input type="radio" data-thumb="{{choice.thumb_location}}" />
    {% endfor %}
    

    但我真的想要使用这个惊人的框架所提供的良好实践....有时候对我来说似乎并不像他们应该那么明显。

2 个答案:

答案 0 :(得分:0)

不确定我是否理解了这个问题,您想直接在表单构建器中设置data-thumb,对吗?

因此表单构建器包含主要功能(http://api.symfony.com/2.0/Symfony/Component/Form/FormBuilder.html),包括setAttribute(string $name, string $value)方法。

您可以执行以下操作:

setAttribute('data-thumb', $yourvalue);

要在输入字段中应用这些属性,您需要在树枝模板中设置属性:

 <input type="radio" {{ block('widget_attributes') }} />

答案 1 :(得分:0)

啊,我认为这与FormType有关。所以在这种情况下,我看到了使用buildView方法设置变量的可能性。

 /**
 * {@inheritdoc}
 */
public function buildView(FormView $view, FormInterface $form, array $options)
{
     $view->vars['thumb'] = $options['thumb'];
}

您可以在 - &gt; add(x,x,array('thumb_location'=&gt;'location'))中设置此选项 (或在setDefaultOptions方法中)。

但现在我不确定是否诚实。因为您需要在视图中设置如下:

<input data-thumb="{{ thumb }}" type="radio" id="blog_article_image_17" name="blog_article[image]" required="required" value="17">

这意味着您再次手动制作<input data...

不确定您的情况是否可行,但我认为为无线电输入字段定义第二个FormType会很好:

public function buildForm(FormBuilderInterface $builder, array $options)
{
   ...this is your current form builder....

   ->add('radio', MyRadioType());
}