0

カスタム値に基づいてノードを作成する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);

このコンテンツタイプに対してノード自動タイトルモジュールを有効にしました。そのため、タイトルは空白で表示されます。モジュールを確認したところauto_nodetitle_set_title($node)、タイトルが設定されていることがわかりました。コードでこの関数を使用しても、何も起こりません。

node_autotitle設定でノードを保存する方法について誰かに教えてもらえますか?

4

1 に答える 1

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;

そのコンテンツ タイプのタイトルの設定がある場合、最初の制御ステートメントが実行されます。存在せず、モジュールを更新している場合は、2 番目の制御ステートメントが実行されます。それ以外の場合は、3 番目のステートメントが実行されます。

モジュールが常にタイトルを設定するため、タイトルを空にすることはできません。唯一空になるのは、ノードに使用されるコンテンツ タイプに関する情報が 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()

于 2013-02-20T09:34:37.883 に答える