AfterParseBase nu oferă acces la setul complet de date.
Prin urmare, utilizați în schimb evenimentul FeedsEvents::AFTER.
Am descoperit că, dacă ultimul element nu avea niciun element de taxonomie selectat, atunci toate elementele ar fi pierdute. Pentru a crea o uniune de elemente de taxonomie:
<?php
spațiu de nume Drupal\cbi_feed_alter\EventSubscriber;
utilizați Drupal\feeds\Event\FeedsEvents;
utilizați Drupal\feeds\Event\ParseEvent;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;
clasa IssuerFeedEventSubscriber implementează EventSubscriberInterface {
const JOIN_CHAR = ',';
/**
* {@inheritdoc}
*/
funcție publică statică getSubscribedEvents() {
$events[FeedsEvents::PARSE][] = ['afterParse', FeedsEvents::AFTER];
returnează $evenimente;
}
funcția publică afterParse(ParseEvent $event) {
/** @var \Drupal\feeds\FeedInterface */
$feed = $event->getFeed();
/** @var \Drupal\feeds\Result\ParserResultInterface */
$parser_result = $event->getParserResult();
$feed_type = $feed->getType();
if ($feed_type->id() != 'emitent') {
întoarcere;
}
pentru ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
$this->findStates($parser_result->current(), $parser_result);
}
}
funcția protejată findStates($item, $parser_result) {
$issuer_id = $item->get('issuerid');
$state = [];
$parser_current_key = $parser_result->key();
pentru ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
if ($parser_result->current()->get('issuerid') == $issuer_id) {
$state = array_filter(array_merge($state, explode(self::JOIN_CHAR, $parser_result->current()->get('state'))));
}
}
// Repetați înapoi la cheie
$parser_result->rewind();
în timp ce ($parser_result->valid() && $parser_result->key() != $parser_current_key) {
$parser_result->next();
}
$parser_result->offsetSet($parser_current_key);
$item->set('state', implode(self::JOIN_CHAR, array_unique($states, SORT_STRING)));
}
}