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


11

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


2
このタイプのモジュールのD8リリースはまだないと思います。プログラムで行うことができます。drupal.org/node/1853148を参照してください。
Sumit Madan 2015

それは私が探していたものです。
BogdanKuštan15年

ところで、あなたは、PICはあまりにもかわいい男であるプロフィール... :)
スミットマダン

回答:


11

エイリアスを作成するには、まずユーザーインターフェイスでエイリアスが設定されているかどうかを確認し、空の場合は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


4

drupal 8を使用すると、次のようになります(pathauto.moduleファイルで簡単に検索した後)。

ステップ1:ノードを作成する

$node = Node::create([
    'type' => 'article',
    'title' => 'Test article',
    'langcode' => 'en', // Get it however you want or hardcode it.
    'uid' => [USER_ID] // Get it however you want.
]);

ステップ2:ノードを保存する

$node->save();

ステップ3:パスを挿入します(pathautoモジュールがインストールされていることを確認し、特定のノードタイプのパターンを追加します)

pathauto_entity_insert($node)

プログラムでノードを更新する必要がある場合は、そのパスを更新pathauto_entity_update($node)することを忘れないでください。ノードを削除する場合は、必ずノードを削除してください(ノードを削除する前に削除してください。そうしないでください):pathauto_entity_delete($node)


drupal.stackexchange.com/questions/216972/…は私にとって欠けていたキーでした。
Francis Yaconiello、

3

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

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

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

$path_alias->save();


1

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

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


投稿にリンクを入れるのを忘れたようです:)
クリシュナモハン

drupal.stackexchange.com/questions/144227/…からの)コピーと貼り付けに失敗しました。ありがとうございます。
Berdir 2015

0

また、カスタムコンテンツエンティティに移動して、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;
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.