drupal 7在节点创建期间触发脚本

时间:2013-03-06 17:46:25

标签: python drupal-7

我正在使用自定义内容类型在Drupal 7中创建一个站点。在节点创建时,我需要以某种方式触发python脚本的执行(由其他人开发),它将:

  • 从当前创建的节点传递用户输入的值
  • < li>运行将从其他站点检索数据的脚本
  • 将检索到的数据插入当前正在创建的节点上的字段

我不知道从哪里开始。规则模块看起来很有希望,因为我可以定义何时来执行某事,但我不知道如何调用脚本,发送数据或插入检索到的数据进入我创建的节点。

另一个想法是生成新节点的XML文件,以某种方式调用脚本,并让Feeds模块解析更新的XML文件(包含检索到的数据)以更新节点。

任何帮助将不胜感激。我对这个问题感到非常满意!

1 个答案:

答案 0 :(得分:1)

您可以使用自定义模块中的hook_node_presave()来实现此目的。

在此示例中,您的模块名为my_module,您的自定义内容类型$node->typecustom_type

您发送到python脚本的节点的字段名称是:field_baz

你的python脚本是:/path/to/my/python_script.py并且它需要一个参数,这是field_baz的值

返回python脚本要填充的其他节点字段是field_data_foofield_data_bar

目前还不清楚python脚本的输出是什么,所以这个例子模拟输出是一个JSON字符串。

该示例使用hook_node_presave()在保存之前操作$ node对象。在将节点数据写入数据库之前处理此问题。节点对象被视为引用,因此对对象的任何修改都将在保存时使用。

逻辑检查!isset($node->nid),因为您提到这只会在创建节点时发生。如果需要在节点更新时发生,请删除该条件。

/**
 * Implements hook_node_presave().
 */
function my_module_node_presave($node) {
  if ($node->type == 'custom_type' && !isset($node->nid)) {

    // Get the user value from the node.
    // You may have to clean it so it enters the script properly
    $baz = $node->field_baz[LANGUAGE_NONE][0]['value'];

    // Build the command string
    $cmd = '/path/to/my/python_script.py ' . $baz;

    // Execute the script and store the output in a variable
    $py_output = shell_exec($cmd);

    // Assuming the output is a JSON string.
    $data = drupal_json_decode($py_output);

    // Add the values to the fields
    $node->field_data_foo[LANGUAGE_NONE][0]['value'] = $data['foo'];
    $node->field_data_bar[LANGUAGE_NONE][0]['value'] = $data['bar'];

    // Nothing more to do, the $node object is a reference and
    // the object with its new data will be passed on to be saved.
  }
}