私はまだ、カテゴリのネストされたツリー フォームの出力と送信に関する小さな課題に取り組んでいます。
そして、私は最初にレンダリング部分を見つけようとしています(JSと移入の前に)。
私は一般的な形をしています:
カテゴリフォーム
class CategoryForm extends AbstractType
{
private $em;
public function __construct($em) {
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$transformer = new CategoryToChoiceTransformer($this->em);
$builder->add(
$builder->create('categories', 'collection',
array(
'type' => new CategoryCollectionType($this->em)
)
)->addModelTransformer($transformer));
$builder->add('save', 'submit');
}
public function getDefaultOptions(array $options)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\DemoBundle\Entity\Item',
));
}
public function getName()
{
return 'category';
}
}
私は CategoryToChoiceTransformer を持っています:
CategoryToChoiceTransformer
class CategoryToChoiceTransformer implements DataTransformerInterface
{
/**
* @var ObjectManager
*/
private $om;
/**
* @param ObjectManager $om
*/
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function transform($categories)
{
$categoriesExpanded = new ArrayCollection();
if (!empty($categories)) {
$categoryRepository = $this->om->getRepository('AcmeDemoBundle:Category');
foreach ($categories as $category) {
$path = new ArrayCollection($categoryRepository->getPath($category));
$categoriesExpanded->add($path);
}
}
return $categoriesExpanded;
}
public function reverseTransform($categoryList)
{
...
}
}
そして、カスタムタイプ(親フォームで使用)があります:
カテゴリ コレクション タイプ
class CategoryCollectionType extends AbstractType
{
private $em;
public function __construct($em) {
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('name', 'entity', array(
'class' => 'AcmeDemoBundle:Category',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.id', 'ASC');
},
'property' => 'name',
'empty_value' => _('Choose Category')
));
}
public function getName()
{
return 'category_collection_type';
}
}
しかし、私が得たものは次のとおりです。
しかし、最初のグループに 3 つの選択ボックスが表示され、2 番目のグループに 3 つの選択ボックスが表示されることが予想されます (データ トランスフォーマーは以下からデータを変換します)。
array(
[0] = >ObjectCategory#...,
[1] => ObjectCategory#...
)
に
array(
[0] => array( ObjectCategory#..., ObjectCategory#..., ObjectCategory#..., ),
[1] => array( ObjectCategory#..., ObjectCategory#..., ObjectCategory#..., )
)
私の間違いはどこですか?
CategoryCollectionType でコレクション型を作成する必要があると考えました。
カテゴリ コレクション タイプ
...
$builder->add('categories', 'collection', array(
'type' => 'entity',
'allow_add' => true,
'allow_delete' => true,
'prototype' => false,
'show_legend' => true,
'widget_add_btn' => array('label' => _('Add category')),
'options' => array(
'widget_control_group' => false,
'label_render' => false,
'show_legend' => false,
'class' => 'AcmeDemoBundle:Category',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.id', 'ASC');
},
'property' => 'name',
'empty_value' => _('Choose Category'),
),
)
);
しかし、それは役に立ちません...何かアイデアはありますか?
PS> 回答する場合は、このスレッドをフォローしてください :)