2010-04-06 126 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