Drupal 6 Программно добавляем изображение в FileField - PullRequest
3 голосов
/ 25 января 2011

Как программно добавить изображение в поле файла?У меня есть url / filepath изображения, которое я хочу загрузить.Я пробовал следующее:

$newNode->field_profile_image[0]['value'] = 'http://www.mysite.com/default.gif';

Но, похоже, это не работает.

Я также пробовал:

$ newNode-> field_profile_image [0] ['значение '] =' sites / default / files / default.gif ';

Файл не обязательно должен быть внешним по отношению к веб-сайту.Я рад, что он есть где-то на данном сайте.

Ответы [ 5 ]

3 голосов
/ 10 февраля 2011

Возможно, вам придется использовать hook_nodeapi, чтобы установить это правильно.Вы захотите изменить его в операции «Вставка».Убедитесь, что вы восстановили узел после добавления обязательных полей.

Drupal хочет сопоставить изображение с записью в таблице файлов, поэтому простая настройка URL не будет работать.Прежде всего, если это удаленный файл, вы можете использовать функцию, указанную в модуле Brightcove в строке 176, brightcove_remote_image , чтобы захватить изображение и переместить его в локальный каталог.

После перемещения удаленного образа на место необходимо сохранить его в таблице файлов, а затем правильно настроить свойство узла.Я сделал это следующим способом:

////// in NodeAPI /////
    case "insert":
        $node->field_image[0] = _mymod_create_filearray($image_url);
        node_save($node);

Это записывает записи файлов, а затем возвращает правильно отформатированный массив изображений.

///// mymod_create_filearray /////
function _mymod_create_filearray($remote_url){
  if ($file_temp = brightcove_remote_image($remote_url)) {
    $file = new stdClass();
    $file->filename = basename($file_temp);
    $file->filepath = $file_temp;
    $file->filemime = file_get_mimetype($file_temp);
    $file->filesize = filesize($file_temp);

    $file->uid = $uid;
    $file->status = FILE_STATUS_PERMANENT;
    $file->timestamp = time();
    drupal_write_record('files', $file);

    $file = array(
     'fid' => $file->fid,
      'title' => basename($file->filename),
      'filename' => $file->filename,
      'filepath' => $file->filepath,
      'filesize' => $file->filesize,
      'mimetype' => $mime,
      'description' => basename($file->filename),
      'list' => 1,
    );
    return $file;
  }
  else {
    return array();
  }
}

И это должно сделать это.Дайте знать, если у вас появятся вопросы.

2 голосов
/ 14 февраля 2011

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

Суть в том, чтобы использовать функцию field_file_save_file() из модуля файлового поля для присоединения файла (во время hook_nodeapi, при операции presave), которая сделает большую часть работы за вас (более или менее, чем у Якобангела). «_mymod_create_filearray ()» пытается это сделать, но более приспособлен к нуждам файловых полей, включая проверку).

Предполагается, что файл уже существует в файловой системе серверов где-то (обычно в / tmp) и будет правильно «импортировать» его в Drupal с соответствующими записями в таблице файлов и т. Д. Если вы хотите импортировать файлы из удаленного URL-адреса, вам нужно сначала добавить дополнительный шаг их извлечения в качестве отдельной задачи / функции.

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

1 голос
/ 25 января 2011

используя nodeapi , вы сможете установить значение, как вы пытаетесь в примере кода, но только или локальные изображения.Скорее всего, вам нужно будет иметь изображения в папке «files» в вашей установке drupal, но если это настроено, все остальное должно работать без проблем.При использовании nodeapi могут произойти все, что обычно происходит при сохранении узла с использованием формы, например обновление таблицы файлов и т. Д.

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

0 голосов
/ 15 февраля 2011

Вот краткий пример из одного из моих проектов.

  $node = new stdClass;
  $node->title = 'Example Callout';
  $node->type = 'wn_hp_callout';
  // Search examples directory to attach some images.
  $callouts_dir = drupal_get_path('module', 'wn_hp_callout').'/imgs/examples/';
  $callout_imgs = glob($callouts_dir.'*.{jpg,jpeg,png,gif}',GLOB_BRACE);
  // Now add the images and provide imagefield extended additional text.
  foreach($callout_imgs as $img) {
    $img_info = pathinfo($img);
    $field = field_file_save_file($img, array(), file_directory_path() .'/example_callouts/');
    if( !isset($field['data']) ) {
      $field['data'] = array();
    }
    $field['data']['title'] = ucwords(str_replace('_',' ',$img_info['filename']));
    $field['data']['alt'] = 'This is alt text.';
    $node->field_wn_hp_callout_image[] = $field;
   }
   $node = node_submit($node);
   node_save($node);
0 голосов
/ 25 января 2011

То, что вы пытаетесь, не сработает.Drupal не предлагает способа обработки удаленных файлов без использования модуля.AFAIK нет модуля, который предлагает API для загрузки удаленных файлов через.

...