web-dev-qa-db-ja.com

ブロックの動的重み

ページリクエストごとにサイドバーのブロックの重みを変更したいので、リクエストごとにブロックの位置が変更されます。

それを行う方法はありますか?

1
Leopathu

Drupal 8は、リージョンを変更するフックを提供しています template_preprocess_region 、theme_regionに値を準備します。THEMENAME.themeファイルに次のコードを追加すると、問題が解決します。

function themename_preprocess_region(&$variables) {
  if ($variables['region'] == 'sidebar_second') {
    $variables['elements'] = shuffle_assoc($variables['elements']);
    $content = '';
    foreach ($variables['elements'] as $key => $value) {
      if (is_array($variables['elements'][$key])) {
        $content .= \Drupal::service ('renderer')->render($value);
      }
    }
    $variables['content'] = array(
      '#markup' => $content,
    );
  }
}

function shuffle_assoc($list) {
  if (!is_array($list)) {
    return $list;
  }

  $keys = array_keys($list);
  shuffle($keys);
  $random = array();
  foreach ($keys as $key) {
    $random[$key] = $list[$key];
  }
  return $random;
}

詳細は こちら を確認してください

1
Leopathu

Drupal 7の場合、 hook_block_list_alter のようなものを使用して、ページ上のブロックを変更できます。何かを使用することもできます like that これを機能させるために。

または、Drupal 8の場合も同様です。これらのブロックに表示しているものをすべて含む(ブロック)ビューを1つのブロックに作成し、randonlyで並べ替えることができます。

0
webmaniac