2016-09-14 2 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); 
     } 
    }) 
}) 

자바 스크립트 작품, 그것은 각 선택 옆에 필드를 추가합니다. 이제 다음과 같이 배열에 데이터를 보내려고합니다 : [ "Product 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' 
    )); 
} 

나는 당신이 기지에서 제품 데이터를 얻을 생각합니다. 이 경우 두 값 - 제품 및 가격이 포함 된 배열을 얻습니다.

+0

그래, 그랬 으면 좋겠지 만, 1. CollectionType을 체크 박스로 렌더링하는 방법을 찾지 못했습니다. 2. 제품 선택에 가격 입력을 추가하십시오. 그것을 할 수있는 방법이 있습니까? – Boulboulouboule

+1

ProductPriceType에 체크 박스 필드를 추가 할 수 있습니다. 각 제품 항목에 대한 확인란과 비슷할 것입니다. 체크 박스가 선택된 배열 항목을 저장합니다. – Victor

1

예제에서 가장 쉬운 방법은 폼에 두 개의 필드를 추가하는 것입니다. 그들 CSS (표시 : 없음) 숨겨진 유지하고, 단지 중첩 된 형태를 가지고, 또는 구축

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

의 대안이 될 것입니다 (선택이 얻을 때 UN/선택 토글 클래스 "숨겨진") JS로 보여 당신이 실제로하고있는 것에 따라 과도하거나 과장되지 않을 수도있는 폼 동적으로

+0

답장을 보내 주셔서 감사합니다. 그러나이 방법으로 제품 당 1 개의 필드가 필요하며 테이블에 가격 당 1 개의 필드가 필요합니다. 나는 그것을 원하지 않는다. 중첩 된 양식은 해결책이지만 제품 당 1 개의 확인란과 확인란 당 1 개의 필드 ..! CollectionType을 사용하면 이렇게 할 수 있습니까? – Boulboulouboule

0

아마도 내가 틀렸지 만 ChoiceType 클래스를 파헤쳐 야한다고 생각합니다.

기본 ChoiceType를 사용하여, 심포니 워드 프로세서는 말한다 :

선택 사항 옵션은 배열의 키는 항목의 레이블과 배열 값이 항목의 값

하는 경우입니다 배열입니다 나는 귀하의 사례를 정확하게 이해합니다. 귀하는 이런 종류의 선택과 같은 매우 구체적인 것을 원합니다 :

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

정확하게 어떤 종류의 것을 말할 수 있습니까? verride하지만 가장 좋은 건에 대해 살펴 가지고하는 것입니다 :

  • ChoiceList 클래스

    • ChoiceListFactory 클래스를
    • ChoiceToValuesTransformer

    나는 두 가지 질문을합니다 (ChoiceType 자식 클래스 SimpleChoiceList 사용) :

    • 레이블과 가격을 저장할 데이터 모델은 무엇입니까?

    • 이 목록은 무엇입니까? 제품 당신이 관심을 선택

    • 한 형태 제품에 대한 가격을 정의 할

      1. 한 형태 : 양식 구성 요소를 발굴하는 것이 너무 복잡하면, 어쩌면 당신은 두 단계로 프로세스를 분할한다 in