2013-02-18 81 views
0

我正在寫一個Drupal自定義模塊,其中我創建了一個基於自定義值的節點。這是以適當方式創建節點的代碼。如何使用自定義模塊中的node_save()和node_autotitle模塊保存節點?

global $user; 
$node = new stdClass(); 
$node->type = 'my_node_type'; 
//$node->title = $nodeInfo->title; 
node_object_prepare($node); 
$node->language = LANGUAGE_NONE; 
$node->uid = $user->uid;  
$node->field_node_refrence_field['und'][0]['nid'] = $nid-of-reference-field; 
$node = node_submit($node); 
node_save($node); 

我爲此內容類型啓用了Node Autotitle模塊。因此,標題顯示爲空白。我已經檢查了模塊,並且我發現auto_nodetitle_set_title($node)設置了標題。當我在我的代碼中使用這個函數時,沒有任何反應。

任何人都可以給我一個關於如何使用node_autotitle設置保存節點的想法嗎?

+0

你應該告訴你如何調用'auto_nodetitle_set_title()'。該函數總是設置標題,除非Drupal沒有關於內容類型的任何信息,否則該標題不能爲空。 – kiamlaluno 2013-02-20 09:18:17

回答

1

auto_nodetile_set_title()執行的代碼如下所示。 (代碼的註釋部分是我的。)

$types = node_type_get_types(); 
    $pattern = variable_get('ant_pattern_' . $node->type, ''); 

    // (1) 
    if (trim($pattern)) { 
    $node->changed = REQUEST_TIME; 
    $node->title = _auto_nodetitle_patternprocessor($pattern, $node); 
    } 

    // (2) 
    elseif ($node->nid) { 
    $node->title = t('@type @node-id', array('@type' => $types[$node->type]->name, '@node-id' => $node->nid)); 
    } 

    // (3) 
    else { 
    $node->title = t('@type', array('@type' => $types[$node->type]->name)); 
    } 
    // Ensure the generated title isn't too long. 
    $node->title = substr($node->title, 0, 255); 
    // With that flag we ensure we don't apply the title two times to the same 
    // node. See auto_nodetitle_is_needed(). 
    $node->auto_nodetitle_applied = TRUE; 

如果存在該內容類型的標題的設置,則執行第一個控制語句。如果沒有,並且您正在更新模塊,則執行第二個控制語句,否則將執行第三個控制語句。

標題不應該爲空,因爲模塊始終設置它。唯一可能是空的是Drupal沒有關於節點使用的內容類型的信息;在這種情況下,$types[$node->type]將爲NULL,但$types[$node->type]->name會引發錯誤「試圖訪問不是對象的某個屬性的屬性」。

我會使用下面的代碼來保存節點。

global $user; 

$node = new stdClass(); 
$node->type = 'my_node_type'; 
node_object_prepare($node); 

$node->uid = $user->uid;  

$node->language = LANGUAGE_NONE; 
$node->field_node_refrence_field[$node->language][0]['nid'] = $nid-of-reference-field; 

$node = node_submit($node); 
node_save($node); 
auto_nodetitle_set_title($node); 
node_save($node); 

由於要保存一個新的節點,稱auto_nodetitle_set_title()node_save()不會允許函數來執行標有(2)的代碼,並使用節點ID爲標題。一旦調用auto_nodetitle_set_title(),您需要撥打node_save()來保存新標題。