2016-09-19 2 views
1

私の連絡フォームを処理するのに問題がありますが、単純なものです。私はコードに何が間違っているのか理解しようと多くの時間を費やしましたが、方法を見つけることができませんでした。私のオブジェクトはデータを受け取っていません。Symfony2フォーム処理

params [null、null、null]で 'INSERT INTO連絡先(電子メール、名前、メッセージ、日付)VALUES(?、?、?、?)'を実行中に例外が発生しました。ヌル、 "2016年9月19日0時08分48秒"]:

SQLSTATE [23000]:整合性制約違反:[メール] 1048カラムは以下

nullにすることはできませんが、私のコードです:

<form action="{{ path('ap_platform_contact') }}" method="POST" class="marginBottom25px" id="contact"> 
    <div class="row"> 
     <div class="col-md-6"> 
      <div class="form-group"> 
       <label for="exampleInputEmail1">Email</label> 
       <input type="email" name="email" class="form-control" id="exampleInputEmail1" placeholder="Votre email"> 
       {{ form_errors(form.email) }} 
      </div> 
     </div> 
     <div class="col-md-6"> 
      <div class="form-group"> 
       <label for="exampleInputPassword1">Nom </label> 
       <input type="text" name="name" class="form-control" id="exampleInputPassword1" placeholder="Votre nom ou celui de votre société"> 
       {{ form_errors(form.name) }} 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="exampleInputEmail1">Message</label> 
     <textarea id="exampleInputEmail1" class="form-control" name="message" rows="3"></textarea> 
     {{ form_errors(form.message) }} 
    </div> 
    <!-- 
    <div class="form-group"> 
     <div class="g-recaptcha" data-sitekey="6LdICQcUAAAAAMKjB3Cet82jKHwb_4S-ms8Wz-iE"></div> 
    </div> 
    --> 
    <div class="form-group"> 
     <button type="submit" class="btn tf-btn btn-success">{{ 'Envoyer'|trans }}</button> 
    </div> 
</form> 

コントローラ:

public function contactAction(Request $request) 
{ 
    // Retrieving POST data 
    //$postData = $request->request->get('email'); 

    $contact = new Contact(); 

    $form = $this->createForm(new ContactType(), $contact); 

    if ($form->handleRequest($request)) { 

     /*if ($this->get('ap_platform.antispam')->isSpam($contact->getMessage())) { 
      throw new \Exception('The field email is either empty or its content is too short'); 
     }*/ 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($contact); 
     $em->flush(); 

     //var_dump($contact->getEmail());exit; 

     $request->getSession()->getFlashBag()->add('notice', 'Votre message a été envoyé !'); 

     $mailer = $this->get('mailer'); 

     $message = \Swift_Message::newInstance() 
      ->setSubject('Message venant du formulaire de contact de chyqat.com') 
      ->setFrom('[email protected]') 
      ->setTo('[email protected]') 
      ->setBody("Nouveau message provenant de ".$contact->getName()."<br> Adresse Email : <strong>".$contact->getEmail()."</strong> <br>Son message:<br> <i>".$contact->getMessage()."</i>") 
     ; 

     $mailer->send($message); 
    } 

    return $this->render("APPlatformBundle:Public:contact.html.twig", array(
     'form' => $form->createView() 
    )); 
} 

ContactType.phpファイル:

class ContactType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('email',  'email') 
      ->add('message',  'textarea') 
      ->add('name',  'text') 
     ; 
    } 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Advertproject\PlatformBundle\Entity\Contact' 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'advertproject_platformbundle_contact'; 
} 
} 

Contactオブジェクト:

<?php 
/** 
* Created by PhpStorm. 
* User: Patrick 
* Date: 11/30/15 
* Time: 11:58 AM 
*/ 

namespace Advertproject\PlatformBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Security\Core\Tests\Validator\Constraints as PasswordValidation; 



/** 
* 
* Class Contact 
* @ORM\Table(name="contact") 
* @package Advertproject\PlatformBundle\Entity 
* @ORM\Entity() 
*/ 
class Contact 
{ 
    /** 
    * @var integer 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="email", type="string", length=100) 
    *@Assert\NotBlank(message="Veuillez fournir une adresse email") 
    * @Assert\Length(max=100) 
    */ 
    protected $email; 

    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @ORM\Column(name="name", type="string", length=100) 
    */ 
    protected $name; 

    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @Assert\Length(max=1000) 
    * @ORM\Column(name="message", type="string") 
    */ 
    protected $message; 

