所以我需要AJAX重新加载页面的一部分,所以我正在构建一个小模块来返回drupal_render($ node-> content ['the_field'])。这似乎工作正常,它返回的页面输出与原来的相同。
问题是我需要从模块向主题层发送参数,以根据页面上的某些状态更改一些图像缓存预设名称。
将数据从我的AJAX请求的URL通过模块移动到字段的主题模板中的最佳方法是什么?
答案 0 :(得分:2)
假设您的模块通过hook_menu()
为回调注册了一个路径,我会看到两种方式,具体取决于返回的Markup块的“大”程度:
如果您只需要AJAX操作的主题图像,最简单的方法是放弃drupal_render($node->content['the_field'])
,而选择直接调用theme_imagecache()
:
return theme('image_cache', $presetname, $path, $alt, $title, $attributes, $getsize);
显然,您需要在此之前自己获取图像/字段信息,并根据您的URL参数设置$ presetname。在你的前端js中,你需要调整替换逻辑以仅对图像起作用,而不是交换整个字段标记。
如果您需要问题建议的整个字段标记,我会实现theme_imagecache()
的覆盖,添加逻辑以根据路径的直接检查更改它的$ preset变量:< / p>
function theme_imagecache($presetname, $path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
// NOTE: Assuming an AJAX callback path of 'your/ajax/callback/preset_name'
// Get all path elements
$path_elements = arg();
// Pop the last element, as it will be the preset, if the rest matches below
$preset_name = array_pop($path_elements);
// Prepare the rest for comparison below
$leading_path = implode('/', $path_elements);
// Do we have a preset, while being on the right path?
if (isset($preset_name) && 'your/ajax/callback' == $leading_path) {
// Yes, adjust the preset
$preset = $preset_name // might need conversion from path element to preset name first, if not the same
}
// Add copy of original theme_imagecache function here ...
}
这是'快速和肮脏'的方式。如果你想留意arg() function documentation中给出的'避免使用'警告(并且还避免使用全局变量),你可以通过帮助器中的静态变量将预设名称“传递”给主题覆盖功能:
function yourModule_imagecache_preset_override($override = NULL) {
static $preset;
if (isset($override)) {
$preset = $override;
}
return $preset;
}
您可以先从AJAX菜单回调中调用此方法,传递从URL确定的预设覆盖,以便将其存储在静态变量中。在theme_imagecache()
覆盖中,您无需任何参数即可再次调用它。如果它返回NULL,则只需使用“标准”预设正常进行。如果它返回了某些东西,你将使用它而不是默认值,因为现在你知道这是对你的AJAX回调的请求。
答案 1 :(得分:1)
您可以使用模块中的preprocess hook之一,即。
function modulename_preprocess_page(&$vars) {
$vars['myvar'] = $myvalue;
}
但我怀疑你最好直接在你的主题中override一些imagecache主题功能。