2016-09-14 4 views
0

У меня есть поле ChoiceType :: Type, которое отображает некоторые варианты, и я хочу добавить для каждого выбора вход для добавления цены на него. Я сделал это так:Symfony - добавление и сохранение дополнительных полей

->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 работает, это добавить поля рядом друг выбор. Теперь я хочу отправить свои данные в массив, например: [«Продукт 1» => «значение приложенного поля»]

Но я не знаю, как получить эти дополнительные данные и сохранить их в базы данных.

Кто-нибудь знает, как это сделать?

EDIT 1 Я пытался сделать это с CollectionType, но не узнать, как сделать каждый элемент CollectionType как флажок. Есть ли способ сделать это таким образом?

Благодарим за помощь!

ответ

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 значения - продукт и цену

+0

Yup, я так пробовал, но не узнал, как 1. Render CollectionType как флажки. 2. Добавьте ценовой ввод на выбор продукта. Есть ли способ сделать это? – Boulboulouboule

+1

Вы можете добавить поле флажка в ProductPriceType. Он будет выглядеть как флажок для каждой записи продукта. А затем сохраните элемент массива, который установил флажок – Victor

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

Альтернативой будет иметь вложенные формы, или построить форма, которая может или не может быть переполнена, в зависимости от того, что вы на самом деле делаете.

+0

Спасибо за ваш ответ! Но таким образом мне нужно 1 поле на продукт и 1 поле за цену в моей таблице. Мне этого не надо. Вложенная форма - это решение, но я действительно 1 флажок для каждого продукта и 1 поле за флажок.! Можно ли это сделать с помощью CollectionType? – Boulboulouboule

0

Возможно, я ошибаюсь, но я думаю, что вы должны копаться в классе ChoiceType.

При использовании основной ChoiceType, Symfony документы говорит:

Опция выбора является массивом, где ключ массива является метка элемента и значение массива значение этого элемента

Если Я правильно понимаю ваше дело, вы хотите что-то очень конкретное, например, такие варианты:

$choices = [ 
    'item_label' => [ 
      'value' => 'item_value', 
      'price' => 'item_price' 
    ], 
    'item_label2' => [ 
      'value' => 'item_value2', 
      'price' => 'item_price2' 
    ], 
    ... 
] 

Я не могу точно сказать, какой класс verride, но вам лучше всего будет смотреть на:

  • ChoiceListFactory класса
  • класса Список выбора (ChoiceType использует класс ребенка SimpleChoiceList)
  • ChoiceToValuesTransformer

У меня есть два вопроса:

  • Что такое модель данных для хранения этикетки и цены?

  • Для чего предназначен этот список? Если это слишком сложно для вас, чтобы вырыть в компонентах Form, может быть, вы должны разделить ваш процесс на два этапа:

    1. Одна форма, чтобы определить ваши цены для вашего продукта
    2. Одна из форм, чтобы выбрать интересующую Вас продукцию в

 Смежные вопросы

  • Нет связанных вопросов^_^