Програмне створення об’єкту file для заповнення CCK-поля типу filefield (в т.ч. imagefield)

23.09.2017

CCK-поле файлового типу в ноді містить в собі окрім шляху до самого файлу ще й id файлу (fid). При програмному створенні ноди в це поле потрібно передати саме fid файлового об’єкту. Але що робити у випадку, коли у вас є лише шлях до файлу на сервері, і ви не маєте ніякої гадки, де взяти його fid?

Потрібно створити файловий об’єкт та зберегти його у базі.

Об’єкт "File" має наступні поля

  • fid: ID файлу.
  • uid: uid користувача, що асоціюється з цим файлом.
  • filename: ім’я файлу без шляху.
  • filepath: шлях до файлу (повний, з урахуванням імені файлу).
  • filemime: MIME-тип файлу.
  • filesize: розмір файлу в байтах.
  • status: поле вказує на статус файлу.
    Можливі значення:
    FILE_STATUS_PERMANENT - файл для постійного зберігання,
    FILE_STATUS_TEMPORARY - тимчасовий файл.
  • timestamp: час, коли файл був доданий до бази данних (в UNIX-форматі).

Створюємо новий об’єкт та заповнюємо його поля:

<?php
$file = new stdClass();
$file->filename = basename($file_temp); // $file_temp - повний шлях до файлу на сервері. Функція basename визначає ім"я файлу.
$file->filepath = $file_temp;
$file->filemime = file_get_mimetype($file_temp); // Визначаємо MIME-тип файлу та призначаємо його об"єкту, що створюємо
$file->filesize = filesize($file_temp); // Вказуємо розмір файлу
$file->uid = $user->uid; // Вказуємо uid користувача, що додає файл
$file->status = FILE_STATUS_PERMANENT; // Надаємо статус файлу:
// FILE_STATUS_PERMANENT - файл для постійного зберігання,
// FILE_STATUS_TEMPORARY - тимчасовий файл
?>

Додамо об’єкт до бази:

<?php
drupal_write_record('files', $file);
?>

Отримати fid новостворенного об’єкту можна виконавши наступний запит до бази:

<?php
$file->fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $file->filepath));
?>

Готово. Тепер залишається заповнити ваше файлове CCK-поле для ноди. Наприклад:

<?php
$node->field_img[0]['fid'] = $file->fid;
$node->field_img[0]['uid'] = $file->uid;
$node->field_img[0]['filename'] = $file->filename;
$node->field_img[0]['filepath'] = $file->filepath;
$node->field_img[0]['filemime'] = $file->filemime;

node_save($node);
?>

Сподіваюсь цей матеріал буде вам корисним.

p.s. Ця стаття написана через те, що коли зіштовхнувся з цим питанням, його вирішення не вдалося нагуглити в пару кліків.