web-dev-qa-db-ja.com

前処理機能でサイトのロゴを変更するにはどうすればよいですか?

プログラムでサイトのロゴを設定して、URL引数に基づいてロゴを変更できるようにしたいと考えています。

MYTHEME.themeの次のコードで$variables['logo_img']['#uri']を設定できますが、それでも表示されるロゴは変わりません。

レジストリをクリアしました。

私は自分のロゴを設定し、テーマ設定UIでデフォルトのロゴ設定を使用してみました:

function THEME_preprocess_page(&$variables) {
  $variables['logo_img']['#uri'] = 'http://newlogo.jpg'; }

私もこれを試しました:

function THEME_preprocess_page(&$variables) {
  global $base_url, $base_path;
  $variables['logo'] = $base_url . $base_path . drupal_get_path('theme','THEME') . '/images/logos/newlogo.svg';
}

何か助けは?

3
petergus

。theme前処理機能でサイトのロゴを変更するには?

サイトのロゴはページテンプレートにありません。ブランドブロックで変更できます。

function mytheme_preprocess_block(&$variables) {
  if ($variables['base_plugin_id'] == 'system_branding_block') {
    $variables['site_logo'] = '/newlogo.jpg';
  }
}

キャッシュ

URL引数に基づいてロゴを変更する必要があると述べました。テンプレートはレンダーアレイをレンダリングせず、3つの変数のコンテンツのみを転送するため、システムブランドブロックでこれを行うのは困難です。したがって、キャッシュメタデータを追加しようとしても無駄です。

2つのオプションがあります。独自のサイトロゴブロックプラグインをモジュールに実装するか、このテーマのみのソリューションを使用します。

  • ブランディングブロックでサイトのロゴを無効にする
  • ページの前処理でロゴのURLを変数に設定します$variables['logo']
  • 独自のマークアップをページに追加するtwig to the site logoを出力する

page.html.twig:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}">
   <img src="{{ logo }}" alt="{{ 'Home'|t }}" />
</a>

ページテンプレートでこれを行うことで、ページが各URLに対して既に個別にキャッシュされているため、キャッシュの問題を回避できます。

4
4k4

キャッシュが必要な場合は、hook_block_view_system_branding_block_alter()からのpre_renderコールバックを使用して行うことができます。このコールバックでは、_$build['content']['site_logo']['#uri']_を設定し、キャッシュメタデータを追加します。これにより、システムブランドブロックのロゴが上書きされ、キャッシュが保持されます。

以下は、Drupalの color module からの抜粋であり、このメソッドを正確に使用しています。

おそらくキャッシングには次のようなものが必要です:

_CacheableMetadata::createFromRenderArray($build)
  ->addCacheContexts(['url.query_args'])
  ->applyTo($build);
_

ロゴのパスは_$build['content']['site_logo']['#uri']_で定義できます。

完全なコード:

_/**
 * Implements hook_block_view_BASE_BLOCK_ID_alter().
 */
function color_block_view_system_branding_block_alter(array &$build, BlockPluginInterface $block) {
  $build['#pre_render'][] = 'color_block_view_pre_render';
}

/**
 * #pre_render callback: Sets color preset logo.
 */
function color_block_view_pre_render(array $build) {
  $theme_key = \Drupal::theme()->getActiveTheme()->getName();
  $config = \Drupal::config('color.theme.' . $theme_key);
  CacheableMetadata::createFromRenderArray($build)
    ->addCacheableDependency($config)
    ->applyTo($build);

  // Override logo.
  $logo = $config->get('logo');
  if ($logo && $build['content']['site_logo'] && preg_match('!' . $theme_key . '/logo.svg$!', $build['content']['site_logo']['#uri'])) {
    $build['content']['site_logo']['#uri'] = file_url_transform_relative(file_create_url($logo));
  }

  return $build;
}
_
2
Neograph734