我被stucked为建设一个形式Symfony的3Symfony的形式:一对多和CollectionType场
我定义的“新闻”包含的属性“newsArticle”,其中有一个一对多关系的实体“NewsArticle”实体,持有属性'标题','subheader和'bodytext'的翻译。 目标是提供一种形式,一方面为'新闻'的属性保留字段,另一方面为默认语言创建'NewsArticle'条目。
实体新闻(节选):
/**
* @ORM\Entity
* @ORM\Table(name="news")
*/
class News {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="NewsArticle", mappedBy="news", cascade={"persist", "remove"})
*/
private $newsArticle;
/**
* Constructor
*/
public function __construct()
{
$this->newsArticle = new \Doctrine\Common\Collections\ArrayCollection();
}
}
实体NewsArticle(节选):
/**
* @ORM\Entity
* @ORM\Table(name="news_article")
*/
class NewsArticle {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="News")
* @ORM\JoinColumn(name="news_id", referencedColumnName="id")
*/
private $news;
/**
* @ORM\Column(type="string", length=150, unique=false, nullable=false)
* @Assert\NotBlank()
*/
private $headline;
/**
* @ORM\Column(type="string", length=150, nullable=true)
*/
private $subheadline;
/**
* @ORM\Column(type="string", length=65536, nullable=false)
* @Assert\NotBlank()
*/
private $bodytext;
/**
* @ORM\ManyToOne(targetEntity="Language")
* @ORM\JoinColumn(name="language_id", referencedColumnName="id")
*/
private $languageId;
}
的控制器(节选):
public function addAction(Request $request) {
$lang = $this->getDoctrine()
->getRepository('Bundle:Language')
->findOneBy(array('deleted' => 0, 'fallback' => 1));
$news = new News();
//$news->newsArticle->setLanguageId($lang);
$form = $this->createForm(NewsType::class, $news);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($news);
$em->flush();
}
return $this->render('Bundle:News:add.html.twig', array(
'form' => $form->createView(),
'news' => $news,
));
}
TWIG模板(节选):
{{ form_start(form) }}
<div class="form-group">
{{ form_label(form.headline) }}
<div class="col-sm-8 col-md-6">
{{ form_errors(form.headline) }}
{{ form_widget(form.headline) }}
</div>
</div>
<div class="form-group">
{{ form_label(form.subheadline) }}
<div class="col-sm-8 col-md-6">
{{ form_errors(form.subheadline) }}
{{ form_widget(form.subheadline) }}
</div>
</div>
<div class="form-group">
{{ form_label(form.bodytext) }}
<div class="col-sm-8 col-md-6">
{{ form_errors(form.bodytext) }}
{{ form_widget(form.bodytext) }}
</div>
</div>
{{ form_end(form) }}
NewsType(节选):
class NewsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('newsArticle', CollectionType::class, array(
'entry_type' => NewsArticleType::class,
'allow_add' => true,
'allow_delete' => true,
))
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Bundle\Entity\News',
));
}
}
NewsArticleType(节选):
class NewsArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('headline', TextType::class, array(
'required' => false,
))
->add('subheadline', TextType::class, array(
'required' => false,
))
->add('bodytext', CKEditorType::class, array(
'required' => false,
))
;
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Bundle\Entity\NewsArticle',
));
}
}
不幸的是我得到一个错误信息......
无论属性 “标题”,也不其中一种方法“headline()”,“getheadline()”/“isheadline()”或“__call()”存在并且在Bundle中的类“Symfony \ Component \ Form \ FormView”中具有公共访问权限:_Partials:Form/news.ht ml.twig第27行
...并不知道如何访问相关实体的属性?任何提示?
编辑#1:
完整的“Child'实体包括getter/setter方法:
/**
* @ORM\Entity
* @ORM\Table(name="news_article")
*/
class NewsArticle {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="News", inversedBy="newsArticle")
* @ORM\JoinColumn(name="news_id", referencedColumnName="id")
*/
private $news;
/**
* @ORM\Column(type="string", length=150, unique=false, nullable=false)
* @Assert\NotBlank()
*/
private $headline;
/**
* @ORM\Column(type="string", length=150, nullable=true)
*/
private $subheadline;
/**
* @ORM\Column(type="string", length=65536, nullable=false)
* @Assert\NotBlank()
*/
private $bodytext;
/**
* @ORM\ManyToOne(targetEntity="Language")
* @ORM\JoinColumn(name="language_id", referencedColumnName="id")
*/
private $languageId;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set headline
*
* @param string $headline
*
* @return NewsArticle
*/
public function setHeadline($headline)
{
$this->headline = $headline;
return $this;
}
/**
* Get headline
*
* @return string
*/
public function getHeadline()
{
return $this->headline;
}
/**
* Set subheadline
*
* @param string $subheadline
*
* @return NewsArticle
*/
public function setSubheadline($subheadline)
{
$this->subheadline = $subheadline;
return $this;
}
/**
* Get subheadline
*
* @return string
*/
public function getSubheadline()
{
return $this->subheadline;
}
/**
* Set bodytext
*
* @param string $bodytext
*
* @return NewsArticle
*/
public function setBodytext($bodytext)
{
$this->bodytext = $bodytext;
return $this;
}
/**
* Get bodytext
*
* @return string
*/
public function getBodytext()
{
return $this->bodytext;
}
/**
* Set news
*
* @param \Bundle\Entity\News $news
*
* @return NewsArticle
*/
public function setNews(\Bundle\Entity\News $news = null)
{
$this->news = $news;
return $this;
}
/**
* Get news
*
* @return \Bundle\Entity\News
*/
public function getNews()
{
return $this->news;
}
/**
* Set languageId
*
* @param \Bundle\Entity\Language $languageId
*
* @return NewsArticle
*/
public function setLanguageId(\Bundle\Entity\Language $languageId = null)
{
$this->languageId = $languageId;
return $this;
}
/**
* Get languageId
*
* @return \Bundle\Entity\Language
*/
public function getLanguageId()
{
return $this->languageId;
}
}
的属性的getter和setter存在,但我不知道为什么错误信息缺失方法得到h eadline()而不是得到H eadline()?难道是,问题是TWIG中的语法错误:{{form_errors(form.headline)}}?我也尝试过{{form_errors(form.newsArticle.headline)}},但错误信息保持不变。
有什么提示吗?
阅读一下关于私有/受保护和公共属性的内容:http://php.net/manual/en/language.oop5.visibility.php。一旦你明白了,getter/setter的需求就会变得明显。也可能想看看Symfony文档。大量使用实体和表单的例子。 – Cerad
即使我将子实体NewsArticle的所有属性设置为public,我也会得到相同的错误消息。我读过Symfony Docs,特别是关于FormTypes的章节,但不幸的是没有这种嵌套表单的例子。它只提到CollectionType可以完成这项工作:“在更复杂的示例中,可以嵌入整个表单,这在创建公开一对多关系的表单时非常有用”(https://symfony.com/doc /current/reference/forms/types/collection.html) – Pixelrocker
您是否阅读过食谱? http://symfony.com/doc/current/cookbook/form/form_collections.html – Cerad