Программно добавить к ноде картинку


53

Часто возникает необходимость программно заполнять сайт определенным контентом. Заполнение текстовых полей обычно не вызывает проблем. Другое дело - картинки. Почему-то с ними возникает много сложностей у людей.

Покажу фрагмент кода, позволяющего загрузить изображение с другого сайта (сервера) и записать его в ноду.

$file_path='ht tp://frantsuzzz.com/sites/frantsuzzz.com/files/logo2008_0.png';
 $destination='public://logo2008.png';
 
//Загружаем путь
 $data = drupal_http_request($file_path);

//Проверяем на успешную загрузку 
 if($data->code==200){ 
//Сохраняем файл 
 $file = file_save_data($data->data, $destination);
 if ($file) {
      $node->field_image[LANGUAGE_NONE][] = (array)$file;
      node_save($node);
   }
}

Как видите, все очень просто. Теперь некоторые особенности. Функция file_save_data($data, $destination) записывает данные в файл, указанный в параметре $destination. Поэтому перед записью файла нужно знать его имя. Можно использовать существующее:

$filename = basename($file_path); 

, а можно дать новое:

//найдем расширение файла
$basename = basename($file_path); 
if (strrpos($basename, '.')!==false ) { 
  $file_extension = substr($basename, strrpos($basename, '.')+1);
} else {
  $file_extension = '';
}
$filename='newName.'.$file_extension;

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

//Проверим наличие директории "public://images/" и если ее еще нет, то создаем
$real_url = file_destination("public://images/test.txt", FILE_EXISTS_REPLACE);
$real_dir=drupal_dirname($real_url); 
	if(!is_dir($real_dir)){
		if(mkdir($real_dir,0777)){
			drupal_set_message(t("Folder '!name' create",array('!name'=>$real_dir)));
			}
		else{
			drupal_set_message(t("Error create folder: ").$real_dir, 'error');
		}
	}
Соберем все вместе и получим вот такой фрагмент. Можно использовать в цикле, меняя URL ($file_path) файла для закачки.
$file_path='ht tp://frantsuzzz.com/sites/frantsuzzz.com/files/logo2008_0.png';
//найдем расширение файла
$basename = basename($file_path); 
if (strrpos($basename, '.')!==false ) { 
  $file_extension = substr($basename, strrpos($basename, '.')+1);
} else {
  $file_extension = '';
}

// Получаем директорию и если ее еще нет, то создаем
// Если Вы уверены, что директория уже существует, то фрагмент ниже можно пропустить
$real_url = file_destination("public://images/test.txt", FILE_EXISTS_REPLACE);
$real_dir=drupal_dirname($real_url); 
	if(!is_dir($real_dir)){
		if(mkdir($real_dir,0777)){
			drupal_set_message(t("Folder '!name' create",array('!name'=>$real_dir)));
			}
		else{
			drupal_set_message(t("Error create folder: ").$real_dir, 'error');
		}
	}

//Приготовления закончены, теперь приступим непосредственно к сохранению файла
//Укажем путь для сохранения файла вместе с именем файла.
$destination='public://images/logo_'.$node->nid.'.'.$file_extension;
 
//Загружаем путь
 $data = drupal_http_request($file_path);

//Проверяем на успешную загрузку 
if($data->code==200){ 
 //Сохраняем файл 
 $file = file_save_data($data->data, $destination);
 if ($file) {
  $node->field_image[LANGUAGE_NONE][] = (array)$file;
  node_save($node);
   }
}

update 02.06.2013 После выполнения кода картинка заливается на сайт, к ноде прикрепляется. Вот только при редактировании ноды выдает ошибку "The file used in the field may not be referenced". Если у Вас та же проблема, после сохранения ноды вызовите функцию

file_usage_add($file, 'file', 'node', $node->nid);

Данная функция создает связь изображения с нодой в таблице {file_usage}.

Добавить комментарий
Может быть интересно

Данный скрипт поможет пересохранить файлы Excel в csv. Может быть полезно перед отправкой прайсов на хостинг для дальнейшей обработки

6

Порядок действий для установки Solr на сервере с Centos 7

4

В операционной системе Windows, как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки (command shell).

3
Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.
2

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

1