AfterParseBase không cấp quyền truy cập vào toàn bộ dữ liệu.
Do đó, hãy sử dụng sự kiện FeedsEvents::AFTER để thay thế.
Tôi thấy rằng nếu mục cuối cùng không có mục phân loại nào được chọn thì tất cả các mục sẽ bị mất. Để tạo một liên kết các mục phân loại:
<?php
không gian tên Drupal\cbi_feed_alter\EventSubscriber;
sử dụng Drupal\feeds\Event\FeedsEvents;
sử dụng Drupal\feeds\Event\ParseEvent;
sử dụng Symfony\Component\EventDispatcher\EventSubscriberInterface;
class IssuerFeedEventSubscriber triển khai EventSubscriberInterface {
const THAM GIA_CHAR = ',';
/**
* {@inheritdoc}
*/
hàm tĩnh công khai getSubscribeEvents() {
$events[FeedsEvents::PARSE][] = ['afterParse', FeedsEvents::AFTER];
trả lại sự kiện $;
}
chức năng công khai 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() != 'nhà phát hành') {
trở lại;
}
for ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
$this->findStates($parser_result->current(), $parser_result);
}
}
chức năng được bảo vệ findStates($item, $parser_result) {
$issuer_id = $item->get('issuerid');
$state = [];
$parser_current_key = $parser_result->key();
for ($parser_result->rewind(); $parser_result->valid(); $parser_result->next()) {
if ($parser_result->current()->get('issuerid') == $issuer_id) {
$states = array_filter(array_merge($states, phát nổ(self::JOIN_CHAR, $parser_result->current()->get('state'))));
}
}
// Lặp lại khóa
$parser_result->rewind();
while ($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)));
}
}