将js添加到drupal节点表单中

goo*_*orp 7 javascript caching drupal drupal-6

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

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

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

goo*_*orp 12

尝试一些不同的黑客,我找到了一个非常简单的解决方案来解决这个问题,为表单创建一个主题函数并在那里添加js.这看起来像这样:

function theme_content_type_node_form($form) {
  drupal_add_js(...);
  return theme('node_form', $form);
}
Run Code Online (Sandbox Code Playgroud)

这只是在添加js后调用节点添加表单的默认主题函数.由于调用了主题函数,即使表单被缓存,这也可以很好地工作.您还需要实现hook_theme才能使其工作.

Drupal 7的更新.

Drupal 7使得这很容易,因为它可以做到

$form['#attached']['js'][] = 'path_to_js_file;
Run Code Online (Sandbox Code Playgroud)

使用它的一个例子可能是:

$form['#attached']['js'][] = drupal_get_path('module', 'foo') . '/js/foo.form.js';
Run Code Online (Sandbox Code Playgroud)

  • 有趣 - 我很惊讶,这可以在不创建无限循环的情况下工作,因为对`theme('node_form')`的调用最终可能会再次调用你的覆盖.将`drupal_add_js`调用放在`theme_preprocess`函数中不是更好吗? (4认同)
  • @Henrik Opel:我猜一个theme_preprocess函数也可以做到这一点,我当时没有想到它.theme_node_form函数是在content_type_node_form不存在时将被调用的函数,因此我认为无限循环没有任何危险.但我想它比仅仅使用s主题预处理功能更加苛刻. (2认同)