2009-11-18 2 views
1

Так что мне нужно AJAX-перезагрузить часть страницы, и поэтому я создаю небольшой модуль, чтобы просто вернуть drupal_render ($ node-> content ['the_field']) , Кажется, что он работает нормально, он возвращает тот же результат, что и на странице.Передать переменную от шаблона шаблона к шаблону при использовании drupal_render

Проблема в том, что мне нужно отправить параметр из модуля на слой темы, чтобы изменить некоторые имена предустановок imagecache в зависимости от некоторых состояний на странице.

Каким будет лучший способ переместить данные из URL-адреса моего запроса AJAX через модуль в шаблон темы поля?

ответ

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

+0

Если вы в конечном итоге используете статическую переменную, вы можете сделать ее более «интуитивной» для использования, добавив явную функцию «setter», превратив приведенный выше пример в «getter». Версия установщика будет единственной, вызывающей версию getter с параметром.Вы можете найти этот «шаблон», применяемый регулярно в ядре Drupal, например, с помощью 'menu_set_item()'/'menu_get_item()' pair. –

+0

Это работало как шарм! Большое спасибо! – Karl

1

Вы можете использовать один из preprocess hook в своем модуле, т.е.

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

, но я подозреваю, что вы лучше override некоторые ImageCache Themeable функция в вашей теме непосредственно.

Смежные вопросы