Переопределяем заданные кодом Views и Rules

Модуль 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 мог бы, хотя бы в виде подмодуля со специальным предупреждением, автоматически проделывать описанное. Но пока не может, увы.

Комментарии