По какой-то причине мои подписчики на события каналов просто перестали работать.
Мой код выглядит так, dpm для отладки никогда не запускается, поэтому я думаю, что функция не запускается.
Я не могу понять, что изменилось.
пространство имен Drupal\partshub_feeds_modifications\EventSubscriber;
используйте Drupal\feeds\Event\EntityEvent;
используйте Drupal\feeds\Event\FeedsEvents;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Реагирует на события каналов, чтобы изменить свойства канала.
*/
класс FeedsSubscriber реализует EventSubscriberInterface {
/**
* {@inheritdoc}
*/
общедоступная статическая функция getSubscribedEvents() {
$события = [];
$events[FeedsEvents::PROCESS_ENTITY_PRESAVE][] = 'предварительно сохранить';
$events[FeedsEvents::PROCESS_ENTITY_POSTSAVE][] = 'после сохранения';
вернуть $события;
}
/**
* Действует при сохранении объекта.
*
* @param Drupal\feeds\Event\EntityEvent $event
* Лента события.
*/
предварительное сохранение публичной функции (EntityEvent $event) {
дпм($событие);
// Получить объект фида.
$feed = $event->getFeed();
// Получить объект, над которым выполняется операция.
if ($feed->type->entity->id() === 'parts') {
$entity = $event->getEntity();
// Получить неизмененный объект.
$unchanged_entity = \Drupal::entityTypeManager()
->getStorage('узел')
->loadUnchanged($entity->id());
// Проверяем, является ли сущность новой.
если (!$entity->isNew()) {
// Только если деталь не новая, проверяем значения.
if ($feed->type->entity->label() === 'Части') {
если ($entity->get('title')->value === 'пусто') {
$entity->get('title')->value = $unchanged_entity->get('title')->value;
}
// Поле фурнитуры/марки детали.
если ($entity->get('field_make')->isEmpty()) {
$makes = $unchanged_entity->get('field_make')->referencedEntities();
foreach ($ делает как $index => $term) {
$tid = $term->id();
если ($индекс == 0) {
$entity->set('field_make', $tid);
}
еще {
$entity->get('field_make')->appendItem([
'target_id' => $tid,
]);
}
}
}
// Код группы деталей.
если ($entity->get('field_group_code')->isEmpty()) {
$codes = $unchanged_entity->get('field_group_code')
->ссылочные объекты();
foreach ($codes как $index => $code) {
$code_id = $code->id();
если ($индекс == 0) {
$entity->set('field_group_code', $code_id);
}
еще {
$entity->get('field_group_code')->appendItem([
'target_id' => $code_id,
]);
}
}
}
// Перекрестные ссылки.
если ($entity->get('field_cross_references')->isEmpty()) {
$references = $unchanged_entity->get('field_cross_references')
->ссылочные объекты();
foreach ($ ссылки как $ index => $ ссылка) {
$reference_id = $reference->id();
если ($индекс == 0) {
$entity->set('field_cross_references', $reference_id);
}
еще {
$entity->get('field_cross_references')->appendItem([
'target_id' => $reference_id,
]);
}
}
}
}
elseif ($feed->type->entity->label() === 'Физические атрибуты') {
если ($entity->get('title')->value === 'пусто') {
$entity->get('title')->value = $unchanged_entity->get('title')->value;
}
// Вес детали.
если ($entity->get('field_weight')->isEmpty()) {
$entity->get('field_weight')->value = $unchanged_entity->get('field_weight')->value;
}
// Высота детали.
если ($entity->get('field_height')->isEmpty()) {
$entity->get('field_height')->value = $unchanged_entity->get('field_height')->value;
}
// Ширина детали.
если ($entity->get('field_width')->isEmpty()) {
$entity->get('field_width')->value = $unchanged_entity->get('field_width')->value;
}
// Глубина детали.
если ($entity->get('field_depth')->isEmpty()) {
$entity->get('field_depth')->value = $unchanged_entity->get('field_depth')->value;
}
}
}
}
}
/**
* Действует при сохранении объекта.
*
* @param Drupal\feeds\Event\EntityEvent $event
* Лента события.
*/
публичная функция postsave (EntityEvent $event) {
$feed = $event->getFeed();
$feeds = ['oe_references', 'sub_components', 'dimensions'];
$id = $feed->type->entity->id();
если (in_array($id, $feeds)) {
$entity = $event->getEntity();
$parent_field_name = $entity->parent_field_name->значение;
$parent_id = $entity->parent_id->значение;
$vid = \Drupal::entityTypeManager()->getStorage('node')->getLatestRevisionId($parent_id);
$part = \Drupal::entityTypeManager()->getStorage('node')->loadRevision($vid);
$paragraph_references = $part->get($parent_field_name)->referencedEntities();
$paragraph_references_id = [];
если ($ paragraph_references) {
foreach ($paragraph_references как $paragraph_reference) {
$paragraph_references_id[] = $paragraph_reference->id();
}
}
если (!in_array($entity->id(), $paragraph_references_id)) {
$поля = [
'field_oe_references', 'field_sub_components_', 'field_dimensions'
];
если (in_array($parent_field_name, $fields)) {
если ($ часть) {
$part->{$parent_field_name}[] = $сущность;
$часть->сохранить();
}
}
}
}
}
}
У меня также есть определение службы следующим образом.
Сервисы:
# Имя этой службы.
parthsub_feeds_modifications_events_subscriber:
# Класс подписчика событий, который будет прослушивать события.
класс: Drupal\partshub_feeds_modifications\EventSubscriber\FeedsSubscriber
# Помечен как event_subscriber, чтобы зарегистрировать этого подписчика в службе event_dispatch.
теги:
- {имя: event_subscriber}