Symfony 2 formularze

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:

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:

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:

/**
     * @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

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));
                }
            }
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:

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

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

0

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

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

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:

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

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

    $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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1