Если вам нужен только тематический образ для вашей AJAX-операции, может быть проще всего отказаться от drupal_render($node->content['the_field'])
в пользу прямого вызова theme_imagecache()
:
return theme('image_cache', $presetname, $path, $alt, $title, $attributes, $getsize);
Очевидно, что перед этим вам нужно будет самостоятельно получить информацию об изображении / поле и установить $ presetname в соответствии с аргументом URL. В вашем интерфейсе 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 yourModule_imagecache_preset_override($override = NULL) {
static $preset;
if (isset($override)) {
$preset = $override;
}
return $preset;
}
Сначала вы вызываете его из обратного вызова меню AJAX, передавая предопределенное переопределение, определенное по URL, чтобы оно сохранялось в статической переменной. В вашем theme_imagecache()
переопределении вы бы вызывали его снова без каких-либо параметров. Если он возвращает NULL, вы просто продолжаете как обычно, используя «стандартный» пресет. Если он что-то возвращает, вы будете использовать его вместо значения по умолчанию, поскольку теперь вы знаете, что это запрос к вашему обратному вызову AJAX.