Афтерпарсебасе не дает доступ к полному набору данных.
Поэтому вместо этого используйте событие FeedsEvents::AFTER.
Я обнаружил, что если в последнем элементе не выбраны элементы таксономии, все элементы будут потеряны. Чтобы создать объединение элементов таксономии:
<?php
пространство имен Drupal\cbi_feed_alter\EventSubscriber;
используйте Drupal\feeds\Event\FeedsEvents;
используйте Drupal\feeds\Event\ParseEvent;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;
класс IssuerFeedEventSubscriber реализует EventSubscriberInterface {
const JOIN_CHAR = ',';
/**
* {@inheritdoc}
*/
общедоступная статическая функция getSubscribedEvents() {
$events[FeedsEvents::PARSE][] = ['afterParse', FeedsEvents::ПОСЛЕ];
вернуть $события;
}
публичная функция afterParse(ParseEvent $event) {
/** @var \Drupal\feeds\FeedInterface */
$feed = $event->getFeed();
/** @var \Drupal\feeds\Result\ParserResultInterface */
$parser_result = $event->getParserResult();
$feed_type = $feed->getType();
если ($feed_type->id() != 'эмитент') {
возвращаться;
}
for ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
$this->findStates($parser_result->current(), $parser_result);
}
}
защищенная функция findStates($item, $parser_result) {
$issuer_id = $item->get('issuerid');
$ состояния = [];
$parser_current_key = $parser_result->key();
for ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
если ($parser_result->current()->get('issuerid') == $issuer_id) {
$states = array_filter(array_merge($states,explore(self::JOIN_CHAR, $parser_result->current()->get('state'))));
}
}
// Возвращаемся к ключу
$parser_result->перемотка назад();
в то время как ($parser_result->valid() && $parser_result->key() != $parser_current_key) {
$parser_result->следующий();
}
$parser_result->offsetSet($parser_current_key);
$item->set('state', implode(self::JOIN_CHAR, array_unique($states, SORT_STRING)));
}
}