web-dev-qa-db-ja.com

プログラムで作成されたノードにプログラムでパスエイリアスを追加することは可能ですか?

さまざまなAPIから情報をフェッチすることによってノードにデータを取り込むモジュールに保存前フックを作成しました。しかし、新しく作成されたノードにノードエイリアスを追加する方法については思いつきません。関数やモジュールなどはありますか(Drupal 7にはpath_autoがありましたか)?それとも、url_aliasにそのまま挿入する必要がありますか?そんな思い切った動きで足元を撃ってみませんか?

11
Bogdan Kuštan

エイリアスを作成するには、まずユーザーインターフェイスでエイリアスが設定されているかどうかを確認し、空の場合はlabel()を使用して手動で設定します。

use Drupal\Core\Entity\EntityInterface;

/**
 * hook_entity_insert
 */
function mymodule_entity_insert(EntityInterface $entity) {
    // Convert to lowercase, trim spaces, replace spaces with underscore and then truncate to 60 chars.
    $pathTitle = substr(str_replace(" ","_",trim(strtolower($entity->label()))),0,60);
    if ($entity->toArray()['path'][0]['alias'] == "") {
        $path = \Drupal::service('path.alias_storage')->save("/node/" . $entity->id(), "/mynewpath/" . $pathTitle, "en");
    }
}

https://www.drupal.org/node/1853148 詳細情報

11
Jason Pascoe

Drupal 8.8以降)、パスのエイリアスがエンティティになり、新しいエイリアスの作成方法が変更されました。

プログラムでエイリアスを保存するには、次の操作を実行できます。

$path_alias = \Drupal\path_alias\Entity\PathAlias::create([
  'path' => '/unaliased/path',
  'alias' => '/aliased/path',
]);

$path_alias->save();
2
Jaypan

クリーンな文字列を取得するには、Pathautoモジュールからこの関数を使用できます。

$clean_string = \Drupal::service('pathauto.alias_cleaner')->cleanString('Your very dirty string, with many URL un-friendly parts!');

ソース: Drupal:URLで使用するために文字列をクリーンアップ

2
alperbalkaya

pathautoの非公式ポート モジュールを維持しています。 here から取得できるtoken.moduleも必要です。自己責任で使用してください。構成構造が変更されたり、コアの更新によりモジュールが一時的に破損する可能性があります。

これら2つのモジュールをdrupal.orgに戻す作業が始まったばかりです。

1
Berdir

また、カスタムコンテンツエンティティに移動して、URLパスエイリアスをフォームに追加する場合も...

するだけ

/**
 * Implements hook_entity_base_field_info().
 */
function YOURMODULE_entity_base_field_info(EntityTypeInterface $entity_type) {
 if (in_array($entity_type->id(), ['ENTITYID'], TRUE)) {
$fields['path'] = BaseFieldDefinition::create('path')
  ->setLabel(t('URL alias'))
  ->setTranslatable(TRUE)
  ->setDisplayOptions('form', [
    'type' => 'path',
    'weight' => 30,
  ])
  ->setDisplayConfigurable('form', TRUE)
  ->setComputed(TRUE);

  return $fields;
}

}

0
Taggart Jensen