从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()
beforenode_save()
将不允许该函数执行标有 (2) 的代码,并使用节点 ID 作为标题。一旦auto_nodetitle_set_title()
被调用,您需要调用node_save()
以保存新标题。