当前位置: 首页 > 知识库问答 >
问题:

Symfony2表单处理

裴鸿熙
2023-03-14

我在处理我的联系方式时遇到了麻烦,虽然是一个简单的联系方式。我花了很多时间试图找出我的代码出了什么问题,但一直没有找到解决办法。我的对象没有接收数据。我有以下例外情况:

执行INSERT INTO联系人(电子邮件、姓名、消息、日期)VALUES时发生异常 (?, ?, ?, ?)'用参数[null, null, null,"2016-09-19 00:08:48"]:

SQLSTATE[23000]:完整性约束冲突:1048列“电子邮件”不能为空

下面是我的代码:

 <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('chyqat@chyqat.com')
            ->setTo('patrickbassoukissa@yahoo.fr')
            ->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()
    ));
}

联系ype.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';
}
}

联系对象:

<?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;
    }
}

有人能帮我找出我的代码有什么问题吗?

下面是我运行var\u dump($form)后得到的结果-

对象(Advertproject\PlatformBundle\Entity\Contact)#1955(5){[“id”:受保护]=


共有2个答案

公冶元青
2023-03-14

事实上,托格什·帕蒂尔的答案是不完整的。

我发现代码有两个问题:

>

  • 模板

    使用表单时,您需要提供正确的输入名称,以便Symfony表单可以自动从$request获取提交的数据。如果您不想使用默认的form\u widget()Twig helpers,您只需获取每个输入的名称,并根据需要呈现它们:

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

    然后不要忘记包括CSRF令牌(如果您没有手动禁用CSRF保护):

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

    顺便说一句,助手form\u end(form)会自动为您打印CSRF令牌。看见http://symfony.com/doc/current/form/csrf_protection.html 和http://symfony.com/doc/current/forms.html#rendering-形式

    控制器

    这不是在控制器中验证表单的方式,请参见http://symfony.com/doc/current/forms.html#handling-提交表格:

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

    注意使用ContactType::class而不是newcontacttype()

    还要注意,表达式if($form-

  • 岳和泽
    2023-03-14

    您应该在html.twig页面中使用以下代码

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

    查看以下Symfony文档,了解更多呈现表单的方法。

     类似资料:
    • 我试图在Symfony2中创建一个表单,其中包含一个文本输入字段,该字段接受一个由6位数字组成的字符串,后跟一个破折号,后跟四位数字(例如123456-7890)。它确实可以工作,但我得到的HTML标记不一致,具体取决于我如何将字段添加到表单中。 这来自实体: 从表单定义中: 从树枝模板: 这就是浏览器源代码的样子——注意模式和maxlong属性: 我想使用我自己的标签,而不是默认的,所以我改变表

    • 只使用一个集合很好,但是我需要编辑外部窗体的原型,所以它为每一行呈现内部窗体的原型。 你知道我该怎么做吗?还有什么是最好的储蓄方式 编辑:现在我正在尝试呈现嵌套窗体的原型: 促销特征选择类型 第一级原型,工作很好。

    • 表单是让用户与我们的网页应用程序交互的基本元素。Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包。这个包使得定义表单和处理提交容易一些。 Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后)就是在 myapp.forms 包中定义一个表单。 # ourapp/forms.py

    • 基于文档:http://symfony.com/doc/2.8/form/dynamic_form_modific.html#form-events-submitted-data 我准备了动态生成表单。所有的工作都正常,但只有当我使用form添加新数据(/new)时,当我使用相同的form编辑现有数据时--不工作 “约会”的简单形式。它应该是这样工作的:用户选择客户机,然后第二个“选择”是填充正确

    • 我们已经看到,可以在URL规则中指定http方法。URL映射的函数接收到的表单数据可以以字典对象的形式收集,并将其转发给模板以在相应的网页上呈现它。 在以下示例中,URL => 呈现具有表单的网页(student.html)。填充的数据会提交到触发函数的URL => 中。 函数收集字典对象中中存在的表单数据,并将其发送给result.html 并显示出来。 该模板动态呈现表单数据的HTML表格。

    • 主要内容:在视图中使用表单在Django创建表单,类似于创建一个模型。 在这里,我们只需要从Django的类并继承此类属性表单字段。让我们在myapp文件夹中添加forms.py文件包含我们的应用程序的表单。我们将创建一个登录表单。 myapp/forms.py 由上可见,字段类型可以利用“widget”的参数到HTML渲染; 在我们的例子中,我们要隐藏密码,不会显示。在我们的例子中,想要隐藏密码而不用显示。 日期输入是D