如何在自定义模块中使用node_save()和node_autotitle模块保存节点?

时间:2013-02-18 11:03:05

标签: drupal-7 nodes

我正在编写一个Drupal自定义模块,我在其中根据自定义值创建节点。这是以适当方式创建节点的代码。

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设置保存节点吗?

1 个答案:

答案 0 :(得分: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()以保存新标题。