web-dev-qa-db-ja.com

プログラムで現在のマルチサイトインスタンス名を取得する

次のマルチサイト設定があるとします。

$sites['hello-world-a.com']       = 'a';
$sites['stage.hello-world-a.com'] = 'a';
$sites['dev.hello-world-a.com']   = 'a';
$sites['hello-world-a.localhost'] = 'a';

$sites['hello-world-b.com']       = 'b';
$sites['stage.hello-world-b.com'] = 'b';
$sites['dev.hello-world-b.com']   = 'b';
$sites['hello-world-b.localhost'] = 'b';

正常に動作します。どちらも同じテーマを共有し、多かれ少なかれ同じ機能を共有しています。ここで、本文にCSSクラスを追加する非常に単純な前処理関数があるとします。

/**
 * Implements template_preprocess_html().
 */
function MYTHEME_preprocess_html(&$variables) {

  $variables['attributes']['class'][] = 'foo';

}

マルチサイトインスタンスの名前をボディクラスとして動的に追加するにはどうすればよいですか?

  • 可能なすべてのドメイン名と文字列の比較を行わずに?
  • また、人間が読めるサイト名を使用せずに、変更される可能性はありますか?
  • たぶん cache contexts
  • またはUUID?

/**
 * Implements template_preprocess_html().
 */
function MYTHEME_preprocess_html(&$variables) {

  $variables['attributes']['class'][] = 'foo';

  // Basically along the following pattern.
  if ( @@@ SITE A @@@ ) {
    $variables['attributes']['class'][] = @@@ SITE A @@@;
  }

}
1
leymannx

現在の DrupalKernel::findSitePath を使用して一致するマルチサイトディレクトリのパスを返す $request について教えてくれた@Cliveに感謝します。

そして、そのための service もあるというヒントを@ 4k4に感謝します:

/**
 * Implements template_preprocess_html().
 */
function MYTHEME_preprocess_html(&$variables) {

  $site_path = \Drupal::service('site.path'); // e.g.: 'sites/default'    
  $site_path = explode('/', $site_path);
  $site_name = $site_path[1];

  $variables['attributes']['class'][] = 'site-' . $site_name;

}
6
leymannx