将js添加到drupal节点表单中

时间:2010-04-06 11:28:16

标签: javascript drupal caching drupal-6

在Drupal中,您可以在自定义模块中创建自己的节点类型。这样你就可以创建自己的表格,这非常好。

但是,如果你想添加js表单,事情会变得有点棘手。如果在表单中添加js,js将仅在加载时从表单中添加。如果用户发布带有验证错误的表单,则表单函数不会再次运行,因此不会添加js。通常你只需创建一个菜单回调并在那里添加js,但是对于节点添加表单,这不是一个可能的解决方案。

那么在节点添加表单中添加js的最佳解决方案是什么,以便在表单不验证时保持持久性?

3 个答案:

答案 0 :(得分:12)

尝试一些不同的黑客,我找到了一个非常简单的解决方案来解决这个问题,为表单创建一个主题函数并在那里添加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';

答案 1 :(得分:2)

我在Smilies模块上发布了修补此问题的补丁:Smilies are not selectable when resubmitting a page

补丁添加了一个hook_nodeapi()函数来检查节点操作是否为“verify”,如果是,则检查该节点是否应该具有表情符号,如果是,则调用该函数添加smileys.js javascript文件这会创建选择表格。

你应该只需要在你的情况下做同样的事情。这将要求您编写一个非常简单的模块来实现hook_nodeapi函数,并以与修补的Smileys模块相同的方式检查更新。

答案 2 :(得分:0)

您可以使用案例prepare

来使用hook_nodeapi

示例:

/**
 * 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