プログラムでサイトのロゴを設定して、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';
}
何か助けは?
。theme前処理機能でサイトのロゴを変更するには?
サイトのロゴはページテンプレートにありません。ブランドブロックで変更できます。
function mytheme_preprocess_block(&$variables) {
if ($variables['base_plugin_id'] == 'system_branding_block') {
$variables['site_logo'] = '/newlogo.jpg';
}
}
キャッシュ
URL引数に基づいてロゴを変更する必要があると述べました。テンプレートはレンダーアレイをレンダリングせず、3つの変数のコンテンツのみを転送するため、システムブランドブロックでこれを行うのは困難です。したがって、キャッシュメタデータを追加しようとしても無駄です。
2つのオプションがあります。独自のサイトロゴブロックプラグインをモジュールに実装するか、このテーマのみのソリューションを使用します。
$variables['logo']
page.html.twig:
<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}">
<img src="{{ logo }}" alt="{{ 'Home'|t }}" />
</a>
ページテンプレートでこれを行うことで、ページが各URLに対して既に個別にキャッシュされているため、キャッシュの問題を回避できます。
キャッシュが必要な場合は、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;
}
_