2013-03-06 56 views
3

我正在用自定義內容類型在Drupal 7中創建一個站點。在創建節點時,我需要以某種方式觸發python腳本(由其他人開發)的執行,它將:drupal 7在創建節點時觸發腳本

  • 從當前正在創建的節點傳遞用戶輸入值
  • 運行將從其他站點檢索數據的腳本
  • 將檢索到的數據插入當前正在創建的節點上的字段

我不確定從哪裏開始。規則模塊看起來很有希望,因爲我可以定義東西,但我不知道如何調用腳本,發送數據或檢索到的數據插入到我創建的節點。

另一個想法是,生成新的節點的XML文件,以某種方式調用腳本,並有飼料模塊解析更新的XML文件(包含所檢索的數據)來更新節點。

任何幫助將不勝感激。我在這個上頭了!

+0

其他開發者(python腳本)正在等待我的有關我們將如何發送/接收數據的細節。我的默認答案是XML,但這仍然引發了關於如何生成本地xml文件的問題(我確信我可以解決這個問題)。如果我能在這裏找到更優雅的解決方案,我寧願不向他傳達一個糟糕的方法。 – 2013-03-06 18:23:50

+0

發送和提取需要在節點創建的同一個請求中完成,還是可以在後臺發生?另外,爲什麼用python編寫另一個腳本? – 2013-03-06 18:38:05

+0

它不需要發生在與節點創建相同的請求中。它可能會在(正如我對XML解決方案所設想的)之後立即發生,或者甚至在節點被提交之前發生(老實說,這將是用戶友好性最高的選項,因爲腳本的目的是填充節點上的一些字段,用戶不必)。至於爲什麼使用python - 我無法回答。我的客戶嚴格委託另一位開發人員編寫腳本,因爲它不是我們原始設計的一部分。 – 2013-03-06 18:46:43

回答

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()來操縱$節點對象被保存之前它。這是在節點數據寫入數據庫之前處理的。節點對象被視爲引用,因此對對象的任何修改都是保存時將使用的內容。

的邏輯將檢查!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. 
    } 
} 
+0

這非常有幫助。嘗試實施此操作後,我會報告回來。 – 2013-03-07 20:37:15

+0

您的方法按預期工作。謝謝! (太糟糕了,python開發人員沒有按照指示...時間來找出那一個!) – 2013-04-15 23:30:41

+0

我不知道你是否可以幫我敲定這:)我已經根據你的指示構建模塊,但我不熟悉python/JSON,我不知道如何正確修改這個腳本來返回一個JSON字符串。 python開發者留下了這個:'#這裏我要將數據保存到xml中(很容易做到) res = {'make':make.text, 'model':model.text, 'year' :manufacture_year.text, 'engine':engine_size.text } print res' – 2013-05-03 15:04:59