さまざまなAPIから情報をフェッチすることによってノードにデータを取り込むモジュールに保存前フックを作成しました。しかし、新しく作成されたノードにノードエイリアスを追加する方法については、思いつきません。関数やモジュールなどはありますか(Drupal 7にはpath_autoがありましたか)?それとも生のインサートに行くべきurl_alias
ですか?そんな思い切った動きで足元を撃ってみませんか?
さまざまな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を使用すると、次のようになります(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)
クリーンな文字列を取得するには、Pathautoモジュールからこの関数を使用できます。
$clean_string = \Drupal::service('pathauto.alias_cleaner')->cleanString('Your very dirty string, with many URL un-friendly parts!');
pathautoモジュールの非公式な移植を維持しています。また、ここから取得できる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;
}
}