さまざまなAPIから情報をフェッチすることによってノードにデータを取り込むモジュールに保存前フックを作成しました。しかし、新しく作成されたノードにノードエイリアスを追加する方法については思いつきません。関数やモジュールなどはありますか(Drupal 7にはpath_autoがありましたか)?それとも、url_alias
にそのまま挿入する必要がありますか?そんな思い切った動きで足元を撃ってみませんか?
エイリアスを作成するには、まずユーザーインターフェイスでエイリアスが設定されているかどうかを確認し、空の場合は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");
}
}
Drupal 8.8以降)、パスのエイリアスがエンティティになり、新しいエイリアスの作成方法が変更されました。
プログラムでエイリアスを保存するには、次の操作を実行できます。
$path_alias = \Drupal\path_alias\Entity\PathAlias::create([
'path' => '/unaliased/path',
'alias' => '/aliased/path',
]);
$path_alias->save();
クリーンな文字列を取得するには、Pathautoモジュールからこの関数を使用できます。
$clean_string = \Drupal::service('pathauto.alias_cleaner')->cleanString('Your very dirty string, with many URL un-friendly parts!');
pathautoの非公式ポート モジュールを維持しています。 here から取得できるtoken.moduleも必要です。自己責任で使用してください。構成構造が変更されたり、コアの更新によりモジュールが一時的に破損する可能性があります。
これら2つのモジュールをdrupal.orgに戻す作業が始まったばかりです。
また、カスタムコンテンツエンティティに移動して、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;
}
}