2009-11-18 73 views
1

所以我需要AJAX重新加载页面的一部分,所以我构建了一个小模块来返回drupal_render($ node-> content ['the_field']) 。这似乎工作正常,它返回的是原来在页面上的输出。使用drupal_render从模块传递变量到主题模板

问题是我需要从模块向主题层发送一个参数,以根据页面上的某些状态更改一些imagecache预设名称。

将数据从我的AJAX请求的URL通过模块移动到字段的主题模板中的最佳方式是什么?

回答

2

假设你的模块通过hook_menu()注册回调的路径,我看到两种方式,这取决于如何“大”标记的返回块需要是:

  1. 如果你只需要在主题为您的AJAX操作图像,这可能是最简单的砸drupal_render($node->content['the_field'])支持直接调用theme_imagecache()的:

    return theme('image_cache', $presetname, $path, $alt, $title, $attributes, $getsize); 
    

    很显然,你需要在这之前给自己取的图像/字段的信息,并设置$ presetname根据你的URL参数。在您的前端js中,您需要调整替换逻辑以仅对图像起作用,而不是交换整个字段标记。

  2. 如果你需要整场标记您的问题的建议,我想实现的theme_imagecache()的覆盖,增加逻辑来改变它的基于路径的直接检查$预先设置的变量:

    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回调的请求。

+0

嗯,我正在改变imagecache预设,但我回来的方式不仅仅是图像,我要返回一个完整的CCK多组。 静态变量听起来很有趣,我将不得不看看我能否以某种方式集成它。 – Karl 2009-11-19 20:59:42

+0

如果你最终使用静态变量版本,你可以通过添加一个明确的'setter'函数使它更加'直观',将上面的例子变成'getter'。 setter版本将是唯一一个使用参数调用getter版本的版本。你可以在Drupal内核中定期找到这个'pattern',例如'menu_set_item()'/'menu_get_item()'夫妇。 – 2009-11-19 23:03:40

+0

这工作就像一个魅力!非常感谢! – Karl 2009-11-20 17:10:33

1

你可以在模块中使用preprocess hook之一。

function modulename_preprocess_page(&$vars) { 
    $vars['myvar'] = $myvalue; 
} 

,但我怀疑你直接最好override一些imagecache主题化的功能,在你的主题。