AfterParseBase ไม่ให้การเข้าถึงชุดข้อมูลทั้งหมด.
ดังนั้น ให้ใช้เหตุการณ์ FeedsEvents::AFTER แทน
ฉันพบว่าหากรายการสุดท้ายไม่มีรายการอนุกรมวิธานที่เลือก รายการทั้งหมดจะหายไป หากต้องการสร้างรายการอนุกรมวิธานที่รวมกัน:
<?php
เนมสเปซ Drupal\cbi_feed_alter\EventSubscriber;
ใช้ Drupal\feeds\Event\FeedsEvents
ใช้ Drupal\feeds\Event\ParseEvent;
ใช้ Symfony\Component\EventDispatcher\EventSubscriberInterface;
class IssuerFeedEventSubscriber ใช้ EventSubscriberInterface {
const JOIN_CHAR = ',';
/**
* {@inheritdoc}
*/
ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
$events[FeedsEvents::PARSE][] = ['afterParse', FeedsEvents::AFTER];
ส่งคืนเหตุการณ์ $;
}
ฟังก์ชั่นสาธารณะ 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() != 'ผู้ออก') {
กลับ;
}
สำหรับ ($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();
สำหรับ ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
ถ้า ($parser_result->current()->get('issuerid') == $issuer_id) {
$states = array_filter(array_merge($states, expand(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)));
}
}