Drupal 7 node_save在cron期间不保存计算字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Drupal 7 node_save在cron期间不保存计算字段相关的知识,希望对你有一定的参考价值。

我有一个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中被触发。有帮助吗?

答案

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

另一答案

cron run可以访问完整的bootstrap,因此没有合理的理由说明为什么你的代码会在该上下文中产生不同的结果。

也就是说,当你还需要更新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上失败的一个很好的理由,所以它可能值得给它一个旋转。

以上是关于Drupal 7 node_save在cron期间不保存计算字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Views 模块(Drupal 7)显示 php 数组

在站点维护期间登录到Drupal

在 Drupal 的 UberCart 结帐期间重定向到注册页面而不是登录页面?

错误在cron数据库备份期间传递的NULL pam句柄

如何在部署期间保持数据同步?

常用CRON表达式合集