2010-06-24 39 views
0

我想重定向陳詞後我的狀態,我試圖用一個鉤子,宣佈但這是我所得到的:Drupal的:致命錯誤:不能重新聲明> node_form_submit()(以前>在

function node_form_submit(&$form, $form_state) { 
    $form_state['redirect'] = 'contentManager/'; 
} 

Fatal error: Cannot redeclare node_form_submit() (previously declared in drupal/modules/node/node.pages.inc:451) in drupal/sites/all/themes/bluemarine/template.php on line 31

我使用的模塊名稱「節點」爲我鉤我想這是錯誤的,但我不明白爲什麼

更新: 好吧,我不是開發一個新的模塊。我在Bluemarine模板中添加了template.php函數。

function bluemarine_form_alter(&$form, $form_state) { 
    $form_state['redirect'] = 'contentManager/'; 
} 

Bluemarine是我主題的名稱..「contentManager」是我在後端創建的一個頁面,其中包含所有節點的View。

該功能完全被忽略。

UPDATE2 好了,現在,這是我目前的template.php文件(我敢肯定,phptemplate_node_form調用)

function phptemplate_node_form($form) { 
    $form['#submit'][] = 'myFormSubmit'; 
} 

function myFormSubmit() { 
    echo "hello"; 
    die(); 
} 

,則不會調用該函數myFormSubmit。

謝謝

回答

1

「我使用的模塊名稱‘節點’我的鉤子。我想這是錯誤的,但我不明白爲什麼」

你不能這樣做,因爲節點已經是一個模塊,因此,node_函數已經被定義。

要使用鉤子,您需要創建自己的模塊,命名約定是mymodule_hookname()。

在具有自己的鉤子的模塊中,Drupal有一個名爲module_invoke_all的函數,它在執行期間根據鉤子名稱調用所有模塊上的特定鉤子。

您不能將編程轉儲到template.php中,因爲這不是它的目的。這一切都需要在模塊中,並且可以通過hook_form_alter輕鬆實現,更改表單提交以及具有mymodule_form_submit()函數。

+0

所以,我有兩個問題:(1)對於每個我想修改的模塊,我都應該創建一個新模塊。假設我想在3個不同的模塊中更改3個小東西,我必須創建3個新模塊。它是否正確 ? (2)如果我只想在提交表單後將用戶轉發到另一個頁面,我應該創建一個新模塊嗎?我通常會對我的template.php文件(例如更改權重,默認摺疊)做一些小的更改,但我想更改轉發,我應該創建一個新模塊? – aneuryzm 2010-06-24 13:18:45

+0

如果您想要做的是更改表單,您可以使用一個hook_form_alter並根據$ form_id提供更改集。它會根據字段名稱改變你想要的任何形式,例如你可以限制它包裹在if($ form_id =='node_form')中。 – Kevin 2010-06-24 13:24:11

+0

所以換句話說,我想這個答案問題1,我可以改變不同模塊的形式,從1個新的模塊,提供不同的$ form_ids。如果我想更改表單轉發,我沒有其他選項,如果我只能創建一個新模塊? – aneuryzm 2010-06-24 13:32:33

2

PHP不允許重複的函數名稱。 node_form_submit這實際上不是一個鉤子,而是一個表單提交處理程序,它在節點模塊中實現。這就是你遇到錯誤的原因。

所有鉤子都應該始終以您的模塊/主題名稱開頭。這樣做是爲了避免重複函數名稱的確切問題。

如果您想要將表單提交處理程序添加到表單中,您需要在表單上使用hook_form_alter並將您的提交處理程序添加到$form['submit']

模塊:
當開發一個模塊,你需要使用一個module_name.module文件。這是您的代碼的核心應該去的地方,以及每個鉤子實現。

主題:
當開發一個主題,你應該使用template.php文件的所有預處理功能,主題覆蓋,鉤實現等

有什麼不對:
你說你們倆有一個藍色海洋模塊和主題。如果你真的有兩個,你應該重命名他們。

當使用hook_form_alter時,您應該指定$form_id,因此您不會覆蓋所有表單。

如果您希望$form_state上的效果能夠通過,則需要使用&表示法作爲參考來傳遞它。

更新2:
除非你使用Drupal 7的,你不能在一個主題的template.php文件中使用hook_form_alter。你將不得不創建一個自定義模塊來實現任何鉤子。

+0

好的,我更新了我的問題。 – aneuryzm 2010-06-24 12:14:41

+0

對不起,我的意思是模板。我根本沒有創建一個新模塊。我只是想從我的template.php文件中更改我的表單轉發。而已。我已經更新了我的問題。 – aneuryzm 2010-06-24 13:04:29

0

你不能在主題中聲明hook_form_alter。你必須在模塊中做到這一點。請注意聲明mymodule_form_alter requires three arguments,您應該在應用更改之前檢查$ form_id =='form_name'(否則您將在drupal中更改每個表單)。

如果您不知道要更改的表單的form_id,可以將print_r($ form_id。'');在你的鉤子中,它將打印頁面中每個表單的form_id。然後可以使用form_id聲明a more specific hook,並在其中添加更改。

最後,如果你想要做的是改變提交表單中的重定向,你需要添加一個函數名稱$ form ['#submit'](添加,不能替代,見the forms api docs),並在該函數中,它應該在node_form_submit之後運行,將$ form ['#redirect']更改爲任何你喜歡的。

+0

好吧我已經更新了我的問題(Update2) – aneuryzm 2010-06-24 13:02:45

相關問題