gpt4 book ai didi

php - 在非对象上调用成员函数 removeElement()

转载 作者:可可西里 更新时间:2023-11-01 00:30:43 25 4
gpt4 key购买 nike

我正在创建一个表单,以便能够向一组链接到特定类(class)的学生发送电子邮件。默认情况下,必须选择给定类(class)的所有学生,但消息的发件人必须能够取消选择学生以将他们排除在接收消息之外。发给全群没问题。从选择中删除学生时会出现问题。

我将 Sonata Admin 的 sonata_type_model 与自定义查询一起使用。在生成的表单上,如果我不更改选择选项并提交表单,一切正常。当我从列表中删除一个项目时,我在提交表单后收到错误消息:

错误:在/xxx/xxx/xxx/vendor/sonata-project/doctrine-orm-admin-bundle/Model/ModelManager.php line 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')));

Controller :

/**
* 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;
}

}

希望有人能帮帮我!

最佳答案

我相信这离您的问题的答案越来越近了。问题是,你完全问错了问题。重要的东西在下面,在“编辑 - 自定义多选字段”下。

您的removeDealItem 方法完全错误。试试这个:

    public function removeDealItem(\Stnu\EduBundle\Entity\DealItem $dealItem)
{
$this->dealItems->removeElement( $dealItem );

return $this;
}

您没有$entityManager 可以在这里调用……您也不需要。 Doctrine 将检查您要删除的实体是否存在,如果存在则将其删除。您不需要遍历集合中的现有元素,当然也不需要在数据库级别执行任何操作。

    public function addDealItem(\Stnu\EduBundle\Entity\DealItem $dealItem)
{
// Getting fancy - check if the item exists before adding it
if( !$this->dealItems->contains($dealItem) )
{
$this->dealItems->add($dealItem);
}
return $this;
}

添加一个项目同样简单……我们甚至可以花点心思,使用 Doctrine ArrayCollection::contains() 方法在添加元素之前检查它是否存在。您的 addDealItem() 方法没有任何问题 - 我只是想向您展示 contains() 作为让 ArrayCollection 类更直观的说明为您完成工作。

编辑 - 自定义多选字段

好的 - 在阅读了您关于不一定需要保留数据的评论后,我想我应该提供这个简化的示例来说明如何创建自定义多选框。请理解,这是一个“基础知识”示例 - 但它应该引导您朝着正确的方向前进。显然,在不知道您的 DealItem 实体结构的情况下,我只是猜测您需要访问哪些特定字段才能获取发送电子邮件所需的数据。

所以 - 在您的 Controller 中 - 首先我们获取数据:

$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();

$choices = array();

foreach( $defaults as $dealItem )
{
$choices[ $dealItem->getEmailAddress() ] = $dealItem->getStudentName();
}

现在我们需要一个对象来接收数据。我从您的评论中收集到的是您不想保留数据,并且您只为您的 CertificateEmail 对象创建了一个实体,以便您可以构建一个表单。馊主意。 您不需要实体 - 所以一开始就不要构建实体。为了证明这一点,我将使用 stdClass 对象来实现:

$certificateEmail = new \stdClass();

$certificateEmail->dealItems = array();
$certificateEmail->subject = '';
$certificateEmail->body = '';

然后我们构建表单:

$form = $this->createFormBuilder( $certificateEmail )
->add( 'dealItems', 'choice', array(
'choices' => $choices,
'multiple' => true,
'required' => true,
'label' => 'Verzenden aan' ) )
->add( 'subject', 'text', array( 'required' => true, 'label' => 'Onderwerp' ) )
->add( 'body', 'textarea', array( 'required' => false, 'label' => 'Bericht' ) )
->getForm();

最后,把它扔到一个模板上:

return $this->render( 'template.html.twig', array( 'form' => $form->createView() ) );

而且,希望你可以从那里开始:)

关于php - 在非对象上调用成员函数 removeElement(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com