0

我有一个 Drupal 内容类型,其中包含许多计算字段。一些(但不是全部)项目正在通过 cron 触发的 RSS 提要导入器添加到此内容类型。我正在尝试为 hook_cron 中的新项目触发计算字段生成。以下代码抓取所有未标记为“已提交”的项目,加载并重新保存节点,然后将节点标记为“已提交”。

$query = db_select('node', 'n');
$query->fields('n', array('nid'));
$table_alias = $query->join('field_data_field_submitted', 'r', 'n.nid = r.entity_id AND r.field_submitted_value = 0');
$result = $query->execute();
foreach ($result as $record){
    $q = $record->nid;
    $n = node_load($q);
    node_save($n);
    $query = db_update('field_data_field_submitted')
        ->fields(array('field_submitted_value' => 1))
        ->condition('entity_id', $q)
        ->execute();
}

如果我从模块生成的页面(使用带有页面回调函数的 hook_menu 创建)调用此代码,则此代码的工作方式与我期望的一样。重新提交节点,并生成计算域数据。当我将此代码放在我的 hook_cron 函数中时,查询工作,它遍历记录并更新“提交”值,但不计算计算字段。我很困惑为什么这不会在 cron 中触发。有什么帮助吗?

4

2 回答 2

1

嗬!终于意识到这完全是我自己做的。由于这种内容类型的性质,我们允许匿名用户创建新内容,但在创建内容时明确不触发计算字段(长话短说,但简短的形式是经过身份验证的用户然后验证并增强此内容,这是计算字段的来源)。因此,当我设置初始内容时,我禁用了匿名用户的计算字段(如果 $user->uid > 0),并且完全忘记了这一点。一旦我调整了该逻辑以允许在导入时处理计算字段(使用具有导入内容值的字段来触发它,但不用于其他内容),问题就解决了。

于 2012-08-08T16:42:43.537 回答
0

cron 运行可以访问完整的引导程序,因此没有合乎逻辑的理由说明您的代码在该上下文中会产生不同的结果。

也就是说,您仅field_data_field_submitted在还需要更新表时才更新field_revision_field_submitted表,因此这可能会以某种方式解释差异。

Drupal 为现场系统提供了一个 API,这样就可以完全避免这类问题。您使用的相同代码,以“Drupal”方式重写,将是:

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->fieldCondition('field_submitted', 'value', 0);

$results = $query->execute();

if (!empty($results['node'])) {
  $nodes = node_load_multiple(array_keys($results['node']));

  foreach ($nodes as $node) {
    $node->field_submitted[$node->language][0]['value'] = 1;
    node_save($node);
  }
}

我想不出为什么上面的代码会在 cron 上失败的充分理由,所以可能值得试一试。

于 2012-07-19T17:27:43.700 回答