我有带有字段的产品实体
我需要功能,当用户在SonataAdminBundle
purch_price_net
字段中进行修改时,purch_price_gross
[和其他字段]会自动更改其值。
所以我创建了PreUpdateProducts
监听器:
<?php
namespace AppBundle\EventListener;
use Doctrine\ORM\Events;
use AppBundle\Entity\Products;
// echo Events::preUpdate;
class PreUpdateProducts {
public function preUpdate(PreUpdateEventArgs $eventArgs) {
if ($eventArgs->getEntity () instanceof Products) {
if ($eventArgs->hasChangedField ( 'purchPriceNet' )) {
$newPurchPriceNet = $eventArgs->getNewValue ( 'purchPriceNet' );
$eventArgs->setNewValue ( 'purchPriceGross', $newPurchPriceNet * 1.23 );
$eventArgs->setNewValue ( 'name', 'changedName' ); // for tests
}
}
}
}
并在services.yml中添加:
services:
[...]
my.listener:
class: AppBundle\EventListener\PreUpdateProducts
tags:
- { name: doctrine.event_listener, event: PreUpdateProducts }
不幸的是,它没有起作用,按下&#39;更新后,没有任何改变[除了purchPriceNet]。 我怎样才能让它发挥作用?
答案 0 :(得分:1)
好的,谢谢。
我是这样做的:
在Products类中添加了注释:
* @ORM\EntityListeners({"AppBundle\EventListener\PreUpdateProduct"})
和我的PreUpdateProduct类看起来像:
<?php
namespace AppBundle\EventListener;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Products;
class PreUpdateProduct {
/**
* @ORM\PreUpdate
*/
public function preUpdate(Products $product, PreUpdateEventArgs $event) {
if ($event->getEntity () instanceof Products) {
if ($event->hasChangedField ( 'purchPriceNet' )) {
$newPurchPriceNet = $event->getNewValue ( 'purchPriceNet' );
$purchVatRateObj=$product->getPurchVatRate();
$purchVatRate=$purchVatRateObj->getVatRate();
$purchVatValue=$newPurchPriceNet*$purchVatRate;
$product->setPurchVatValue($purchVatValue);
$product->setPurchPriceGross ( $newPurchPriceNet +$purchVatValue );
}
if ($event->hasChangedField ( 'sellPriceGross' )) {
$newSellPriceGross = $event->getNewValue ( 'sellPriceGross' );
$sellVatRateObj=$product->getSellVatRate();
$sellVatRate=$sellVatRateObj->getVatRate();
$sellPriceNet=$newSellPriceGross/(1+$sellVatRate);
$sellVatValue=$newSellPriceGross-$sellPriceNet;
$product->setSellVatValue($sellVatValue);
$product->setSellPriceNet ( $sellPriceNet);
}
}
}
}
现在可行。