Bạn không biết khi nào mẫu HTML được hiển thị cho dù một khía cạnh có hoạt động hay không. Vì vậy, trong mytheme_pre process_html() giả sử không phải vậy:
$variables['attributes']['class'][] = 'facet-is-not-active-class';
Trong khối khía cạnh, hãy thay thế lớp trình giữ chỗ nếu khối đó hiển thị:
function mytheme_pre process_block(&$variables) {
if ($variables['configuration']['provider'] == 'facets') {
if (!in_array('hidden', (array) $variables['attributes']['class'])) {
$variables['#attached']['placeholders']['facet-is-not-active-class'] = [
'#markup' => 'kích hoạt khía cạnh',
];
}
}
}
Quan trọng là chuỗi giữ chỗ facet-is-not-active-class
là duy nhất, hãy sử dụng tên dài hơn hoặc thậm chí là hàm băm. Trình giữ chỗ được thay thế cho tất cả các lần xuất hiện của chuỗi trên trang.
Sự cố với trình giữ chỗ lồng nhau
Điều này chỉ hoạt động đối với các khối không được giữ chỗ tự động. Thật không may, khối khía cạnh luôn được giữ chỗ. Nó đặt tuổi tối đa của bộ đệm là 0, đáp ứng điều kiện mặc định cho giữ chỗ tự động. Nhìn thấy https://www.drupal.org/docs/drupal-apis/render-api/auto-placeholdering#s-what
Để ngăn chặn điều đó, bạn có thể đặt #create_placeholder thành FALSE:
/**
* Triển khai hook_block_build_BASE_BLOCK_ID_alter().
*/
function mymodule_block_build_facet_block_alter(mảng &$build, \Drupal\Core\Block\BlockPluginInterface $block) {
$build['#create_placeholder'] = FALSE;
}
Hãy cẩn thận: Đây là một kẻ giết người hiệu suất thực sự, nó tăng gấp đôi thời gian tải trang trong các thử nghiệm của tôi. Vì vậy, nếu hiệu suất là quan trọng, có lẽ bạn nên tìm giải pháp phía máy khách, CSS tốt hơn hoặc thư viện javascript có thêm các lớp cần thiết.