2014-03-27 58 views
1

我想創建一個表單來創建項目。項目對象包含名稱,客戶等,也是業主,應該是當前用戶。所以當顯示錶單時,不應該有任何「ownerfield」,因爲用戶不應該能夠編輯所有者,因爲它是himselt並且不需要編輯。所以我只是想通過類似這樣的東西將當前用戶傳遞給表單。與日期相同,因爲它是當前日期,所以不可編輯。Symfony2 - 如何將當前用戶和日期傳遞給表單?

編輯:基本上我想要做的是:創建一個新的projectobject,通過系統修改一些數據,比如將所有者設置爲當前用戶,並將startdate設置爲當前日期,之後我想通過修改對象一個表格(建立一個名字,一個客戶,一個截止日期......取決於用戶想要的東西)。然後驗證項目對象並將其保存到數據庫。

$this->getUser(); 

所以這裏是我的方法。

項目:

<?php 
// src/Beorganized/BeoBundle/Entity/Project.php 
namespace Beorganized\BeoBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
/** 
* @ORM\Entity 
*/ 
class Project{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    protected $name; 
    /** 
    * @ORM\Column(type="string", length=1024) 
    */ 
    protected $icon; 
    /** 
    * @ORM\ManyToOne(targetEntity="User") 
    * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") 
    * @Assert\NotBlank() 
    **/ 
    protected $owner; 
    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="projects") 
    */ 
    protected $users; 
    /** 
    * @ORM\Column(type="string", length=255) 
    */ 
    protected $customer; 
    /** 
    * @ORM\ManyToOne(targetEntity="Category") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    **/ 
    protected $category; 
    /** 
    * @ORM\Column(type="date") 
    * @Assert\NotBlank() 
    */ 
    protected $startdate; 
    /** 
    * @ORM\Column(type="date") 
    */ 
    protected $enddate; 
    /** 
    * @ORM\Column(type="date") 
    */ 
    protected $deadline; 


    public function __construct() { 
     $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    /** 
    * Get id 
    * 
    * @return 
… 

項目類型:

<?php 

// src/Beorganized/BeoBundle/Form/Type/ProjectType.php 
namespace Beorganized\BeoBundle\Form\Type; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
class ProjectType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name', 'text'); 
     $builder->add('customer', 'text'); 
     $builder->add('deadline', 'date'); 
     $builder->add('users', 'text'); 
//  $builder->add('owner', 'hidden'); 
//  $builder->add('startdate', 'hidden'); 
     $builder -> add('save', 'submit'); 
     } 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Beorganized\BeoBundle\Entity\Project' 
)); } 
    public function getName() 
    { 
     return 'project'; 
    } 
} 

ProjectController:

public function newAction() { 
     $em = $this -> getDoctrine() -> getManager(); 

     $project = new Project(); 

     $user = $this->getUser(); 
     $username = $user->getUsername(); 

     $project = new Project(); 
     $project->setOwner($user); 
     $project->setStartdate(getdate()); 
     $form = $this -> createForm(new ProjectType(), $project, array('action' => $this -> generateUrl('_beo_create_project'),)); 
     return $this -> render('BeorganizedBeoBundle:Project:newproject.html.twig', array('username' => $username, 'form' => $form -> createView())); 

    } 
public function createAction(Request $request) { 



     $em = $this -> getDoctrine() -> getManager(); 
     $form = $this -> createForm(new ProjectType(), new Project()); 
     $form -> handleRequest($request); 

     if ($form -> isValid()) { 
      $project = $form -> getData(); 

      $em -> persist($project); 
      $em -> flush(); 
      return $this -> redirect($this->generateUrl('_beo_project_created')); 
     } 
     return $this -> render('BeorganizedBeoBundle:Project:newproject.html.twig', array('username' => 'failed', 'form' => $form -> createView())); 

    } 

當我提交表單,我得到兩次 「此值不應該是空白的。」這是因爲所有必須傳遞的數據都必須添加嗎?像「$ builder-> add('owner','hidden');」。我知道我可以刪除Annotations * @Assert \ NotBlank(),但應該有另一種方式,對吧?

當我取消對那些爲附加線(「所有者」 ......並添加(「開始日期...我收到以下錯誤:

The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class Beorganized\BeoBundle\Entity\User. You can avoid this error by setting the "data_class" option to "Beorganized\BeoBundle\Entity\User" or by adding a view transformer that transforms an instance of class Beorganized\BeoBundle\Entity\User to scalar, array or an instance of \ArrayAccess. 
500 Internal Server Error - LogicException 

也許我的做法是完全地錯誤的PorjectType,請不要怪我,這是我第Symfonyproject可能有人幫助我

感謝:-)

回答

0

,如果你只是試圖設置這兩個值,只是使用驗證組(或刪除驗證,但我知道你不想這樣),並從您的窗體中刪除這兩個字段。

,並在控制器中使用:

if ($form -> isValid()) { 
     $project = $form -> getData(); 

     $project->setStartDate(new \DateTime()); // set the startdate 
     $user= $this->get('security.context')->getToken()->getUser(); // get the current user 
     $project->setOwner($user); // set the current user 

     $em -> persist($project); 
     $em -> flush(); 
     return $this -> redirect($this->generateUrl('_beo_project_created')); 
    } 

這是否解決您的問題?

+0

我會嘗試這種方式,因爲我認爲這是我的問題的最佳解決方案!非常感謝! – haeki

+0

np,請讓我知道你什麼時候該做,實際上是否可以讓它工作。 –

+0

是的,它的工作! :-)我剛剛又遇到了一個小問題。我得到了項目和用戶之間的雙向關係,並且我想將用戶添加到項目中...我的代碼完成了表單的工作,但如果我提交它,則什麼都不會發生。我認爲項目對象的addUser或Userobject的addProject會被調用,但沒有任何反應......沒有錯誤,也沒有輸入users_projects-table。 $ builder-> add('users','entity',array('class'=>'BeorganizedBeoBundle:User','property'=>'username','multiple'=> true,expanded'=> true)) ; – haeki

0

嘗試添加你的主人這樣在表單生成器:?! $ builder->添加('老闆','hidden');

$builder->add('owner', 'entity', array(
    'class' => 'AcmeHelloBundle:User', 
    'property' => 'username', 
    'attr'=> array('style'=>'display:none') 
)); 

line'class'=>'AcmeHelloBundle:User',可能對您的路徑有誤。

來源:http://symfony.com/doc/current/reference/forms/types/entity.html

+0

但我沒有將data_class設置爲buildForm中的Project,對嗎? – haeki

+0

我會嘗試從我的一個項目的一個代碼中向您發送一部分代碼(gmt + 1) –

+0

編輯我的答案,檢查它並告訴我什麼。 –

0

使用驗證組:

來驗證你的實體依據一定的約束,但不是所有的(你組到組,並使用該組驗證)

編輯

中實體:

/** 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumn(name="owner_id", referencedColumnName="id") 
* @Assert\NotBlank(groups={"group1"}) 
**/ 
protected $owner; 

在形式:

$resolver->setDefaults(array(
    'data_class' => 'Beorganized\BeoBundle\Entity\Project', 
    //'validation_groups' => array('group1'), // will not be applied 
)); 

這最終會beeing的有效形式,在未經業主現場提交(它也不會被改變)

+0

謝謝,我將研究這一點。但是沒有辦法讓系統和用戶(通過表單)編輯完整的對象,然後驗證它。我只是更新了上面的描述,所以它更清楚我想要什麼。 – haeki

+0

創建一個驗證組,其中包含NotBlank NOT或其他組中的NotBlank NOT,並將該驗證組應用於表單。這應該讓你最終得到一個isValid()表單(因爲NotBlank不會被應用)。 –

+0

我在上面編輯了我的答案,我誤解了這個問題? –

相關問題