2010-04-06 110 views
7

在Drupal中,您可以在自定義模塊中創建自己的節點類型。這樣做,你可以創建自己的表單,這是非常好的。將js添加到Drupal節點表單

但是,如果你想添加JS的形式事情會變得更棘手。如果您在表單中添加js,那麼js只會在加載時從表單中添加。如果用戶發佈帶有驗證錯誤的表單,則表單函數不會再次運行,因此不會添加js。通常你只需創建一個菜單回調並在其中添加js,但對於節點添加表單,這不會是一個可能的解決方案。

那麼什麼是在節點中添加js的最佳解決方案添加表單,以便在表單無法驗證時保持持久性?

+0

相同的Drupal的答案:http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-form-with-attachments – Nux 2015-04-22 16:30:45

回答

11

嘗試一些不同的黑客,我發現了一個相當簡單的解決方案,爲該問題創建一個主題函數並在其中添加js。這看起來像這樣:

function theme_content_type_node_form($form) { 
    drupal_add_js(...); 
    return theme('node_form', $form); 
} 

這只是在添加js後調用節點添加表單的默認主題功能。由於即使表單被緩存,主題函數也被調用,所以這很好地工作。你還需要實現hook_theme來完成這個工作。

更新爲Drupal 7

的Drupal 7使這是一個容易得多,因爲它是可以做到

$form['#attached']['js'][] = 'path_to_js_file; 

使用這個的例子可能是:

$form['#attached']['js'][] = drupal_get_path('module', 'foo') . '/js/foo.form.js'; 
+4

有趣 - 我很驚訝這個工程沒有創建一個無限循環,因爲調用'theme('node_form')'可能最終會再次調用您的覆蓋。將'drupal_add_js'調用放在'theme_preprocess'函數中不是更好嗎? – 2010-04-06 12:08:00

+2

@Henrik歐寶:我想theme_preprocess函數也能做到這一點,我當時沒有想到它。 theme_node_form函數是在content_type_node_form不存在的情況下將被調用的函數,所以我認爲無限循環沒有任何危險。但我想這比使用s主題預處理函數更加駭人聽聞。 – googletorp 2010-04-06 12:23:22

+0

你可以做return theme_node_form($ form);而不是返回主題('node_form',$ form);避免無限循環。 – rooby 2013-05-09 11:15:04

2

我貼補丁應用到Smilies模塊修復此問題:Smilies are not selectable when resubmitting a page

貼劑添加hook_nodeapi()函數來檢查節點操作是「驗證」,如果是,則檢查該節點應該有笑臉,如果是這樣的話調用函數來添加創建選擇表單的smileys.js javascript文件。

你應該只需要在你的情況下做同樣的事情。這將要求您編寫一個非常簡單的模塊,該模塊實現hook_nodeapi函數,並以修補後的Smileys模塊的相同方式檢查更新。

+0

Thanx的提示。我最終使用了一個主題函數來執行這個技巧,因爲在這個特定情況下它更簡潔一些。 – googletorp 2010-04-06 12:00:58

0

您可以使用hook_nodeapi與案例prepare

例子:

/** 
* Implementation of hook_nodeapi 
*/ 

function mymodulename_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch($op) {  
    case 'prepare': 
     $module_path = drupal_get_path('module' , 'mymodulename'); 
     drupal_add_js($module_path."/myscript.js"); 
     break; 
    } 
} 

現在你可以在你的模塊文件夾例如,添加JavaScript代碼myscript.js