如果要挂钩到过程时,与会者被添加或删除,我想你需要检查出oro_calendar.listener.calendar_event_attendees服务:
# OroCalendarBundle/Resources/config/services.yml
services:
oro_calendar.listener.calendar_event_attendees:
class: Oro\Bundle\CalendarBundle\EventListener\CalendarEventAttendeesListener
tags:
- { name: doctrine.event_listener, event: onFlush }
和相关CalendarEventAttendeesListener等级:
<?php
namespace Oro\Bundle\CalendarBundle\EventListener;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\UnitOfWork;
use Oro\Bundle\CalendarBundle\Entity\Attendee;
use Oro\Bundle\CalendarBundle\Entity\CalendarEvent;
use Oro\Bundle\PlatformBundle\EventListener\OptionalListenerInterface;
class CalendarEventAttendeesListener implements OptionalListenerInterface
{
/** @var bool */
protected $enabled = true;
/**
* @param OnFlushEventArgs $args
*/
public function onFlush(OnFlushEventArgs $args)
{
if (!$this->enabled) {
return;
}
$entityManager = $args->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
$newEntities = $unitOfWork->getScheduledEntityInsertions();
$updateEntities = $unitOfWork->getScheduledEntityUpdates();
$deletedEntities = $unitOfWork->getScheduledEntityDeletions();
foreach ($newEntities as $entity) {
if ($this->isAttendeeApplicable($entity, $unitOfWork)) {
$this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
}
}
foreach ($updateEntities as $entity) {
if ($this->isAttendeeApplicable($entity, $unitOfWork)) {
$this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
}
}
foreach ($deletedEntities as $entity) {
if ($this->isAttendeeApplicable($entity, $unitOfWork)
&& !$unitOfWork->isScheduledForDelete($entity->getCalendarEvent())
) {
$this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
}
}
}
/**
* @param object $entity
*
* @return bool
*/
protected function isAttendeeApplicable($entity, UnitOfWork $unitOfWork)
{
return $entity instanceof Attendee
&& $entity->getCalendarEvent()
&& !$entity->getCalendarEvent()->isUpdatedAtSet()
&& count($unitOfWork->getEntityChangeSet($entity->getCalendarEvent())) == 0;
}
/**
* @param CalendarEvent $calendarEvent
* @param UnitOfWork $unitOfWork
*/
protected function updateCalendarEventUpdatedAt(CalendarEvent $calendarEvent, UnitOfWork $unitOfWork)
{
$oldUpdatedAt = $calendarEvent->getUpdatedAt();
$newUpdatedAt = new \DateTime('now', new \DateTimeZone('UTC'));
$calendarEvent->setUpdatedAt($newUpdatedAt);
$unitOfWork->propertyChanged($calendarEvent, 'updatedAt', $oldUpdatedAt, $newUpdatedAt);
}
/**
* {@inheritdoc}
*/
public function setEnabled($enabled = true)
{
$this->enabled = $enabled;
}
}
要么覆盖onFlush
方法,要么使用类似的方法创建自己的EventListener,以在过程中激发您的函数。
如果您仍有问题,请阅读http://symfony.com/doc/current/bundles/inheritance.html并更新您的问题。 – lordrhodos
我已阅读它。我可以覆盖该包的所有其他部分,但实体文件除外。 –
啊,是的,我认为你不能重写教条实体映射。 [class被定义为一个参数](https://github.com/orocrm/OroCalendarBundle/blob/master/Resources/config/services.yml#L3),但仅用于某些部分。其他部分直接实例化它,所以我想如果你想“交换”这个类,你需要覆盖很多部分。 您是否需要在与会者加入活动后添加日志条目? – lordrhodos