А вот подумалось.
Уже пару раз сталкивалась с такой ситуацией, когда я что-нить ковыряю на сайте, настраиваю блоки разные и тут, когда уже куча блоков выведена, мне приходит идея (или появляется необходимость) поменять тему оформления.
Ну, и сами понимаете. В новой теме все блоки оказываются выключенными и надо их "распихивать" снова по регионам.
А вот как бы такой скриптик написать, чтобы проставил соответствия регионов (например, все, что в тебе "А" находится в регионе "правый сайдбар", в теме "Б" попадало в регион "правый сбоку"), а потом нажал кнопочку и фуух, все блоки сами стали на места.
Уверена, такое можно просто написать, главное натолкните на мысль, где инфа по блокам-темам-регионам содержится?
Ответы
Данные по расположению каждого блока в каждой теме находятся в таблице 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();
}
}
Код не тестировал, поэтому аккуратнее :-)
Вроде так и происходит. Когда в первый раз включаете тему друпал расставляет блоки в соответствии с настройками текущей активной темы при условии что названия регионов совпадают в обеих темах.
Ну если стилями неасилить - то да - так и делается
так в том и дело - скрипт на случай, если не совпадают названия регионов (а они не совпадают очень часто)
по-моему инфа о расположении блоков должна оставаться если не отключать темы а только менять тему по умолчанию.
и еще предложение темы делать на базовой теме с подтемами, например AdaptiveTheme - использовать базовой, и варианты оформления создавать как подтемы. тогда с переклюением должно нормально конвертироваться информация о расположении блоков без скриптов. по-моему скрипт для нескольких перетаскиваний это неправильно. лучше ограничить ваши потребности в частой смене тем или использовать базовую + подтемы
Так и есть. Просто тут речь о том, что если блок установлен в правую колонку в одной теме, это не значит, что он установится в правую колонку в другой теме. И чтобы не тыкать настройки каждого блока, надо как-то автоматизировать.
понятно. разработчица организует удобства своего мировосприятия
Да ну?
С чего бы это?
или тут вы сравниваете двухколоночный и 88-колоночный шаблон? ... ))
Вообще "смену настроения" лучше корректировать стилями, а не темами
в большинстве сюжетов - это вполне реально
время на корректировку и проверку скрипта под разные шаблоны будет больше, чем растащить блоки в другой теме.
ой. ну вы дали. :) еще и код написали.
Спасибо большое