一个永远无效的形式 - Symfony2


A form that is never valid - Symfony2

>我有一个类产品,我用于表单和数据库 - 它有 3 个日期字段,带有这个或类似的字段:

/**
 * @ORM'Column(name="`date`", type="date")
 * @Assert'NotBlank()
 * @Assert'Type("'Date")
 */

它还有3-4个其他字段,只有NotBlank(),一个没有任何约束和一个用于保存产品类别的字段(类别是数据库中的另一个类和表)。它看起来像这样:

/**
 * @ORM'ManyToOne(targetEntity="Categories")
 * @ORM'JoinColumn(name="categories_id", referencedColumnName="id")
 **/
private $categories;

这是我的函数:

public function addAction($id, Request $request)
{
    $em = $this->getDoctrine()->getEntityManager(); 
    $products = new Products();
    $products_form = $this->createForm(new ProductsType(), $products);  
    $category = $em->getRepository('AcmeMyBundle:Categories')->find($id);
    if($request->getMethod() == 'POST')
    {
        $products_form->bindRequest($request);
        if($products_form->isValid()) 
        {
            $products->setDomains($category); 
            $em->persist($products);
            $em->flush();
        }

最后它会重定向。问题是,即使我在表单中添加了正确的值,它也说它无效。要添加日期,只需在表单中写一个像"2012-08-09"这样的字符串。

当我发表评论时

if($products_form->isValid())

一切正常。

有什么建议吗?请帮忙!

编辑:

以下是产品类:

/**
 * @ORM'Entity
 * @ORM'Table(name="products")
 */
class Products
{
/**
 * @ORM'Id
 * @ORM'Column(type="integer")
 * @ORM'GeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @ORM'ManyToOne(targetEntity="Categories")
 * @ORM'JoinColumn(name="categories_id", referencedColumnName="id")
 **/
private $categories;
/**
 * @ORM'Column(name="`date`", type="date")
 * @Assert'NotBlank()
 * @Assert'Type("'Date")
 */
protected $date;
/**
 * @ORM'Column(name="`from`", type="date")
 * @Assert'NotBlank()
 * @Assert'Type("'Date")   
 */
protected $from;
/**
 * @ORM'Column(name="`to`", type="date")
 * @Assert'NotBlank()
 * @Assert'Type("'Date")
 */
protected $to;
/**
 * @ORM'Column(type="decimal", scale=2)
 * @Assert'NotBlank()
 */
protected $price;
/**
 * @ORM'Column(type="string", length=5)
 * @Assert'NotBlank()
 */
protected $currency;
/**
 * @ORM'Column(type="string", length=50)
 * @Assert'NotBlank()
 */
protected $paymentid;
/**
 * @ORM'Column(type="string", length=100, nullable=true)
 */
protected $notes;

在这里,我创建表单:

class ProductsType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('date', 'date', array(
        'widget' => 'single_text', 
        'format' => 'yyyy-MM-dd'));
    $builder->add('from', 'date', array(
        'widget' => 'single_text', 
        'format' => 'yyyy-MM-dd'));
    $builder->add('to', 'date', array(
        'widget' => 'single_text', 
        'format' => 'yyyy-MM-dd'));
    $builder->add('price', 'text');
    $builder->add('currency', 'choice', array(
        'choices' => array(
            'empty_value'=>'--- Choose ---', 'USD'=>'USD', 'HKD'=>'HKD', 'EUR'=>'EUR', 'BGN'=>'BGN')));
    $builder->add('paymentid', 'text');
    $builder->add('notes', 'text', array(
        'required'  => false));
}
public function getName()
{
    return 'payments';
}

我认为在您的表格中,请确保 csrf 令牌在那里。

在标签内的表单小部件的下面添加以下代码。

{{ form_widget(form._token) }}

希望这对你有帮助。

不确定这是否是问题所在,但您有一个错字:

$productss_form->bindRequest($request);

应该是

$products_form->bindRequest($request);

没有看到表单代码,我可以说:

  • 这个@Assert'Type("'Date")应该@Assert'Date
  • 确保在ProductsType类中设置了data_class选项