2011-10-04 4 views
2

여러 개의 etape를 추가 할 수있는 양식을 만들고 싶습니다. 나는이 같은 형태를 만듭니다Symfony 2 양식, 필드 컬렉션이 표시되지 않습니다.

// FORM

namespace RBO\TryBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

use RBO\TryBundle\Entity\Try; 

class TryType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
    $builder->add('etapes', 'collection', array(
     'type' => new EtapeType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'prototype' => true, 
     'label' => 'Etapes' 
    )); 
    } 
    public function getName() 
{ 
    return 'try'; 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'RBO\TryBundle\Entity\Try', 
     'csrf_protection' => true, 
     'csrf_field_name' => '_token', 
     // a unique key to help generate the secret token 
     'intention'  => 'try_item', 
    ); 
} 
} 

// EtapeType

<?php 

namespace RBO\TryBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

use RBO\TryBundle\Entity\Etape; 

class EtapeType extends AbstractType { 

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('name', 'text'); 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'RBO\TryBundle\Entity\Etape', 
    ); 
} 

public function getName() 
{ 
    return 'etape'; 
} 

}

나뭇 가지 템플릿

는 // 표시

{{ form_row(form.etapes) }} 

실체가 올바른지 시험해보십시오. ArrayCollection 인 etape (생성자에서 정의 됨)

이 코드는 레이블을 기대하지 않습니다. 내가 뭐 놓친 거 없니?

미리

난 항상 임베디드 형태를 렌더링하는 form_widget을 사용했다

답변

3

하여 주셔서 감사합니다,하지만 난 form_row 너무 잘 작동합니다 생각합니다. 살펴 봐야 할 중요한 사항은 포함 된 양식 컨테이너에 "데이터 프로토 타입"속성이 있는지 여부입니다. 그런 다음 양식을 표시하는 페이지에 스크립트를 추가해야합니다. 제 경우에는 Mootools를 사용하지만,이 스크립트를 jQuery 또는 다른 자바 스크립트 프레임 워크로 쉽게 변환 할 수 있다고 생각합니다 :

이들은 내 js 파일의 내용입니다 (요소의 ID는 "XXX"로 대체해야 함). 여기서 "데이터 프로토 타입"속성은 다음과 같습니다.

window.addEvent('domready', function() { 
var add = function() { 
    var collectionHolder = $('XXX'); 
    var prototype = collectionHolder.getAttribute('data-prototype'); 
    form = prototype.replace(/\$\$name\$\$/g, collectionHolder.getChildren().length); 
    var cont = Elements.from(form); 
    collectionHolder.adopt(cont); 
} 
var remove = function() { 
    var collectionHolder = $('XXX'); 
    var child = collectionHolder.getLast(); 
    child.dispose(); 
} 
$$('a.add-link').addEvent('click', function(e){ 
    e.stop(); 
    add(); 
}); 
$$('a.remove-link').addEvent('click', function(e){ 
    e.stop(); 
    remove(); 
}); 

});

이 스크립트는 매우 간단하며 새 요소를 추가하거나 컬렉션의 마지막 요소를 제거합니다. 게다가, 당신은 추가를하기 위해보기에 일부 HTML을 추가해야합니다/링크를 제거 :

<ul class="actions"> 
<li> 
    <a href="#" class="add-link"> 
     Add 
    </a> 
</li> 
<li> 
    <a href="#" class="remove-link"> 
     Remove last 
    </a> 
    </li> 
</ul> 

을 내가 심포니 새로운 그리고 난 아직 배우는 중이에요,하지만 나를 위해 일한, 그것은 도움이되기를 바랍니다 :)

+0

실제로 텍스트 필드 이름이나 etapes는 표시되지 않습니다. 난 그냥 레이블이 있고 다른 건 없어요! 내가 추가하고 제거 버튼을 다루는 자바 스크립트 함수를 추가 할 필요가 있지만 그 후에 할 것입니다 읽었습니다! – user979276

1

가 나는 등의 방법으로 그것을 할 것이다 : 나는 나뭇 가지 템플릿을 사용하지 않기 때문에

{% for etape in form.etapes %} 
    {{ form_widget(etape.name) }} 
{% endfor %} 

내가 잘못 될 수 있습니다. 그러나이 아이디어는 나를 위해 php-templates에서 작용했습니다. PHP 템플릿에서

0

..

`<?php foreach ($form['etapes'] as $etapesField) : ?> 
<?php echo $view['form']->errors($etapesField) ?> 
<?php echo $view['form']->widget($etapesField) ?> 
<?php endforeach; ?>` 
0

좋아, 두 가지 : - :

{{ form_row(form) }} 

템플릿 시스템은

1 나뭇 가지 템플릿 양식을 표시하는 일반적인 방법 계단식 (영어로는 유감스럽게 생각할 수 있음)으로 양식의 모든 하위 필드가 캡슐화 된 양식과 함께 렌더링됩니다. 따라서 form.etapes을 호출하여 직접 자식을 렌더링 할 필요가 없습니다.

2 - 귀하의 문제는 실제로 instanciation에 있다고 믿습니다.

$form = $this->createForm(new TryType())); 

심지어 그 방법 :

$model = new Try(); 
    $model->setEtapes(array()); 

    $form = $this->createForm(new TryType(), $model)); 

그리고 바로 표시 Etape 필드의 수가에 의존하기 때문에 양식이 아무것도 렌더링 없다는 것을 정상입니다 당신은 당신의 양식을 그런 식으로 작성하는 경우 모델을 제공하는 Etape 인스턴스의 양. 빈 배열을 제공하면 Etape 필드가 렌더링되지 않습니다. 당신이 그것을 표시하는 빈 하나의 필드를 가지고해야 할 것은 :

$model = new Try(); 
    $model->setEtapes(array(new Etape())); // Empty Etape 

    $form = $this->createForm(new TryType(), $model)); 

당신이 컬렉션 타입으로 원하는대로 당신은 thusly 히 많은 필드를 추가 할 수 있습니다 :

$model = new Try(); 
    $model->setEtapes(array(
     new Etape('Étape 1'), 
     new Etape('Étape 2'), 
     ... 
    )); 

    $form = $this->createForm(new TryType(), $model)); 
0

것은 당신이 하위를 사용하고 있기 때문에 - 양식, 이렇게;

$builder 
    ->add(
     'etapes', 
     'collection', 
     array(
      'type'   => new EtapeType(), 
      'allow_add'  => true, 
      'allow_delete' => true, 
     ) 
    ) 
    ->getForm() 
; 

그리고 어떻게 나뭇 가지에 표시 할지가 중요하지 않습니다. 그것은 당신이 원하는 것에 달려 있습니다. form_row, form_widget 모두 제대로 작동해야합니다.

관련 문제