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