8

symfony2 には 3 つのフォーム タイプがあります。

次のすべてのコレクションの親である FaultType

<?php

namespace My\FaultBundle\Form;

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

class FaultType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    { 
        $builder
                ->add('title')
                ->add('steps', 'collection', array(
                    'type' => new StepType(),
                    'allow_add' => true,
                    'prototype' => true,
                    'by_reference' => false,
                ))
                ->add('created')
                ->add('updated')
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Fault'
        );
    }

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

}

ステップタイプ:

<?php

namespace My\FaultBundle\Form;

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

class StepType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('body')
            ->add('photos', 'collection', array(
                'type' => new PhotoType(),
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'by_reference' => false,
            ))
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Step'
        );
    }

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

そして最後の PhotoType:

<?php

namespace My\FaultBundle\Form;

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

class PhotoType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('description')
            ->add('filename')
        ;
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'My\FaultBundle\Entity\Photo'
        );
    }

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

プロトタイプに関する優れた記事のリンクを見つけました。1 つのネストされたフォーム タイプは非常に優れていますが、これを 3 番目のネストを意味する PhotoType で動作させるには問題があります...障害...、この例でステップの写真を動的に追加/削除するにはどうすればよいですか...?

4

2 に答える 2

0

独自のプロトタイプを作成する必要があります。

2 つの解決策があります。

  1. a のすべての数字セグメントを正規表現で検索し、property_pathそれらをプレースホルダーに置き換えます

    $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches);
    
  2. 再帰を使用して最上位のコレクションの親を見つけ、そこから手動でパスを構築します。

アイテムを並べ替えてみましたか?これは完全な災害です;)

于 2012-05-31T11:06:31.453 に答える