2012-07-19 88 views
0

我有一個包含大量計算字段的Drupal內容類型。一些(但不是全部)項目正通過cron觸發的RSS源導入器添加到此內容類型中。我試圖爲hook_cron中的新項目觸發計算字段生成。以下代碼抓取所有未標記爲「已提交」的項目,加載並重新保存該節點,然後將節點標記爲「已提交」。Drupal 7 node_save在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中觸發。任何幫助?

回答

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的失敗,要麼所以它可能是值得給它旋轉。

+0

感謝代碼提示 - 我將使用實體字段查詢向前移動。不幸的是,我仍然看到相同的行爲 - 這個代碼作爲模塊生成頁面的一部分完全工作。當包含在hook_cron中時,它會更改提交的值,但不會觸發計算字段的計算... – Zeth 2012-07-19 21:16:15

+0

我甚至嘗試將代碼放置在模塊生成的頁面中,然後使用drupal_http_request觸發該頁面。相同的行爲 - 更新field_submitted,但不會觸發計算字段... – Zeth 2012-07-19 21:21:42

1

Doh!終於意識到這完全是我自己的做法。由於這種內容類型的性質,我們允許匿名用戶創建新內容,但在創建內容時明確不會觸發計算字段(長話短說,但簡短的形式是經過驗證的用戶隨後驗證&增強了此內容,這是計算字段的來源)。因此,在設置初始內容時,我禁用了匿名用戶的計算字段(如果$ user-> uid> 0),並且完全忘記了這一點。一旦我調整了邏輯以允許在導入時處理計算字段(通過一個具有導入內容值但不包含其他內容的字段觸發它),問題就解決了。