web-dev-qa-db-ja.com

プログラムでURLエイリアスを変更する

タイプがリストテキストのフィールドに基づいてURLエイリアスを作成するようにパターンを設定しています。

フィールドは次のようになります。

選択1 |選択1

選択2 |選択2

エイリアスを変更して、次のように表示するにはどうすればよいですか。

www.example.com/selection-1ではなくwww.example.com/1-was-selected

更新:私はパターンにPathautoを使用しています。

2
Florin Simion

カスタムトークンを作成し、エイリアスで使用します。 pathauto を使用してエイリアスを作成していることを前提としています。 このページ は、独自のトークンを作成する方法のかなり良い例を示しています。次に、pathauto UIでトークンを選択できます。

hook_tokens_info フックは基本的に作成したとおりに作成できますが、「カスタム」を実際の値に置き換えます。 hook_tokens の実装では、_$data_変数のエンティティにアクセスできる必要があります。つまり、これをノードに使用している場合、_$data['node']_はノードオブジェクトを持ちます。そこから$data['node']->field_your_list_field->getValue()のようなことを実行して、フィールドの値を取得できます。 _$replacements_配列を返すようにしてください。ここで、キーはcustom_token、値は置き換える値です。この場合、これは_you-selected-value-X_のようになります。

3
sonfd

この場合、customeモジュールでトークンを作成する必要があると思います。 Todoなので、 hook_token_info() を実装してから hook_tokens() を実装する必要があります。

または、 hook_tokens_alter() を見て、パターンで実際に使用しているトークンをターゲットにして、レンダリングを変更することもできます。

durpal.orgの例:

function hook_tokens_alter(array &$replacements, array $context, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
  $options = $context['options'];

  if (isset($options['langcode'])) {
    $url_options['language'] = \Drupal::languageManager()->getLanguage($options['langcode']);
    $langcode = $options['langcode'];
  }
  else {
    $langcode = NULL;
  }

  if ($context['type'] == 'node' && !empty($context['data']['node'])) {
    $node = $context['data']['node'];

    // Alter the [node:title] token, and replace it with the rendered content
    // of a field (field_title).
    if (isset($context['tokens']['title'])) {
      $title = $node->field_title->view('default');
      $replacements[$context['tokens']['title']] = drupal_render($title);
    }
  }
}
2