Symfony2-如何将当前用户和日期传递给表单?

晴树

我想建立一个表格以便创建项目。该项目对象包含一个名称,客户等,以及一个所有者,该所有者应该是当前用户。因此,在显示表单时,不应有任何“ ownerfield”,因为用户应该会因为自己的意愿而无法编辑所有者,因此无需进行编辑。所以我只想用这样的方式将当前用户传递给表单。与日期相同,因为它是当前日期,所以不可编辑。

编辑:基本上我想做的是:创建一个新的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');“。我知道我可以删除注释* @Assert \ NotBlank(),但应该有另一种方法,对吗?

当我取消注释这些行的add('owner'...和add('startdate ...)时,出现以下错误:

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。有人可以帮我吗?

谢谢!:-)

山姆·詹森斯

如果您只是尝试设置这2个值,则只需使用验证组(或删除验证,但我知道您不希望这样做)并从表单中删除这2个字段。

并在您的控制器中使用它:

    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'));
    }

这样可以解决您的问题吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章