2016-08-22 9 views
2

У меня есть продукты объект с полямиSymfony preUpdate событие в SonataAdminBundle

  • имя,
  • purch_price_net
  • purch_price_gross
  • purch_vat_value
  • purch_vat_rate_id [из другой таблицы]

I необходимо, чтобы при редактировании пользователем в 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 } 

Unfortunatelly это не работает, ничего не меняется [обособленно purchPriceNet] после нажатия кнопки 'Обновить'. Как я могу заставить его работать?

+1

Как вы вызываете событие 'PraUpdateProducts'? Потому что в Symfony/Doctrine нет такого события. События жизненного цикла должны быть определены в сопоставлении сущности. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks –

+0

(возможно) вне темы, но использование множественного числа в имени объекта запрашивает проблемы , – greg0ire

ответ

1

OK спасибо.

Я сделал это таким образом:

в классе продуктов добавил аннотацию:

* @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); 
      } 
     } 
    } 
} 

Сейчас он работает.