    /** 
    * @var \DateTime 
    * @ORM\Column(name="date", type="datetime") 
    */ 
    protected $date; 

    public function __construct() 
    { 
     $this->date = new \Datetime(); 
    } 

    /** 
    * Set email 
    * @Assert\NotBlank() 
    * @param string $email 
    * @return Contact 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    /** 
    * Get email 
    * 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * @return Contact 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Set message 
    * 
    * @param string $message 
    * @return Contact 
    */ 
    public function setMessage($message) 
    { 
     $this->message = $message; 

     return $this; 
    } 

    /** 
    * Get message 
    * 
    * @return string 
    */ 
    public function getMessage() 
    { 
     return $this->message; 
    } 

    /** 
    * Set date 
    * 
    * @param \DateTime $date 
    * @return Contact 
    */ 
    public function setDate($date) 
    { 
     $this->date = $date; 

     return $this; 
    } 

    /** 
    * Get date 
    * 
    * @return \DateTime 
    */ 
    public function getDate() 
    { 
     return $this->date; 
    } 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

は、誰もが私のコードが間違っているものを見つけるのを手伝ってくれるか? => NULL:以下

は私が

オブジェクト(Advertproject \ PlatformBundle \エンティティ\連絡先)#1955(5){[保護された "ID"]フラッシュ()メソッドを呼び出す前にvar_dump($form->getData())を実行した後に得たものです["email":protected] => NULL ["name":保護された] => NULL ["メッセージ":保護された] => NULL ["日付":保護された] =>オブジェクト(DateTime)#1956(3){[ "timezone"] => string(13) "Europe/London"} "timezone_type"] => string(26) "2016-09-18 20:49:32.000000" }

+0

「連絡先」または「__construct」機能のみにセッターがありますか? – pazulx

+0

@pazulxあなたはその質問をするのは正しいですから、私の連絡先オブジェクトの完全なコードを含むように投稿を編集しました。しかし、あなたが見ることができるように、私はすべてのセッターが適切に値をContact属性に割り当てるように書いています。 –

+0

Yogeshが指摘しているように、フォームhtmlに正しいフォーム名を実際に使用する必要があります。 – Yoshi

答えて

3

html.twigページで次のコードを使用してください。

 <div class="panel-body"> 
     {{ form_start(form) }} 
     {{ form_errors(form) }} 
     {{ form_widget(form) }} 
     {{ form_end(form) }} 
    </div> 

チェックの後にSymfony Documentationにフォームをレンダリングする方法があります。

+0

あなたの答えをありがとう。問題はあなたの提案に従って解決されました –

2

実際、Togesh Patilの回答は不完全です。

私は、コードには二つの問題を参照してください。あなたはsymfonyのフォームが自動的に$requestから提出されたデータを取り込むことができるように、正しい入力名を提供する必要があるフォームを使用している場合

  1. テンプレート

    を。あなたがデフォルトにform_widget()小枝ヘルパーを使用したくない場合は、単に各入力の名前をつかむことができますし、あなたが望むようにそれらをレンダリング:

    <input type="email" name="{{ form.name.vars.full_name }}" class="..."> 
    

    はその後CSRFトークン(あなた避難所の場合」を含めることを忘れないでください)手動で無効にCSRFの保護をT:

    <input type="hidden" name="{{ form._token.vars.full_name }}" value="{{ form._token.vars.value }}"> 
    

    はところで、ヘルパーform_end(form)はあなたのためにトークン自動的にCSRFを印刷します。ContactType::class代わりのnew ContactType()を使用して

    $form = $this->createForm(ContactType::class, $contact); 
    $form->handleRequest($request); 
    
    if ($form->isSubmitted() && $form->isValid()) { 
        $contact = $form->getData(); 
        // persist and so on ... 
    } 
    

    注意:これは、あなたがhttp://symfony.com/doc/current/forms.html#handling-form-submissionsを参照してください、コントローラでフォームを検証する方法ではありません

    http://symfony.com/doc/current/form/csrf_protection.htmlhttp://symfony.com/doc/current/forms.html#rendering-the-form

  2. コントローラを参照してください。

    また、if ($form->handleRequest($request)) {の式は、が$thisを返すため、常にtrueです。 https://github.com/symfony/form/blob/master/Form.php#L486を参照してください。

+0

あなたの徹底的な答えをありがとう。私の問題は今解決されました –