Symfony从实体中选择默认值

时间:2016-02-18 13:32:14

标签: php symfony

我遇到了一些symfony形式的麻烦。 我的实体中有一个布尔变量。我在编辑时无法找到在表单中设置该值的方法。

实体

namespace AdminBundle\Entity;

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

/**
 * @ORM\Entity
 * @ORM\Table(name="pages")
 */
class Page
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="text")
     */
    protected $slug;

    /**
     * @ORM\Column(type="text")
     */
    protected $title;

    /**
     * @ORM\Column(type="text")
     */
    protected $content;

    /**
     * @ORM\Column(name="creation_date", type="datetime")
     */
    protected $creationDate;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    protected $isActive = true;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set slug
     *
     * @param string $slug
     *
     * @return Page
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;

        return $this;
    }

    /**
     * Get slug
     *
     * @return string
     */
    public function getSlug()
    {
        return $this->slug;
    }

    /**
     * Set title
     *
     * @param string $title
     *
     * @return Page
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set content
     *
     * @param string $content
     *
     * @return Page
     */
    public function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

    /**
     * Get content
     *
     * @return string
     */
    public function getContent()
    {
        return $this->content;
    }

    /**
     * Set creationDate
     *
     * @param \DateTime $creationDate
     *
     * @return Page
     */
    public function setCreationDate($creationDate)
    {
        $this->creationDate = $creationDate;

        return $this;
    }

    /**
     * Get creationDate
     *
     * @return \DateTime
     */
    public function getCreationDate()
    {
        return $this->creationDate;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     *
     * @return Page
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }

    /**
     * Get isActive
     *
     * @return boolean
     */
    public function getIsActive()
    {
        return $this->isActive;
    }
}

控制器功能

public function editAction(Request $request, $pageId)
    {   
        $em = $this->getDoctrine()->getManager();

    $page = $em->getRepository('AdminBundle:Page')->find($pageId);

        $form = $this->createForm('app_page', $page);

        $form->handleRequest($request);

    if($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($page);
            $em->flush();

            return $this->redirectToRoute('admin_pages');
        }

    return $this->render('AdminBundle::editPage.html.twig', array('page' => $page, 'form' => $form->createView()));
    }

PageFormType

namespace AdminBundle\Form\Type;

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

class PageFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('title', 'text');
        $builder->add('slug', 'text');
        $builder->add('isActive', 'choice', array('choices' => array(
            'true' => 'Active',
            'false' => 'Inactive'
        )));
        $builder->add('content', 'textarea', array('required' => false));
    }

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

正如您所看到的,我在FormType类中编写了自己的选择。现在它始终显示“活动”而不是显示实体的值。我该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:0)

尝试更改实体中的isActive,如

protected $isActive ;

如果你想使默认值为true,你可以在如下构造中进行:

public function __construct() {
    $this->setIsActive = true ;
}

答案 1 :(得分:0)

{{1}}

答案 2 :(得分:0)

2021 年的解决方案:从实体设置表单选择默认值(数据)

有时您的选择字段值存在于另一个实体表中,这意味着您无法使用默认表单 data_class 填充它们。你只得到表单实体中保存的字符串值,导致错误:...must be an object or null, string given...

protected EntityManagerInterface $em;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}



// In your form
->add('membershipType', EntityType::class, [
            'class' => MembershipType::class,
            'label' => 'Enter membership type here',
            'data' => $this->em->getRepository(MembershipType::class)->findOneBy([
                'name' => $your_value_here
            ])
        ])