【问题标题】:Symfony2 form type customizationSymfony2 表单类型自定义
【发布时间】:2012-12-21 05:14:21
【问题描述】:

我需要这方面的帮助,因为即使在阅读和检查了我在互联网上找到的所有资源后,我自己也无法弄清楚。

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

  1. 身份证
  2. 位置
  3. thumb_location

我有自定义的 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')
        ;
}

因此,它会获取任何文章未使用的所有图像并用它们填充表单。使用这些选项,我得到单选按钮,如下所示:

<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>

我现在想要的是所有单选按钮都具有自定义 html5 数据属性 data-thumb="thumbnail/location.png",这将是该单选按钮表示的图像对象的 thumb_location 属性值。

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

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

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

【问题讨论】:

  • Symfony2 食谱有一篇关于how to create a custom form field type 的文章。
  • 正如我所说,我已经阅读了它,但我仍然不明白。我真的不觉得它很广泛,或者我太愚蠢了,无法得到明显的东西......我什至开始检查 Symfony 的源代码,我看到他们在 Forms 组件内部使用 PHP 模板,而我使用 Twig .
  • 我没有发现任何尝试构建自定义表单字段类型的迹象,如代码示例中该文章中所述。您何不再试一次,问问您在这样做时遇到的具体问题?

标签: forms symfony entity


【解决方案1】:

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

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

你可以设置这个选项是否在 ->add(x, x, array('thumb_location' => 'location')) (或在 setDefaultOptions 方法中)。

但现在我不敢说实话。因为你需要像这样在视图中设置:

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

这意味着你再次手工制作&lt;input data...

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

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

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

【讨论】:

    【解决方案2】:

    不确定我是否理解这个问题,您想直接在表单构建器中设置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') }} />
    

    【讨论】:

    • 是的,就是这样,但我不需要它在那个字段类型中,我需要它在 CHILD 字段类型中。 ImageSelectType 是一种创建单选按钮的“实体”类型表单。我需要在其中设置单选按钮以将缩略图位置存储为属性。我试过这个:pastebin.com/RRfBtqE7 按照你的建议,但没有任何变化。
    • 澄清一下,这是我在 HTML 中得到的以及我想要得到的。 pastebin.com/LGSespKv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多