Symfony - 添加并保留额外的字段

时间:2016-09-14 17:29:29

标签: php symfony symfony-forms

我有一个ChoiceType :: Type字段,显示一些选项,我想为每个选项添加一个输入来为其添加价格。我是这样做的:

->add('product_price', ChoiceType::class, array(
    'choices' => array(
       "Product 1",
       "Product 2",
    ),
)

为每个选项添加输入的JS:

var productBoxes = $("[id^=product_]");
// Listen the checkbox to display or hide the prices inputs
productBoxes.each(function (index) {
    var priceField = '<label class="control-label required" for="product_price_' + index + '">Capacité</label>' +
        '<input type="text" id="product_price_' + index + '"  name="product[price][]" class="form-control">';
    $(this).click(function () {
        if ($(this).is(':checked')) {
            $(this).parent().append(priceField);
        } 
    })
})

javascript工作,它会在每个选项旁边添加字段。现在我想将数据发送到数组中,如下所示: [&#34;产品1&#34; =&GT; &#34;附加字段的值&#34;]

但我不知道如何获取额外数据并将其保存到数据库中。

有人知道怎么做吗?

编辑1 我试图用CollectionType来做,但是没有找到如何将每个CollectionType元素渲染为复选框。有没有办法这样做?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

在您的示例中,最简单的方法是向表单添加两个字段。用CSS隐藏它们(显示:无),然后用JS显示它们(当选择取消/选择时,切换类“隐藏”)

->add('product_one_price', NumberType::class, array(
    'attr' => array('class' => 'hidden')
))
->add('product_two_price', NumberType::class, array(
    'attr' => array('class' => 'hidden')
))

另一种方法是拥有嵌套表单,或者动态构建表单,这可能会或可能不会过度,具体取决于你实际在做什么

答案 1 :(得分:1)

我认为更好的方法是创建自定义类型并在那里设置其他字段。

例如:

您的主要表单类型:

$builder->add('product_price', CollectionType::class, array(
    'label' => 'Prices',
    'entry_type'    => ProductPriceType::class
));

和ProductPriceType:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('product', TextType::class, array())
        ->add('price', NumericType::class, array());
}


/**
 * @param OptionsResolver @resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\SomeEntity'
    ));
}

我认为你从基地获得产品数据。 在这种情况下,您将获得包含2个值的数组 - 产品和价格

答案 2 :(得分:0)

也许我错了,但我认为你应该深入研究ChoiceType类。

使用基本的ChoiceType时,Symfony文档说:

  

choices选项是一个数组,其中数组键是项的标签,数组值是项的值

如果我正确理解你的情况,你需要一些非常具体的东西,比如这种选择:

ggplot(data=dat, aes(x=group, y=value, fill=factor(day))) +
    geom_bar(stat="identity", position="identity")+
    geom_text(label =round(value,0),color = "black")+
    scale_y_continuous(breaks=c(-80,-40,0))

我无法确切地告诉你要覆盖哪个课程,但最好的选择是看看:

  • ChoiceListFactory类
  • ChoiceList类(ChoiceType使用子类SimpleChoiceList)
  • ChoiceToValuesTransformer

我有两个问题:

  • 存储标签和价格的数据模型是什么?

  • 这个清单是什么?如果你挖掘表单组件太复杂了,也许你应该分两步拆分你的过程:

    1. 定义产品价格的一种表单
    2. 选择您感兴趣的产品的一种表格