web-dev-qa-db-ja.com

フォームプラグインでノードを作成するときにプログラムでURLエイリアスを設定する

現在、データベースからデータをインポートして、それらに基づいてノードを作成しています。私のノード保存コードは次のようになります

$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エイリアスフィールドには表示されません。

url alias field

これは問題を引き起こします。 1つは、ユーザーは実際のエイリアスが何であるかを確認できないことです。また、そのタイプのすべてのノードをページのリストに配置するブロックプラグインがあります。また、そのノードのURLも表示します。 「/ mypath/title」のようなエイリアスで表示されるURLを希望しますが、Drupalは「/ node/nid」パスについてのみ認識しているようです。

プログラムでノードのURLエイリアスを設定して、URLエイリアスフィールドに表示されるようにする適切な方法はありますか?

7
Matt

ノードウィジェットは現在、ノードと同じlangcodeを持つエイリアスのみを表示します。 https://www.drupal.org/node/2511968 はそれを変更し、特定の言語のないエイリアスも表示します。

しかし、エイリアスもサイトで機能しない場合、それは他の何かのようにも聞こえますが、まだ正しくありません。 UIで手動でエイリアスを作成した場合、そのブロックで機能しますか?その場合は、url_aliasテーブルの2つのレコードを比較して、違いがわかりますか?

ノードの保存の一部としてエイリアスを作成できます。パスの疑似/計算フィールドがあります。これを配列に追加してみてください:

'path' => [
  'alias' => '/mypath/' . $title,
  'pathauto' => PathautoState::SKIP,
]

これにより、エイリアスも正しく作成されます。

そして最後に、エイリアスが非常に予測可能な場合は、 Pathauto を確認する必要があります。これにより、エイリアスを作成するためのルールを設定できます。特に、特殊文字と重複を処理するためのロジックがたくさんあります。たとえば、同じタイトルの2つのノードがある場合、コードに問題があります。

10
Berdir