gpt4 book ai didi

Drupal - 2 个单独的提要更新同一组节点(提要模块)

转载 作者:行者123 更新时间:2023-12-02 02:08:38 27 4
gpt4 key购买 nike

我正在使用提要模块将一组出版物拉入 Drupal 内容类型。它们被设置为使用 cron 定期运行。我有两个单独的提要,它们的工作方式如下:

  • Feed 1 (pure_feed) - 提取大部分字段
  • Feed 2 (harvard_format) - 访问一个单独的 url 源并更新内容类型的一个字段。

我遇到的问题是 feed 2 总是创建一组新节点而不是更新现有节点(使用 feed 1 创建)。我在/import 使用了调试选项,可以看到提要 2 的 GUID 与提要 1 的 GUID 匹配,但它仍然创建 2 组节点而不是更新 1 组节点。

这是 feeds_items 数据库表的摘录:

Feed 1

Feed 2

如您所见,它们都具有相同的 GUID,但它们映射到不同的节点。有没有办法让第二个提要映射到与第一个提要相同的节点?

最佳答案

我将一些东西放在一起,使我的第二个提要可以更新第一个提要的节点。不确定这是否是正确的做事方式,但它确实有效。这是我所做的,以防将来对其他人有帮助:

  • 创建了一个扩展 FeedsNodeProcessor 的自定义处理器
  • 将 FeedsNodeProcessor 的所有功能复制到新类。
  • 按如下方式覆盖了 existingEntityId 函数(harvard_format 是我的辅助提要,pure_feed 是我的主要提要):

protected 函数 existingEntityId(FeedsSource $source, FeedsParserResult $result) {

if($source->id == 'harvard_format') {

$query = db_select('feeds_item')
->fields('feeds_item', array('entity_id'))
->condition('feed_nid', $source->feed_nid)
->condition('entity_type', $this->entityType())
->condition('id', 'pure_feed');

// Iterate through all unique targets and test whether they do already
// exist in the database.
foreach ($this->uniqueTargets($source, $result) as $target => $value) {
switch ($target) {
case 'url':
$entity_id = $query->condition('url', $value)->execute()->fetchField();
break;
case 'guid':
$entity_id = $query->condition('guid', $value)->execute()->fetchField();
break;
}
if (isset($entity_id)) {
// Return with the content id found.
return $entity_id;
}
}
return 0;
}
elseif ($nid = parent::existingEntityId($source, $result)) {
return $nid;
} else {

// Iterate through all unique targets and test whether they do already
// exist in the database.
foreach ($this->uniqueTargets($source, $result) as $target => $value) {
switch ($target) {
case 'nid':
$nid = db_query("SELECT nid FROM {node} WHERE nid = :nid", array(':nid' => $value))->fetchField();
break;
case 'title':
$nid = db_query("SELECT nid FROM {node} WHERE title = :title AND type = :type", array(':title' => $value, ':type' => $this->config['content_type']))->fetchField();
break;
case 'feeds_source':
if ($id = feeds_get_importer_id($this->config['content_type'])) {
$nid = db_query("SELECT fs.feed_nid FROM {node} n JOIN {feeds_source} fs ON n.nid = fs.feed_nid WHERE fs.id = :id AND fs.source = :source", array(':id' => $id, ':source' => $value))->fetchField();
}
break;
}
if ($nid) {
// Return with the first nid found.
return $nid;
}
}
return 0;
}

}

  • 从 FeedsProcessor 复制 Process 和 newItemInfo 函数。
  • 重写 newItemInfo 如下:

protected 函数 newItemInfo($entity, $feed_nid, $hash = '') {

$entity->feeds_item = new stdClass();
$entity->feeds_item->entity_id = 0;
$entity->feeds_item->entity_type = $this->entityType();
// Specify the feed id, otherwise pure_feed's entries in the feeds_item table will be changed to harvard_format
$entity->feeds_item->id = ($this->id == "harvard_format") ? "pure_feed" : $this->id;
$entity->feeds_item->feed_nid = $feed_nid;
$entity->feeds_item->imported = REQUEST_TIME;
$entity->feeds_item->hash = $hash;
$entity->feeds_item->url = '';
$entity->feeds_item->guid = '';

}

关于Drupal - 2 个单独的提要更新同一组节点(提要模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13800697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com