2016-02-02 51 views
0

我正在處理一個複雜的表單系統...對我來說。我跟着這裏的說明: http://symfony.com/doc/2.6/cookbook/form/form_collections.html我的表單對象不能正常工作

我的第一類(如標籤):

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(),第二,當我要訪問的數據不...爲什麼?我不明白我怎樣才能在控制器中使用表格日期......我需要他們在第二階段形象化!

我在代碼中丟失了什麼嗎?

我解釋...更好... 它似乎在表單中沒有錯誤! 這是錯誤的轉儲...形式的錯誤是空的...

我可以想像自卸命令返回的數據對象......但它是空的這樣dump($form->getData()) 這是問題...這對象必須有2行的值(非空),我想知道whitch行被檢查!

我想在一個動作中管理兩種形式,它是正確的嗎?

編輯:也許我不能讓我進行...讓我們從原始問題開始:我想實現一個2步表單(沒有javascrit和其他客戶端程序)....所以我認爲要實現兩種形式...一種形式由用戶獲取一些日期;第二種形式顯示獲得的數據並向用戶詢問其他數據! 我該怎麼做?

+0

我注意到你'使用'主義:註釋,但實際上沒有在你的類參數上使用它們嗎?然後在你的問題後面,你使用明確作爲學說實體的類,但沒有在它們之間的映射。這些是外部映射的嗎?(例如orm文件) – DevDonkey

+0

我也在類中使用註釋...我刪除了這些行,因爲那樣代碼太長了,我付出的代價並不重要。 –

+0

哪一個是你發佈的圖像對應的轉儲($ form-> getData()):第一個還是第二個? –

回答

0

$form->isValid()通常在兩種情況下失敗:請求中的數據引發錯誤或表單未提交。

但我可能是錯的,如果這是因爲您的表單有錯誤,您可以通過以下方式訪問它們:$form->getErrors()

編輯:我錯了。提交的表單狀態與所使用的方法沒有關係,只是基於表單提交已經引起請求的事實。

+0

$ form-> getErrors is empty ... –

+0

Thiws是不可能的程序執行isValid節中的指令!...所以isValid()返回TRUE! –

0

我解決了......這不是一個好的解決方案,它是一個技巧。

我使用_GET ['var']來查看第一個表單返回的數據。