баян про imagefield cck

Главные вкладки

Аватар пользователя rokot rokot 17 октября 2007 в 10:31

В общем столкнулся с проблемой не первой свежести, при включении приватного метода загрузки в Drupal (Private - files are transferred by Drupal) - imagefield начинает неправильно показовать изображение в форме, однако далее после сохранения изображение начинает показываться.

После проверки выяснилось, что у временного изображения неправильно генерируется путь. Например: http://*****.ru/system/files/system/files/newsicon/window.gif

Поиск уже готовых решений навел на imagefield_private_downloads.patch — который, к сожалению, ни как не решил проблемы.

В общем, зарывшись в код нашел функцию вывода imagefield.module:

function theme_imagefield_image($file, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {

$file = (array)$file;
if (!$getsize || (is_file($file['filepath']) && (list($width, $height, $type, $image_attributes) = getimagesize($file['filepath'])))) {
$attributes = drupal_attributes($attributes);

$path = $file['fid'] == 'upload' ? $file['preview'] : $file['filepath'];
$alt = empty($alt) ? $file['alt'] : $alt;
$title = empty($title) ? $file['title'] : $title;

$url = file_create_url($path);
return '<img src="'. check_url($url) .'" alt="'.
check_plain($alt) .'" title="'. check_plain($title) .'" '. $image_attributes . $attributes .' />';
}
}

массив для файла выглядит следующим образом:

Array
(
[filename] => window.gif
[filepath] => c:\windows\temp\tmp390.tmp
[filemime] => image/gif
[filesize] => 88369
[source] => field_illustration_upload
[fid] => upload
[preview] => system/files/newsicon/window.gif
)

Теперь смотрим функцию file_create_url:

function file_create_url($path) {
// Strip file_directory_path from $path. We only include relative paths in urls.
if (strpos($path, file_directory_path() . '/') === 0) {
$path = trim(substr($path, strlen(file_directory_path())), '\\/');
}
switch (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC)) {
case FILE_DOWNLOADS_PUBLIC:
return $GLOBALS['base_url'] .'/'. file_directory_path() .'/'. str_replace('\\', '/', $path);
case FILE_DOWNLOADS_PRIVATE:
return url('system/files/'. $path, NULL, NULL, TRUE);

}
}

— таким образом и вылезает ошибка, из-за двойного включения 'system/files/'.

Следующим шагом, находим формирования массива $file [imagefield.module:395]

// Create the filepath for the image preview
$filepath = file_create_filename($file['filename'], file_create_path($field['widget']['image_path']));
if (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) == FILE_DOWNLOADS_PRIVATE) {
if (strpos($filepath, file_directory_path()) !== FALSE) {
$filepath = trim(substr($filepath, strlen(file_directory_path())), '\\/');
}
$filepath = 'system/files/' . $filepath;
}

Короче после долгих раскопок, самое простым решением стала замена в функции theme_imagefield_image() следующей строчки [imagefield.module:640]:
$url = file_create_url($path);
строчкой:
$url = url($path);

Надо заметить, что это прекрасно работает как с приватом, так и с пабликом.

P.S.: За помощь в ковырянии спасибо edhel

Комментарии

Аватар пользователя marazmus marazmus 17 апреля 2008 в 16:09

Спасибо, но не помогло.

Последний вопль о помощи на друпал.орг об этой проблеме с imagefield - сегодня Smile
Похоже баг редкий, но меткий - вернее, большинство его не может воспроизвести, и непонятно в чем проблема.