我有一个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上失败的一个很好的理由,所以它可能值得给它一个旋转。