这是对Core javascript functions to make error, warning or notice messages appear?
的跟进基本上,drupal_set_message()
会在会话中存储错误消息。我需要一种方法来告诉drupal VIA JAVSCRIPT不要显示这些消息。如果页面被刷新,将显示这些消息,但我想要一种强制它们立即显示的方法。
答案 0 :(得分:2)
我不确定我是否理解你是正确的,但似乎你想对你的javascript中的某些东西作出反应并以drupal风格显示带有效果的信息。
首先要明确一点,JavaScript和Drupal(PHP)无法真正相互通信。唯一的解决方案是通过AJAX,所以想要从你的javascript使用drupal_set_message()没有任何意义。原因是它会非常困难,你最终会得到你需要附加到页面的html。因此,直接在javascript中创建html会更容易,就像我在你的另一个问题的答案中提出的那样。所以剩下的就是追加效果。这实际上并不难,具体取决于你的效果。唯一棘手的部分是从messagefx模块获取设置,这似乎是你目前无法解决的,因为它不会保存脚本变量中的任何设置。
所以代码中的这个解决方案就是这样的:
$("#something").a_trigger(function () {
$("#messages").append('your html with message').find('the html you inserted').effect(some effect here);
});
根据您想要创建的效果,您可以调用另一个函数,查看messagefx在第55行的模块文件中执行的操作。
另一种可能性是你想对任何drupal_set_message()做出反应。困难的部分是找出何时有消息,因为在javascript中确实没有办法知道。还要考虑大多数消息是提交表单的结果,无论如何页面重新加载,这是不必要的。因此,您首先要创建一个简单的AJAX函数来获取数据,然后创建自己的简单模块来执行此操作。基本上你需要用hook_menu定义一个url,并在该回调中处理ajax。您可以从$ _SESSION super global获取消息。
所以回调看起来像这样
function mymodule_ajax_callback() {
if (isset($_SESSION['messages'] && !empty($_SESSION['messages'])) {
$result = array();
foreach($_SESSION['messages'] as $message) {
$result[] = 'Generate html based on $message';
}
unset($_SESSION['messages']) // Remove the messages so they wont appear twice.
}
return drupal_json($result);
}
其余的看起来像第一个解决方案,只有你会从ajax获得html。
答案 1 :(得分:0)
因为这些消息在会话和/或数据库中,所以你必须使用ajax。这不是一个非常传统的方法。
不得不说在我的网站上这个drupal_set_message()函数经常显示消息一页太晚了,所以我感到很痛苦。