Часто возникает необходимость программно заполнять сайт определенным контентом. Заполнение текстовых полей обычно не вызывает проблем. Другое дело - картинки. Почему-то с ними возникает много сложностей у людей.
Покажу фрагмент кода, позволяющего загрузить изображение с другого сайта (сервера) и записать его в ноду.
$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');
}
}
$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}.
- 01.06.2013
- 54 просмотра