Symfony 2 formularze

Symfony 2 formularze
ajgoron
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Rzeszów
  • Postów:91
0

Cześć wszystkim!

Opis sytuacyjny:

piszę sobie formularz kontaktowy, zawiera on pola: imię, nazwisko, temat (wiadomości), email, treść oraz pole "chcę otrzymać duplikat". Oczywiście jeszcze "wyślij". Aby to zrobić napisałem encję "Enquiery", kod:

Kopiuj
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Enquiry
 *
 * @ORM\Table(name="enquiry")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\EnquiryRepository")
 */
class Enquiry
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=20)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="lastName", type="string", length=30)
     */
    private $lastName;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=50)
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="subject", type="string", length=50)
     */
    private $subject;

    /**
     * @var string
     *
     * @ORM\Column(name="body", type="text")
     */
    private $body;

    /**
     * @var bool
     *
     * @ORM\Column(name="sendCopy", type="boolean")
     */
    private $sendCopy;

    //dalej settery i gettery

Następnie napisałem klasę formularza EnquieryType(), kod:

Kopiuj
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EnquiryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('lastName')
            ->add('subject')
            ->add('email')
            ->add('body')
            ->add('copySend')
            ->add('send', SubmitType::class)
            ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Enquiry',
        ));
    }

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

Potem używam sobie mojego formularza w kontrolerze:

Kopiuj
/**
     * @Route("/kontakt", name="contact")
     */
    public function contactAction(Request $request)
    {
        $enquiry = new Enquiry();
        $form = $this->createForm(new EnquiryType(), $enquiry);
        $form->getForm();

        return $this->render('Website/contact.html.twig', array(
            'form' => $form->createView()
        ));
    }

Wg tego co wyrzuca wyjątek nie można załadować typu formularza:
Could not load type "AppBundle\Form\Type\EnquiryType"

Stack trace:
1.in vendor/symfony/symfony/src/Symfony/Component/Form/FormRegistry.php at line 87

Kopiuj
if (class_exists($name) && in_array('Symfony\Component\Form\FormTypeInterface', class_implements($name))) {
                    $type = new $name();
                } else {
                    throw new InvalidArgumentException(sprintf('Could not load type "%s"', $name));
                }
            }
Kopiuj
2. at FormRegistry ->getType ('AppBundle\Form\Type\EnquiryType') 
in vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php at line 67 

3. at FormFactory ->createBuilder ('AppBundle\Form\Type\EnquiryType', object(Enquiry), array()) 
in vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php at line 39

4. at FormFactory ->create ('AppBundle\Form\Type\EnquiryType', object(Enquiry), array()) 
in vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php at line 285

5. at Controller ->createForm ('AppBundle\Form\Type\EnquiryType', object(Enquiry)) 
in src/AppBundle/Controller/WebsiteController.php at line 69

W stack trace nr 5 widać, że chodzi o moment tworzenia formularza w kontrolerze:

Kopiuj
 $form = $this->createForm(new EnquiryType(), $enquiry);

Nie wiem za bardzo co teraz zrobić. Przeglądam google od jakiegoś czasu, może ktoś naprowadzi?
Pozdrawiam


"Jedna robótka - miesiąc wódka" - Ojciec Pijo
edytowany 2x, ostatnio: dzek69
Cornellia
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:39
0

A dopisałeś w kontrolerze use AppBundle\Form\Type\EnquiryType ?

ajgoron
Tak, dopisane mam. :) Masz może jakiś pomysł?
GU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Wroclaw
  • Postów:172
0

Nie wiem czy wiesz ale mozesz robic formy bez encji:

http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class

ajgoron
Wybacz głupie pytanie, kiedy lepiej użyć formularza bez klasy a kiedy z klasą? Czy po prostu jak sam wolę?
GU
Bardzo dobre pytanie, generalnie lepiej jest podawać model i dalej obrabiać dane używając jego obiektu. Myślę, że wyjątkiem są jedynie formularze ktore pobierają jakieś proste dane które nie wymagają dalszego przetwarzania. Klasyczne przypadki prosty formularz kontaktowy lub prosty formularz wyszukiwania.
ajgoron
Ja wykorzystałem encje dlatego, że adres email, imie i nazwisko chcę zachowywać w bazie. Do przyszłego użytku żeby rozsyłać oferty itp. Muszę wtedy o tym informować w formularzu? Że zachowuję te dane?
ajgoron
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Rzeszów
  • Postów:91
0

Okej, doszedłem do rozwiązania problemu. Pierwszy argument w metodzie "createForm" musi być stringiem. A ja przekazywałem cały nowy obiekt (new EnquiryType). Nie bez przyczyny w klasie EnquiryType należy napisać metodę getName, która zwraca nazwę encji odwzorowującej dane w formularzu. W mojej klasie EnquiryType metoda ta wygląda następująco:

Kopiuj
    public function getName()
    {
        return 'enquiry';
    }

Więc żeby prawidłowo utworzyć formularz w kontrolerze w akcji robimy tak:

Kopiuj
    $enquiry = new Enquiry();

    $form = $this->createForm(EnquiryType::class, $enquiry);        //tu jest zmiana, było new EnquiryType() a teraz jest EnquiryType::class
    $form->handleRequest($request);

Problem rozwiązany.
Dzięki wszystkim za udział w dyskusji i pomoc.


"Jedna robótka - miesiąc wódka" - Ojciec Pijo

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.