【发布时间】:2009-11-18 23:06:10
【问题描述】:
所以我需要 AJAX 重新加载页面的一部分,所以我正在构建一个小模块来返回 drupal_render($node->content['the_field'])。这似乎工作正常,它返回的输出与页面上最初的输出相同。
问题是我需要从模块向主题层发送一个参数,以根据页面上的某些状态更改一些图像缓存预设名称。
将数据从我的 AJAX 请求的 URL 通过模块移动到字段的主题模板中的最佳方法是什么?
【问题讨论】:
所以我需要 AJAX 重新加载页面的一部分,所以我正在构建一个小模块来返回 drupal_render($node->content['the_field'])。这似乎工作正常,它返回的输出与页面上最初的输出相同。
问题是我需要从模块向主题层发送一个参数,以根据页面上的某些状态更改一些图像缓存预设名称。
将数据从我的 AJAX 请求的 URL 通过模块移动到字段的主题模板中的最佳方法是什么?
【问题讨论】:
假设您的模块通过hook_menu() 为回调注册了一条路径,我看到了两种方法,具体取决于返回的标记块需要多大:
如果您的 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 变量:
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()override 中,您将再次调用它而无需任何参数。如果它返回 NULL,您只需照常使用“标准”预设。如果它返回某些内容,您将使用它而不是默认值,因为现在您知道这是对您的 AJAX 回调的请求。
【讨论】:
menu_set_item()/menu_get_item() 对。
您可以在模块中使用preprocess hook 之一,即。
function modulename_preprocess_page(&$vars) {
$vars['myvar'] = $myvalue;
}
但我怀疑你最好在你的主题中直接override一些图像缓存主题功能。
【讨论】: