在Drupal中,您可以在自定义模块中创建自己的节点类型。这样你就可以创建自己的表格,这非常好。
但是,如果你想添加js表单,事情会变得有点棘手。如果在表单中添加js,js将仅在加载时从表单中添加。如果用户发布带有验证错误的表单,则表单函数不会再次运行,因此不会添加js。通常你只需创建一个菜单回调并在那里添加js,但是对于节点添加表单,这不是一个可能的解决方案。
那么在节点添加表单中添加js的最佳解决方案是什么,以便在表单不验证时保持持久性?
答案 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
。