Autor Wątek: Cała tabela danych w jednym formularzu  (Przeczytany 3515 razy)

solar2017

  • Newbie
  • *
  • Wiadomości: 7
    • Zobacz profil
Cała tabela danych w jednym formularzu
« dnia: Styczeń 09, 2018, 19:46:05 »
Witajcie

Nie wiem jak podejść do realizacji takiego formularza.
Mam tabelę w bazie - proste sprawozdanie - Imię nazwisko i parę pól z liczbami.
Mogę to wyświetlić ładnie w tabelce, mogę edytować w formularzu pojedynczy rekord z bazy - to ogarniam, nie ma problemu - działa.

Ale chciałem pobrać z bazy wszystkie rekordy (max około 100 sztuk) i wyświetlić je wszystkie w jednym formularzu w postaci tabeli - jeden wiersz - jeden rekord.
Chcę mieś możliwość edytowania wszystkich na raz - nie pojedynczo.
Do tego submit, tak żeby zapisać wszystkie do właściwych miejsc.

Zrobiłem formularz dla pojedynczego rekordu, i drugi - taki wrapper do którego chcę inkludować odpowiednią ilość tych pojedynczych. Próbowałem to z CollectionType, ale coś mi nie działa.
Może ktoś będzie w stanie podpowiedzieć w jakim kierunku podążać żeby to zrobić?

Poniżej trochę kodu:

Akcja w kontrolerze:
$spr = $repoSpr->getSprawozdanie(); <- tu dostaję tablicę z rekordami typu entity
$form = $this->createForm(SprawozdanieWrapperType::class, $spr);

SprawozdanieType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SprawozdanieType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('nazwiskoImie');
        $builder->add('wartość1');
        $builder->add('wartość2');
        $builder->add('wartość3');
    }
   
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Sprawozdanie',
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_sprawozdanie';
    }
}

SprawozdanieWrapperType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use AppBundle\Entity\Sprawozdanie;

class SprawozdanieWrapperType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('persons', CollectionType::class,array(
            'entry_type' => SprawozdanieType::class,
        ));

    }
   
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Sprawozdanie::class,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_sprawozdanie_wrapper';
    }
}

solar2017

  • Newbie
  • *
  • Wiadomości: 7
    • Zobacz profil
Odp: Cała tabela danych w jednym formularzu
« Odpowiedź #1 dnia: Kwiecień 26, 2018, 11:27:38 »
Problem solved :-)

Gdyby ktoś potrzebował podobnego rozwiązania podaję moje :-)

W przykładzie iteracja pętli ustawiona na sztywno

Kontroller
public function indexAction(Request $request)
{
        // przygotowanie danych dla formularza w tablicy
        $defaultData = Array();
        for($i=0; $i<3; $i++){
            $defaultData['name'.$i] = 'Name_'.$i;
            $defaultData['email'.$i] = 'email_'.$i.'@foo.com';
            $defaultData['message'.$i] = 'Message_'.$i;
        }

        // tworzenie formularza
        $form = $this->createFormBuilder($defaultData)
            ->add('send', SubmitType::class)
            ->getForm();
       
        for($i=0; $i<3; $i++){
        $form->add('name'.$i, TextType::class)
                ->add('email'.$i, EmailType::class)
                ->add('message'.$i, TextareaType::class);
        }

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // data to tablica z kluczami "name0", "email0", "message0","name1", "email1", "message1" itd.
            $data = $form->getData();
            dump($data);
            // teraz w pętli można pakować do obiektu i pchać do bazy
        }


        return $this->render('AppBundle:Sprawozdania:index_ver_'.$sprVer.'.html.twig', array(
            'form' => $form->createView(),
        ));
}

Szablon twig
    {{ form_start(form) }}
   
    {% for i in 0..2 %}
    {{ form_row(attribute(form, 'name' ~ i)) }}
    {{ form_row(attribute(form, 'email' ~ i)) }}
    {{ form_row(attribute(form, 'message' ~ i)) }}
    {% endfor %}
   
    {{ form_row(form.send) }}
   
    {{ form_errors(form) }}
    {{ form_end(form) }}
« Ostatnia zmiana: Kwiecień 26, 2018, 11:30:53 wysłana przez solar2017 »