【发布时间】:2015-12-23 02:39:13
【问题描述】:
我正在创建一个表单,以便能够向链接到特定课程的一组学生发送电子邮件。默认情况下,必须选择给定课程的所有学生,但消息的发送者必须能够取消选择学生以将他们排除在接收消息之外。发送到整个组是没有问题的。从选择中删除学生时会出现问题。
我将 Sonata Admin 的 sonata_type_model 与自定义查询一起使用。在生成的表单上,如果我不更改选择选项并提交表单,一切正常。当我从列表中删除一个项目时,我在提交表单后收到错误:
错误:在 /xxx/xxx/xxx/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php 第 607 行中的非对象上调用成员函数 removeElement()
经过两天寻找答案,希望这里有人可以帮助我朝着正确的方向前进。这是我使用的一些代码:
管理员:
$em = $this->modelManager->getEntityManager('Stnu\EduBundle\Entity\DealItem');
$query = $em->createQueryBuilder('d')
->select('d')
->from('StnuEduBundle:DealItem', 'd')
->innerJoin('d.deal', 'de')
->where('d.course = :course')
->andWhere('de.status = :status')
->setParameter('course',$course)
->setParameter('status','order');
$defaults = $query->getQuery()->getResult();
$formMapper
->with('Certificaten verzenden cursus \''. $title .'\'', array('description' => 'Begeleidende tekst e-mail'))
->add('dealItems', 'sonata_type_model', array(
'required' => true,
'expanded' => false,
'btn_add' => false,
'multiple' => true,
'label' => 'Verzenden aan',
'query' => $query,
'property' => 'deal.user',
'data' => $defaults,
'validation_groups' => false
))
->add('subject', 'text', array('required' => true, 'label' => 'Onderwerp', 'data' => $subject))
->add('body', 'textarea', array('label' => 'Bericht', 'required' => false, 'data' => $body, 'attr' => array('class' => 'tinymce', 'data-theme' => 'fullpage', 'style' => 'height: 350px')));
控制器:
/**
* Create action
*
* @return Response
*
* @throws AccessDeniedException If access is not granted
*/
public function createAction()
{
// the key used to lookup the template
$templateKey = 'edit';
if (false === $this->admin->isGranted('CREATE')) {
throw new AccessDeniedException();
}
$object = $this->admin->getNewInstance();
$this->admin->setSubject($object);
/** @var $form \Symfony\Component\Form\Form */
$form = $this->admin->getForm();
$form->setData($object);
if ($this->getRestMethod()== 'POST') {
$object->setDealItems($object->getDealItems());
$form->submit($this->get('request'));
错误出现在这一点之后。
实体:
<?php
namespace Stnu\EduBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* DocsEmail
*
* @ORM\Entity
*/
class CertificateEmail {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="DealItem")
* @ORM\JoinTable(name="certificateemails_dealitems",
* joinColumns={@ORM\JoinColumn(name="certificateEmail_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="dealItem_id", referencedColumnName="id")}
* )
*/
private $dealItems;
private $subject;
private $body;
private $extraEmailTo;
public function __construct() {
$this->dealItems = new ArrayCollection();
}
/**
* Add dealItem
*
*/
public function addDealItem(\Stnu\EduBundle\Entity\DealItem $dealItem) {
$this->dealItems->add($dealItem);
//$this->dealItems[] = $dealItem;
return $this;
}
/**
* Remove dealItem
*/
public function removeDealItem(\Stnu\EduBundle\Entity\DealItem $dealItem) {
foreach ($this->dealItems as $item) {
if ($dealItem === $item) {
// manager of Stnu\EduBundle\Entity\DealItem
$entityManager->remove($dealItem);
}
}
}
/**
* Get dealItems
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getDealItems() {
return $this->dealItems;
}
public function setDealItems($dealItems) {
$this->dealItems = new ArrayCollection();
if (count($dealItems) > 0) {
foreach ($dealItems as $dealItem) {
$this->addDealItem($dealItem);
}
}
return $this;
}
/**
* Set subject
*
* @param string $subject
*/
public function setSubject($subject) {
$this->subject = $subject;
return $this;
}
/**
* Get subject
*
* @return string
*/
public function getSubject() {
return $this->subject;
}
/**
* Set body
*
* @param string $body
*/
public function setBody($body) {
$this->body = $body;
return $this;
}
/**
* Get body
*
* @return string
*/
public function getBody() {
return $this->body;
}
/**
* Set extraEmailTo
*
* @param string $extraEmailTo
*/
public function setExtraEmailTo($extraEmailTo) {
$this->extraEmailTo = $extraEmailTo;
return $this;
}
/**
* Get extraEmailTo
*
* @return string
*/
public function getExtraEmailTo() {
return $this->extraEmailTo;
}
}
希望有人可以帮助我!
【问题讨论】:
-
错误提示 dealItems 在调用 removeElement() 时为空。我可以看到您在构造对象时正在初始化集合 - 所以在我看来,这意味着沿线某处, dealItems 被破坏了......但我看不到在哪里
-
这是怎么回事 -
$object->setDealItems($object->getDealItems());? -
我想只是一个测试,看看它是否有帮助。我将删除此代码。
-
亲爱的 Ragdata 和 Stijlnu!感谢我的声誉;)
-
这个也很可疑@Stijlnu -
$form->submit($this->get('request'));您在上面的评论中引用的 Form 类(我做同样的事情来帮助我的 IDE)没有 submit 方法...你扩展了吗?