Hi,
wir würden gerne Symfony Form und Twig verwenden, um im Frontend Formulare zu generieren. Unter Verwendung von Entity und Repository. Das Script läuft soweit, dass die Form ausgegeben wird, aber beim Submit meldet Contao, dass das Token nicht stimmt. Wie kann man in die Form das Request Token von Contao richtig integrieren?
PHP-Code:
<?php
namespace App\Controller\FrontendModule;
use App\Entity\Produkt;
use App\Form\Type\ProduktType;
use App\Repository\ProduktRepository;
use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
use Contao\CoreBundle\Exception\RedirectResponseException;
use Contao\CoreBundle\ServiceAnnotation\FrontendModule;
use Contao\ModuleModel;
use Contao\PageModel;
use Contao\Template;
use Doctrine\DBAL\Connection;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
/**
* @FrontendModule(category="miscellaneous")
*/
class MyFrontendModuleController extends AbstractFrontendModuleController
{
/**
* @var ManagerRegistry
*/
private $managerRegistry;
/**
* @var FormFactoryInterface
*/
private $formFactory;
/**
* @var CsrfTokenManagerInterface
*/
private $csrfTokenManager;
public function __construct(ManagerRegistry $managerRegistry, FormFactoryInterface $formFactory, CsrfTokenManagerInterface $csrfTokenManager) {
$this->managerRegistry = $managerRegistry;
$this->formFactory = $formFactory;
$this->csrfTokenManager = $csrfTokenManager;
}
protected function getResponse(Template $template, ModuleModel $model, Request $request): Response {
$entityManager = $this->managerRegistry->getManager();
// if ($request->isMethod('post')) {
// echo "<span style='color: red'><br>TEST :: " . basename(__FILE__) . " " . __LINE__ . " -> </span>";
// if (null !== ($redirectPage = PageModel::findByPk($model->jumpTo))) {
// throw new RedirectResponseException($redirectPage->getAbsoluteUrl());
// }
// }
$form = $this->formFactory->createBuilder(ProduktType::class)->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$Produkt = $form->getData();
$entityManager->persist($Produkt);
$entityManager->flush();
return $this->redirect($request->getUri());
}
$template->form = $form->createView();
$template->action = $request->getUri();
return $this->renderForm('base.html.twig', [
'form' => $form
]);
return $template->getResponse();
}
}
Twig template
PHP-Code:
{{ form(form) }}
PHP-Code:
<?php
namespace App\Form\Type;
use App\Entity\Produkt;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
class ProduktType extends AbstractType
{
/**
* @var CsrfTokenManagerInterface
*/
private $csrfTokenManager;
public function __construct(CsrfTokenManagerInterface $csrfTokenManager) {
$this->csrfTokenManager = $csrfTokenManager;
}
public function configureOptions(OptionsResolver $resolver) {
parent::configureOptions($resolver); // TODO: Change the autogenerated stub
$resolver->setDefaults([
'data_class' => Produkt::class,
'csrf_field_name' => 'REQUEST_TOKEN',
'csrf_token_id' => $this->csrfTokenManager->getToken('REQUEST_TOKEN')
]);
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('name', TextType::class)
->add('strasse', TextType::class)
->add('save', SubmitType::class)
;
}
}
Lesezeichen