我的表单对象无法正常工作

时间:2016-02-02 14:55:58

标签: php forms symfony

我正在为一个复杂的表格系统工作......对我而言。我按照这里的说明操作: http://symfony.com/doc/2.6/cookbook/form/form_collections.html

我的第一堂课是(像Tag):

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints AS Assert;

class TipoPermessoFerie {

    protected $id;

    protected $nome;

    protected $descrizione;

    // permesso 'T' ferie 'F'
    protected $permesso;

    public function getId() {
        return $this->id;
    }

    public function setId($int) {
        $this->id = $int;
    }

    public function setNome($nome) {
        $this->nome = $nome;

        return $this;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setDescrizione($descrizione) {
        $this->descrizione = $descrizione;

        return $this;
    }

    public function getDescrizione() {
        return $this->descrizione;
    }

    public function setPermesso($permesso) {
        $this->permesso = $permesso;

        return $this;
    }

    public function getPermesso() {
        return $this->permesso;
    }
}

第二个类(如TagType):

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TipoPermessoFerieType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('nome');
        $builder->add('descrizione');
        $builder->add('permesso');
        $builder->add('id');
        //$builder->setMethod('GET');
        //$builder->add('save', 'submit', array('label' => '< Fase 2 >'));
        //$builder->add('reset', 'reset', array('label' => '< Annulla >'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\TipoPermessoFerie',
        ));
    }

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

第三课(如任务):

// src/appBundle/EntityForm/Form1
namespace AppBundle\EntityForm;

use Doctrine\Common\Collections\ArrayCollection;

class Form1 {
    protected $descrizione;
    protected $tipoPermessoFerie; // collezione di TipoPermessoFerie

    // metodi

    public function __construct(){
        $this->tipoPermessoFerie = new ArrayCollection();
    }

    public function getDescrizione () {
        return $this->descrizione;
    }

    public function setDescrizione ($de) {
        $this->descrizione = $de;
    }

    // restituisce un ArrayCollection
    public function getTipoPermessoFerie () {
        return $this->tipoPermessoFerie;
    }

    public function setTipoPermessoFerie ($TPE) {
        $this->tipoPermessoFerie = $TPE;
    }
}

第四个类(如TaskType):

// src/AppBundle/Form/Type/Form1Type.php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use AppBundle\EntityForm\Form1;

class Form1Type extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('descrizione');
        $builder->add('tipoPermessoFerie', 'collection', array('type' => new TipoPermessoFerieType()));
        $builder->setMethod('GET');
        $builder->add('save', 'submit', array('label' => '< Fase 2 >'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array('data_class' => 'AppBundle\EntityForm\Form1',));
    }

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

当我在控制器中使用这些类时......

....
$f1 = New Form1 ();
    $f1->setDescrizione("Fase 1");
    for ($i = 0; $i < count($tipiF); $i++) {
        $f1->getTipoPermessoFerie()->add($tipiF[$i]);  //$tipiF[$i]);
    }

    $form = $this->createForm(new Form1Type(), $f1);
    dump($form->getData());
    $form->handleRequest($request);

    // poi bisogna validare la prima form e passare alla seconda
    if ($form->isValid()) {
        $fe = New Ferie ();
        $dt = new \DateTime('now');
        //$dt->setTimeZone(new \DateTimeZone('Europe/Rome'));

        $fe->setDataRichiesta ($dt);
        $fe->setAnnoRif(date('Y'));
        $fe->setGiorniTurniChiesti(0);
        $fe->setDataDa($dt);
        $fe->setDataA($dt);
        dump($form->getData());
....

表单准备工作期间的第一个dump(),第二个我想要访问数据的时候没有...为什么?我不明白如何在控制器中使用表单日期......我需要它们在第二阶段进行可视化!

我的代码中丢失了什么吗?

我解释......更好...... 它&#39;似乎表格中没有错误! 这是错误的转储......表单错误是空的......

我可以看到dump命令返回的数据对象......但它是空的dump($form->getData()) 这是问题......这个对象必须有2行值(非空),我想知道whitch行被检查了!

我尝试在一个操作中管理两个表单是否正确?

编辑:也许我无法让我承诺...让我们从原始问题开始:我想实现一个2步骤形式(没有javascrit和其他客户端程序)....所以我想要实现两种形式......一种形式由用户获得一些日期;第二个表单显示获得的数据并向用户询问其他数据! 我该怎么做?

2 个答案:

答案 0 :(得分:0)

$form->isValid()通常在两种情况下失败:请求中的数据引发错误或表单尚未提交。

但我错了,如果那是因为您的表单有错误,可以使用$form->getErrors()访问它们。

编辑:我错了。表单的提交状态与所使用的方法无关,它只是基于表单提交是否已引起请求的事实。

答案 1 :(得分:0)

我已经解决了......这不是一个好的解决方案,这是一个技巧。

我使用_GET ['var']查看第一个表单返回的数据。