2009-11-18 77 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主題化的功能,在你的主題。