2012-12-13 13 views
5

Zmieniono mój post na podobny do Symfony Cookbook i dodano trochę kodu.Najlepszy sposób na obsługę dużej kolekcji formularzy w Symfony2

http://symfony.com/doc/current/cookbook/form/form_collections.html

Należy zauważyć, że jednostki/kod formularza umieszczonego w części jest taka sama, jak w dokumencie połączonego powyżej.

Mam jednostkę "Zadania", która jest połączona z jednostką "Tag". Aby zachować prostotę, "Zadanie" ma jedno pole "opis", a "znacznik" ma jedno pole "nazwa" .A "Tag" jest powiązany z jednym "Zadanie", a "Zadanie" jest powiązane z wieloma "Znacznikami".

Podmiot:

class Task 
{ 
    protected $description; 
    protected $tags; 

    public function __construct() 
    { $this->tags = new ArrayCollection(); } 

    public function getDescription() 
    { return $this->description;} 

    public function setDescription($description) 
    { $this->description = $description; } 

    public function getTags() 
    { return $this->tags; } 

    public function setTags(ArrayCollection $tags) 
    { $this->tags = $tags; } 
} 

class Tag 
{ 
    public $name; 
} 

Obecnie używam zbiór „Tagi” w postaci „Zadanie”, aby edytować wszystkie je naraz, jak to opisano w Symfony Książka kucharska

Postać:

class TagType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\TaskBundle\Entity\Tag', 
     )); 
    } 

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


class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('description'); 

     $builder->add('tags', 'collection', array('type' => new TagType())); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\TaskBundle\Entity\Task', 
     )); 
    } 

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

Ale problem pojawia się, gdy tworzę kolekcję "Tags" la ponad tysiąc elementów. W tej chwili formularz ładuje się w sekundach i sekundach, a czasami zawiesza się z powodu pamięci.

$task = new Task(); 

$tag1 = new Tag(); 
$tag1->name = 'tag1'; 
$task->getTags()->add($tag1); 
$tag2 = new Tag(); 
$tag2->name = 'tag2'; 
$task->getTags()->add($tag2); 
//Create a couple thousand more item here ... 

//The script crashes here, when the form is being created 
$form = $this->createForm(new TaskType(), $task); 

Błąd nie pochodzi z Doctrine, który obsługuje bardzo dobrze całość, ale z formularza Symfony.

Czy to dobry pomysł, aby obsłużyć mój formularz przy użyciu wbudowanego systemu formularzy Symfony2 (z kolekcjami) w tym przypadku, czy powinienem obsługiwać go tak jak dawniej, z surowymi wejściami html i sprawdzaniem/zapisywaniem po stronie serwera ?

+0

Zamieść swój kod i jaką część dokumentów symfony masz na myśli? – Squazic

+0

Edytowałem mój wpis z linkiem do Symfony Cookbook o kolekcjach. Mój kod nie ma tutaj znaczenia, używam tylko kolekcji formularzy, jak opisano w pierwszej części linku (wszystkie encje "znaczników" są ładowane z moją jednostką "produkt"), kiedy robię "$ this-> createForm". – elwood

+0

Czy kiedykolwiek rozwiązałeś to? – jrjohnson

Odpowiedz

1

Zastanawiam się, czy twój problem nie ma nic wspólnego z częścią formularza, ale z nawodnieniem obiektów znacznika. Jeśli poprosisz doktrynę o nawodnienie mnóstwa przedmiotów, użyjesz dużej ilości pamięci. Możesz zajrzeć do innej metody nawadniania tagów, być może HYDRATE_ARRAY zamiast HYDRATE_OBJECT.

+0

Tak, myślę, że największą częścią problemu jest nawodnienie Doktryny. Czy można utworzyć/związać moją formę na podstawie istoty uwodnionej jako Tablica, a nie obiektu? Czy nadal będę mógł weryfikować podmioty/zapisywać je bez ręcznego kodowania wszystkiego? – elwood

+0

Ile tagów tu mówimy? Jestem w stanie szybko załadować 500 jednostek do wielu rozwiniętych obiektów używając normalnej metody. – Mike

+0

Edytował mój post z więcej informacji. Problem nie pochodzi z Doctrine, ale z Symfony $ this-> createForm() methods with Collections. – elwood

Powiązane problemy