Drupal 7节点\u保存在cron期间不保存计算字段

Drupal 7节点\u保存在cron期间不保存计算字段,drupal,cron,drupal-7,drupal-computed-field,Drupal,Cron,Drupal 7,Drupal Computed Field,我有一个Drupal内容类型,它包含许多计算字段。通过cron触发的RSS提要导入器将一些(但不是全部)项添加到此内容类型。我正在尝试为hook\u cron中的新项触发计算字段生成。下面的代码捕获所有未标记为“已提交”的项目,加载并重新保存节点,然后将节点标记为“已提交” $query = db_select('node', 'n'); $query->fields('n', array('nid')); $table_alias = $query->join('field_dat

我有一个Drupal内容类型,它包含许多计算字段。通过cron触发的RSS提要导入器将一些(但不是全部)项添加到此内容类型。我正在尝试为hook\u 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_菜单创建)调用它,则该代码的工作方式与我期望的相同。重新提交节点,并生成计算的字段数据。当我将这段代码放入hook_cron函数中时,查询工作,它在记录中循环并更新“submitted”值,但计算字段不会被计算。我不明白为什么这不会在cron中触发。有什么帮助吗

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

也就是说,当您还需要更新
field\u revision\u field\u submitted
表时,您只是在更新
field\u data\u field\u 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上也会失败,所以值得一试。

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

感谢您的代码提示-我将继续使用实体字段查询。不幸的是,尽管如此,我仍然看到了相同的行为——这段代码作为模块生成页面的一部分完全有效。当包含在hook_cron中时,它会更改提交的值,但不会触发计算字段的计算……我甚至尝试将代码放在模块生成的页面中,然后使用drupal_http_请求触发该页面。相同的行为-更新提交的字段,但不会触发计算字段。。。