Модуль Features, как всем уже должно быть известно, значительно облегчает разработку всякого (особенно всякого типового) в Друпале. Для создания сборок, для переносов stage → production — модуль крайне полезен. Но в заметке речь пойдет не о том, что умеет Features, а как раз наоборот — о том, чего он не умеет.
А не умеет Features — экспортировать изменения представлений Views и правил Rules, изначально определенных в коде. Причем, не умеет он это, как говорит разработчик, by design, то есть умышленно. А это, как нетрудно догадаться, несколько мешает экспортировать результаты работы с таким, например, инструментом, как Commerce — ведь он весь напичкан рулзами и вьюхами, и некоторые из них, на мой взгляд, остро нуждаются в переопределении.
Чтобы победить это обстоятельство, придется отложить Features в сторону и писать код.
Что характерно, задача решается и для Views, и для Rules одинаково — через хуки _alter. Естественно, подразумевается, что реализацию хуков нужно вставить в модуль.
Для Views:
Чтобы Views узнал о нас, не забудем вставить в код модуля реализацию hook_views_api(). Теперь пройдем в настройку нужного представления, нажмем «Экспортировать» и скопируем текст. Затем реализуем хук hook_views_default_views_alter():
function имямодуля_views_default_views_alter(&$views) {
if (array_key_exists('имя_переопределяемого_представления', $views)) {
//Сюда (то есть вместо этого комментария) нужно вставить экспортированный текст
$views['имя_переопределяемого_представления'] = $view;
}
}
Все, представление переопределено.
Для Rules:
Пройдем к настройкам правил Rules и рядом с именем нужного нажмем «Клонировать». Скопируем получившийся текст. Теперь добавим к модулю файл имямодуля.rules_defaults.inc. В нем реализуем хук hook_default_rules_configuration_alter():
function hook_default_rules_configuration_alter(&$configs) {
$rule = 'сюда (то есть внутрь одинарных кавычек) нужно вставить экспортированный текст';
$configs['имя_переопределенного_правила'] = rules_import($rule);
}
Все, правило переопределено.
У предложенного метода есть и недостаток (если его можно так назвать). А именно — все переопределенные таким образом вьюшки и рулзы автоматически лишаются обновлений, если таковые вдруг произойдут в определивших их модулях.
К слову, модуль Features мог бы, хотя бы в виде подмодуля со специальным предупреждением, автоматически проделывать описанное. Но пока не может, увы.