Сохранение узлов с файловым полем - PullRequest
2 голосов
/ 29 октября 2009

Я в процессе создания функции массовой загрузки для сайта Drupal. Используя флэш, я могу загрузить файлы по определенному URL, который затем обрабатывает файлы. То, что я хочу сделать, это не просто загрузить файлы, но создать узел определенного типа с файлом, сохраненным в файловом поле, которое было настроено с помощью CCK. Поскольку это аудиофайлы, важно, чтобы файловое поле обрабатывало файлы, поэтому дополнительные метаданные могут быть предоставлены модулем getid3.

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

Если у кого-то есть опыт в этом, я бы оценил некоторые советы о том, как подойти к этому вопросу.

Ответы [ 3 ]

8 голосов
/ 29 октября 2009

Мне пришлось сделать нечто подобное несколько недель назад, и в итоге я адаптировал некоторые функции из модуля Удаленный файл , особенно функцию remote_file_cck_attach_file(). Он использует функцию field_file_save_file() из модуля filefield, которая может быть функцией, которую вы ищете.

В моем случае файлы выбираются из нескольких удаленных мест и временно сохраняются с использованием file_save_data(). Присоединение их к полю файла CCK происходит в hook_nodeapi() presave, используя следующее:

public static function attachAsCCKField(&$node, $filepath, $fieldname, $index=0) {
  // Grab the filefield definition
  $field = content_fields($fieldname, $node->type);
  $validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field));
  $fieldFileDirectory = filefield_widget_file_path($field);
  // This path does not necessarily exist already, so make sure it is available
  self::verifyPath($fieldFileDirectory);
  $file = field_file_save_file($filepath, $validators, $fieldFileDirectory);
  // Is the CCK field array already available in the node object?
  if (!is_array($node->$fieldname)) {
    // No, add a stub
    $node->$fieldname=array();
  }
  $node->{$fieldname}[$index] = $file;
}

$filepath - это путь к файлу, который должен быть присоединен, $fieldname - это внутреннее имя экземпляра файлового поля, которое будет использоваться в узле, а $index будет основанным на 0 индексом присоединенного файла в случае несколько полей ввода.

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

public static function verifyPath($path) {
  if (!file_check_directory($path, FILE_CREATE_DIRECTORY)) {
    throw new RuntimeException('The path "' . $path . '" is not valid (not creatable, not writeable?).');
  }
}

Это сделало это для меня - все остальное происходит при автоматическом сохранении узла.

Я еще не использовал модуль getid3, поэтому я понятия не имею, будет ли он соответствовать этому способу. Кроме того, мне не нужно было добавлять дополнительную информацию / атрибуты в файловое поле, так что, возможно, вам нужно было бы поместить больше информации в массив полей, чем просто файл, возвращаемый field_file_save_file(). В любом случае, надеюсь, это поможет и удачи.

1 голос
/ 29 октября 2009

Возможно, вы захотите взглянуть на Image FUpload , если вам нужно взглянуть на интеграцию загрузки Flash.

Передача файлов на другой сервер, в то же время обрабатывая их через Drupal, немного напоминает пространство CDN, возможно, посмотрите на поведение в проектах CDN или CDN2 ?

Если вы найдете ясное решение, вернитесь и опубликуйте его!

1 голос
/ 29 октября 2009

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

$image['data'] =array(
            'title' => $media_reference_attributes->getNamedItem("source")->value,
            'description' => $description,
            'alt' => "",);
$image['width'] = $width;
$image['height'] = $height;
$image['mimetype'] = $mime_type
$image['uid'] = 1;
$image['status'] = 1;
$image['fid'] = $fid;
$image['filesize'] = $file->filesize;
$image['nid'] = $id;
$image['filename'] = $url;
$image['timestamp'] = $file->timestamp;
$image['filepath'] = $file_path;

Надеюсь, это поможет.

...