如何用你的VPS声明你自己的Drush命令

来自菜鸟教程
跳转至:导航、​搜索

关于德鲁什

Drush 是一个很酷的命令行界面,用于管理您的 Drupal 站点。 它提供了许多简单的命令,您可以使用这些命令在您的站点上以极快的速度执行一些管理任务。 如果您不熟悉 Drush 的功能,请查看此 使用 Drush 的初学者指南。

Drush 最酷的地方在于它对开发人员非常友好。 这意味着除了现有命令之外,您还可以声明执行所需任务的自定义命令。 因此,在本文中,您将获得一个直截了当的教程,用于声明您自己的 Drush 命令。 为了说明如何做到这一点,我们将声明一个命令,该命令将发布用户作为命令参数传递的给定内容类型的所有节点。

入门

要完成本教程,您应该已经在您的 VPS 上设置了 Drush。 最好,您还应该使用 Drupal 安装,并且一定不要害怕一些简单的 Drupal 代码。 要了解如何在您的 VPS 上设置 Drush 并使用它来快速部署 Drupal 站点,请阅读 本教程

创建自己的 Drush 命令需要三个主要步骤:

  1. 创建将存储命令声明及其回调代码的文件
  2. 声明命令函数
  3. 声明命令回调函数(将由 Drush 命令调用以执行操作的 php 函数)

第 1 步:创建命令文件

此步骤中最重要的事情是为命令文件指定正确的名称,并将其放入 Drush 将查找的文件夹中。 该名称必须以 .drush.inc 结尾(在我们的例子中,它将是 publish.drush.inc)并且必须放在您网站上自定义模块的文件夹中(如果启用了该模块,将适用于该站点)或服务器根目录中的 .drush 文件夹中。

另外,不要忘记在文件顶部添加开始的 php 标记。

第 2 步:声明命令函数

要声明一个新的 Drush 命令,您必须在您在 php 开始标记上方和下方创建的文件中调用 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;
}

注意: 这个命令是在一个文件中声明的,该文件已放置在 VPS 根文件夹中的 .drush 文件夹中。

通过这个函数,我们声明了一个名为 publish-content 的新命令($items 数组中的一个新键),它具有许多特性。 参数键中包含的描述和内容是您在运行 drush help publish-content 命令时将看到的内容。 这里真正有用的是,您还可以指定一个可以运行的别名(或快捷方式),而不是较长的 publish-content 版本。 在这种情况下,drush publish-content 将等于 drush pc

尽管您可以在此处添加其他内容,但这些都是您可以开始的一些基础知识。 请注意,您可以指定此命令调用的可选回调函数,但如果您省略它(就像我们刚刚所做的那样),drush_invoke() 将自动生成回调的函数名称。

第三步:声明命令回调函数

现在是与 Drupal 的交互。 使用此功能,您需要编写您希望 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

该命令将发布当前未发布的文章内容类型的所有节点。 它通过使用 node_load_multiple() 函数加载该类型的所有节点并将状态属性从 0 更改为 1 来实现。 然后,Drush 将打印出已发布的节点数(仅显示实际上受命令影响的节点数)。

此外,您还可以声明一个验证挂钩来检查并在命令出现问题时显示错误。 这将在 Drush 实际运行命令之前调用。 在我们的例子中,我们可以使用它来检查 command 参数中提供的内容类型是否实际存在。 如果没有,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 命令,它将在您的站点上执行一些操作。 您还可以轻松地复制这项工作以创建一个反向取消发布命令,该命令将以相同的方式取消发布内容:没有限制!

文章提交者:Danny