Создание пользовательских команд Drush

Что такое Drush?

Drush – это удобный интерфейс командной строки для управления сайтами Drupal. Предоставляя большое количество простых команд, он способен ускорить выполнение многих заданий по управлению сайтом. Чтобы узнать о командах Drush подробнее, читайте предыдущее руководство этой серии.

Одним из важнейших преимуществ Drush является его дружественность к разработчикам. Помимо уже существующих команд можно создавать пользовательские команды, выполняющие необходимые разработчику задачи. В данном руководстве речь пойдёт о создании пользовательских команд Drush (на примере команды, которая будет публиковать все ноды заданного типа контента, указанного пользователем в качестве аргумента).

Требования

Для выполнения руководства нужно предварительно установить Drush. Рекомендуется также установить Drupal и ознакомиться с базовым кодом. Чтобы получить инструкции по установке Drush и развёртыванию сайта Drupal, читайте данное руководство.

Пользовательские команды Drush создаются в три шага:

  1. Создание файла для хранения команд и функций обратного вызова;
  2. Объявление функции команды;
  3. Объявление функции обратного вызова (функции php, которую Drush будет вызывать для выполнения действия).

1: Создание файла

На данном этапе очень важно выбрать правильное имя для файла команд и поместить этот файл в определённый каталог. Имя файла должно заканчиваться на .drush.inc (в данном руководстве файл будет называться publish.drush.inc); сам файл нужно поместить в папку пользовательского модуля сайта (модуль должен быть включен) или же в папку .drush в root-каталоге сервера.

Также нужно добавить открывающий тег PHP в верхней части файла.

2: Объявление функции команды

Чтобы объявить новую команду Drush, нужно вызвать hook_drush_command() в только что созданном файле под открывающим тегом. В данном случае это выглядит так:

function publish_drush_command() {
$items = array();
$items['publish-content'] = array(
'description' => 'Publish content',
'aliases' => array('pc'),
'arguments' => array(
'type' => 'Nodes of this type will be published',
),
);
return $items;
}

Примечание: Эта команда объявлена в файле, находящемся в папке .drush, которая располагается в root-каталоге виртуального выделенного сервера.

При помощи этой функции мы объявляем  новую команду publish-content (в массиве $items), у которой есть ряд характеристик. Содержимое строк description и arguments будет появляться на экране при запуске команды drush help publish-content. Здесь можно также задать псевдоним (или сокращение), который будет запускаться вместо полной версии команды. В данном случае сокращением команды drush publish-content будет команда drush pc.

Конечно, это далеко не всё, что можно добавить в такую функцию. Обратите внимание: здесь можно указать дополнительную функцию обратного вызова, которая будет вызвана с помощью этой команды, но если пропустить её (как в примере выше), drush_invoke () сгенерирует имя функции обратного вызова автоматически.

3: Объявление функции обратного вызова

При помощи следующей функции нужно написать код, который будет выполнять Drupal при запуске новой пользовательской команды. Имя функции нужно задать в формате:

drush_command_name

В данном случае можно использовать следующее (обратите внимание, что тире в имени команды становится символом подчеркивания в имени функции):

function drush_publish_content($type) {
$nodes = node_load_multiple(array(), array('type' => $type));
$count = 0;
foreach ($nodes as $node) {
if($node->status == 0) {
$count++;
$node->status = 1;
node_save($node);
}
}
if($count > 0) {
drush_print($count . " nodes of the " . $type . " content type have been successfully published.");
}
else {
drush_print("No nodes of the " . $type . " content type were published.");
}
}

Эта функция обратного вызова принимает в качестве аргумента тип контента всех нод, которые нужно опубликовать. Их можно как аргумент команды:

drush publish-content article

Эта команда опубликует все ноды типа article, которые на данный момент не опубликованы. Для этого она загружает все ноды этого типа при помощи функции node_load_multiple() и изменяет атрибуты статуса 0 на 1. Затем Drush выведет количество опубликованных нод (считаются только те ноды, на которые повлияла данная команда).

Кроме того, можно также создать хук проверки для отображения ошибок команды. Этот хук вызывается ещё до обработки команды Drush. В данном случае можно использовать его, чтобы убедиться, что запрашиваемый тип контента действительно существует. Если такого типа нет, Drush выдаст ошибку:

function drush_publish_content_validate($type) {
if(node_type_load($type) === FALSE) {
return drush_set_error('NON_EXISTENT', dt('There is no content type by that name'));
}
}

Вот, собственно, и всё, что нужно сделать, чтобы создать пользовательскую команду Drush для выполнения рутинных задач сайта. Приведённый выше код команды очень легко обратить, создав, соответственно, команду unpublish, которая будет удалять контент.

Tags: ,

Добавить комментарий