Передача переменной из модуля в шаблон темы при использовании drupal_render - PullRequest
1 голос
/ 19 ноября 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Предполагая, что ваш модуль регистрирует путь для обратного вызова через 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(), добавив логику для изменения его переменной $ 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 yourModule_imagecache_preset_override($override = NULL) {
      static $preset;
      if (isset($override)) {
        $preset = $override;
      }
      return $preset;
    }
    

    Сначала вы вызываете его из обратного вызова меню AJAX, передавая предопределенное переопределение, определенное по URL, чтобы оно сохранялось в статической переменной. В вашем theme_imagecache() переопределении вы бы вызывали его снова без каких-либо параметров. Если он возвращает NULL, вы просто продолжаете как обычно, используя «стандартный» пресет. Если он что-то возвращает, вы будете использовать его вместо значения по умолчанию, поскольку теперь вы знаете, что это запрос к вашему обратному вызову AJAX.

1 голос
/ 19 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...