Мне пришлось сделать нечто подобное несколько недель назад, и в итоге я адаптировал некоторые функции из модуля Удаленный файл , особенно функцию 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()
. В любом случае, надеюсь, это поможет и удачи.