Вы здесь

Как автоматически "перекинуть" включенные блоки из одной темы в другую

0

А вот подумалось.
Уже пару раз сталкивалась с такой ситуацией, когда я что-нить ковыряю на сайте, настраиваю блоки разные и тут, когда уже куча блоков выведена, мне приходит идея (или появляется необходимость) поменять тему оформления.
Ну, и сами понимаете. В новой теме все блоки оказываются выключенными и надо их "распихивать" снова по регионам.
А вот как бы такой скриптик написать, чтобы проставил соответствия регионов (например, все, что в тебе "А" находится в регионе "правый сайдбар", в теме "Б" попадало в регион "правый сбоку"), а потом нажал кнопочку и фуух, все блоки сами стали на места.
Уверена, такое можно просто написать, главное натолкните на мысль, где инфа по блокам-темам-регионам содержится?

Версия Drupal: 
7.x
Категория: 
Block API
Вопрос задан 14.08.2015 - 21:57

Ответы

1

Данные по расположению каждого блока в каждой теме находятся в таблице block.
Вот, например, по блоку login:

Наверняка можно сделать через API друпала, но, мне кажется, легче написать скрипт, который будет ходить по базе, проверять регион блока в одной теме, и устанавливать регион для другой.

Примерно так:

$old_theme = 'название_старой_темы';
$new_theme = 'название_новой_темы';

// Массив соответствия: 
// 'регион_старой_темы' => 'регион_новой_темы'
$region_relations = array(
  'left_sidebar' => 'first_sidebar',
  'right_sidebar' => 'second_sidebar',
  '-1' => '-1' // скрытые блоки устанавливаем также скрытыми
);

// Достаем данные о регионах каждого блока в старой теме    
$blocks = db_select('block', 'b')
  ->fields('b', array('module', 'delta', 'region', 'weight'))
  ->condition('theme', $old_theme)
  ->execute()
  ->fetchAll();

// Устанавливаем регион для новой темы
foreach ($blocks as $key => $value) {
  if(isset($region_relations[$value->region])) { // если есть установленное соответствие
    db_update('block')
      ->fields(array(
        'region' => $region_relations[$value->region],
        'weight' => $value->weight  // вес тоже учтем
      ))
      ->condition('module', $value->module)
      ->condition('delta', $value->delta)
      ->condition('theme', $new_theme)
      ->execute();
  }
}

Код не тестировал, поэтому аккуратнее :-)

Ответ дан 14.08.2015 - 22:40

по-моему инфа о расположении блоков должна оставаться если не отключать темы а только менять тему по умолчанию.
и еще предложение темы делать на базовой теме с подтемами, например AdaptiveTheme - использовать базовой, и варианты оформления создавать как подтемы. тогда с переклюением должно нормально конвертироваться информация о расположении блоков без скриптов. по-моему скрипт для нескольких перетаскиваний это неправильно. лучше ограничить ваши потребности в частой смене тем или использовать базовую + подтемы

Комментарий оставлен 14.08.2015 - 23:05

по-моему инфа о расположении блоков должна оставаться если не отключать темы а только менять тему по умолчанию

Так и есть. Просто тут речь о том, что если блок установлен в правую колонку в одной теме, это не значит, что он установится в правую колонку в другой теме. И чтобы не тыкать настройки каждого блока, надо как-то автоматизировать.

Комментарий оставлен 14.08.2015 - 23:14

понятно. разработчица организует удобства своего мировосприятия

Комментарий оставлен 15.08.2015 - 00:08

Просто тут речь о том, что если блок установлен в правую колонку в одной теме, это не значит, что он установится в правую колонку в другой теме

Да ну?
С чего бы это?
или тут вы сравниваете двухколоночный и 88-колоночный шаблон? ... ))

Вообще "смену настроения" лучше корректировать стилями, а не темами
в большинстве сюжетов - это вполне реально

время на корректировку и проверку скрипта под разные шаблоны будет больше, чем растащить блоки в другой теме.

Комментарий оставлен 15.08.2015 - 03:48

ой. ну вы дали. :) еще и код написали.
Спасибо большое

Комментарий оставлен 15.08.2015 - 09:08
0

Вроде так и происходит. Когда в первый раз включаете тему друпал расставляет блоки в соответствии с настройками текущей активной темы при условии что названия регионов совпадают в обеих темах.

Ответ дан 15.08.2015 - 10:46
Аватар пользователя Chi
Chi
68

Ну если стилями неасилить - то да - так и делается

Комментарий оставлен 15.08.2015 - 17:36

так в том и дело - скрипт на случай, если не совпадают названия регионов (а они не совпадают очень часто)

Комментарий оставлен 17.08.2015 - 11:59