我试图从实体创建一个表单,但遇到了一些麻烦。
这是我的FormType
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class EditPhotoFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title', 'text');
$builder->add('description', 'textarea');
$builder->add('category', 'choice', array(
'choices' => array(
'1' => 'categories.uncategorized',
'categories.photography.photography' => array(
'5' => 'categories.photography.abstract',
'6' => 'categories.photography.animals',
'7' => 'categories.photography.blackandwhite',
'8' => 'categories.photography.architecture',
'9' => 'categories.photography.fashion',
'10' => 'categories.photography.food',
'11' => 'categories.photography.landscapes',
'12' => 'categories.photography.macro',
'13' => 'categories.photography.people',
'14' => 'categories.photography.sport'
),
'categories.painting.painting' => array(
'15' => 'categories.painting.landscapes',
'16' => 'categories.painting.seascapes',
'17' => 'categories.painting.portrait',
'18' => 'categories.painting.stilllife',
'19' => 'categories.painting.architecture',
'20' => 'categories.painting.fantasy'
),
'categories.3d.3d' => array(
'21' => 'categories.3d.interiors',
'22' => 'categories.3d.exteriors',
'23' => 'categories.3d.creative'
),
),
));
}
public function getName()
{
return 'app_photo_edit';
}
}
这是我的控制器。
$em = $this->getDoctrine()->getManager();
$photo = $em->getRepository('AppBundle:Photo')->find($photoId);
$form = $this->createForm('app_photo_edit', $photo);
return $this->render('AdminBundle::edit.html.twig', array('form' => $form->createView(), 'photo' => $photo));
照片实体
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="photos")
*/
class Photo
{
const
CATEGORY_PHOTOGRAPHY = 1,
CATEGORY_PAINTING = 2,
CATEGORY_3D = 3;
/*
* Flow photos limit
*/
const FLOW_PHOTOS_LIMIT = 15;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="photos")
*/
protected $user;
/**
* @ORM\Column(type="text", nullable=true)
*/
protected $title;
/**
* @ORM\Column(type="text", nullable=true)
*/
protected $description;
/**
* @ORM\Column(type="text")
*/
protected $name;
/**
* @ORM\ManyToOne(targetEntity="PhotoCategory")
*/
protected $category;
/**
* @ORM\Column(name="creation_date", type="datetime")
*/
protected $creationDate;
/**
* @ORM\Column(name="edit_date", type="datetime", nullable=true)
*/
protected $editDate;
/**
* @ORM\Column(name="is_moderated", type="boolean")
*/
protected $isModerated = false;
/**
* @ORM\Column(name="moderation_date", type="datetime", nullable=true)
*/
protected $moderationDate;
/**
* @ORM\Column(name="is_active", type="boolean")
*/
protected $isActive = true;
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="photo")
* @ORM\OrderBy({"id" = "DESC"})
*/
protected $comments;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set user
*
* @param User $user
*
* @return Photo
*/
public function setUser($user)
{
$this->user = $user;
return $this;
}
/**
* Get user
*
* @return User $user
*/
public function getUser()
{
return $this->user;
}
/**
* Get category
*
* @return Category $category
*/
public function getCategory()
{
return $this->category;
}
/**
* Set title
*
* @param string $title
*
* @return Photo
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Get creationDate
*
* @return \DateTime
*/
public function getCreationDate()
{
return $this->creationDate;
}
/**
* Get editDate
*
* @return \DateTime
*/
public function getEditDate()
{
return $this->editDate;
}
/**
* Get moderationDate
*
* @return \DateTime
*/
public function getModerationDate()
{
return $this->moderationDate;
}
/**
* Get is active
*
* @return integer
*/
public function isActive()
{
return $this->isActive;
}
/**
* Get is moderated
*
* @return integer
*/
public function isModerated()
{
return $this->isModerated;
}
/*
* Get image
*
* @return string
*/
public function getImage()
{
return $this->getWebDirectory().$this->getName();
}
/*
* Get image directory
*
* @return string
*/
public function getDirectory()
{
return __DIR__.'/../../../web/uploads/photos/'.$this->getUser()->getId().'/'.$this->creationDate->format('Y-m-d').'/';
}
/*
* Get image web directory
*
* @return string
*/
public function getWebDirectory()
{
return '/web/uploads/photos/'.$this->getUser()->getId().'/'.$this->creationDate->format('Y-m-d').'/';
}
/*
* Get comments
*/
public function getComments()
{
return $this->comments;
}
/**
* Set description
*
* @param string $description
*
* @return Photo
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* Set name
*
* @param string $name
*
* @return Photo
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set creationDate
*
* @param \DateTime $creationDate
*/
public function setCreationDate(\DateTime $creationDate)
{
$this->creationDate = $creationDate;
}
/**
* Set editDate
*
* @param \DateTime $editDate
*/
public function setEditDate(\DateTime $editDate)
{
$this->editDate = $editDate;
}
/**
* Set moderationDate
*
* @param \DateTime $moderationDate
*/
public function setModerationDate(\DateTime $moderationDate)
{
$this->moderationDate = $moderationDate;
}
/**
* Set active
*/
public function setActive($active)
{
$this->isActive = $active;
}
/**
* Set category
*/
public function setCategory($category)
{
$this->category = $category;
}
/**
* Set moderated
*/
public function setModerated($moderated)
{
$this->isModerated = $moderated;
}
/*
* Delete image (Used when didnt pass moderation)
*/
public function deleteImage() {
return unlink($this->getDirectory().$this->getName());
}
}
我得到错误:“object”类型的值无法转换为有效的数组键。
问题出在FormType类别中,但我不知道如何正确地做到这一点。
谢谢
答案 0 :(得分:3)
我认为问题是由嵌套数组引起的:
'categories.photography.photography' => array(...)
如果你把简单的密钥=&gt;值数组它应该工作。例如:
$builder->add('type', 'choice',
array(
'label'=>'My own label',
'choices'=>array('verb'=>'Displayed verb', 'noun'=>'Displayed noun', 'adjective'=>'Displayed adjective', 'adverb'=>'Displayed adverb')));
对于您的表单,我建议您创建3个单独的选择字段。
答案 1 :(得分:-3)
解决代码中的所有问题,您的代码运行得更好。