您可以使用自定義模塊中的hook_node_presave()來實現此目的。
在本例中,您的模塊名爲my_module
,而您的自定義內容類型$node->type
爲custom_type
。
您發送到您的Python腳本節點的字段名稱是:field_baz
你的Python腳本是:/path/to/my/python_script.py
,它需要一個參數,它是要填充field_baz
附加節點字段的值通過你的python腳本返回的結果是field_data_foo
和field_data_bar
不清楚python腳本的輸出是什麼,所以這個例子模擬好像輸出是JSON字符串。
的例子使用hook_node_presave()來操縱$節點對象被保存之前它。這是在節點數據寫入數據庫之前處理的。節點對象被視爲引用,因此對對象的任何修改都是保存時將使用的內容。
的邏輯將檢查!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.
}
}
其他開發者(python腳本)正在等待我的有關我們將如何發送/接收數據的細節。我的默認答案是XML,但這仍然引發了關於如何生成本地xml文件的問題(我確信我可以解決這個問題)。如果我能在這裏找到更優雅的解決方案,我寧願不向他傳達一個糟糕的方法。 – 2013-03-06 18:23:50
發送和提取需要在節點創建的同一個請求中完成,還是可以在後臺發生?另外,爲什麼用python編寫另一個腳本? – 2013-03-06 18:38:05
它不需要發生在與節點創建相同的請求中。它可能會在(正如我對XML解決方案所設想的)之後立即發生,或者甚至在節點被提交之前發生(老實說,這將是用戶友好性最高的選項,因爲腳本的目的是填充節點上的一些字段,用戶不必)。至於爲什麼使用python - 我無法回答。我的客戶嚴格委託另一位開發人員編寫腳本,因爲它不是我們原始設計的一部分。 – 2013-03-06 18:46:43