現在、データベースからデータをインポートして、それらに基づいてノードを作成しています。私のノード保存コードは次のようになります
$node = \Drupal\node\Entity\Node::create([
'type' => 'issue',
'title' => $title,
'body' => $body,
'field_issue_category' => $term,
'field_issue_type' => 'publication',
'field_pub_id' => [
'target_id' => $publication_id,
],
'field_issue_group' => $group_id,
'field_date' => $date,
]);
$node->save();
このノードのタイトルに基づいてURLエイリアスを作成したいのですが、これは次のように作成します。
$nid = $node->id();
$title = preg_replace("/[\s_]/", "-", $title);
$path = \Drupal::service('path.alias_storage')->save('/node/'.$nid, '/mypath/'.$title);
これにより、URLエイリアス構成のURLエイリアスリストに表示されるURLエイリアスが正常に作成されます。ただし、ノード編集ページのURLエイリアスフィールドには表示されません。
これは問題を引き起こします。 1つは、ユーザーは実際のエイリアスが何であるかを確認できないことです。また、そのタイプのすべてのノードをページのリストに配置するブロックプラグインがあります。また、そのノードのURLも表示します。 「/ mypath/title」のようなエイリアスで表示されるURLを希望しますが、Drupalは「/ node/nid」パスについてのみ認識しているようです。
プログラムでノードのURLエイリアスを設定して、URLエイリアスフィールドに表示されるようにする適切な方法はありますか?
ノードウィジェットは現在、ノードと同じlangcodeを持つエイリアスのみを表示します。 https://www.drupal.org/node/2511968 はそれを変更し、特定の言語のないエイリアスも表示します。
しかし、エイリアスもサイトで機能しない場合、それは他の何かのようにも聞こえますが、まだ正しくありません。 UIで手動でエイリアスを作成した場合、そのブロックで機能しますか?その場合は、url_aliasテーブルの2つのレコードを比較して、違いがわかりますか?
ノードの保存の一部としてエイリアスを作成できます。パスの疑似/計算フィールドがあります。これを配列に追加してみてください:
'path' => [
'alias' => '/mypath/' . $title,
'pathauto' => PathautoState::SKIP,
]
これにより、エイリアスも正しく作成されます。
そして最後に、エイリアスが非常に予測可能な場合は、 Pathauto を確認する必要があります。これにより、エイリアスを作成するためのルールを設定できます。特に、特殊文字と重複を処理するためのロジックがたくさんあります。たとえば、同じタイトルの2つのノードがある場合、コードに問題があります。