не получается приатачить файл к ноде. В чем хитрость?
Прислано: caspermax
вт, 10/11/2009 - 19:20
Не получается приатачить файл к ноде. В чем хитрость? Вот фрагмент кода:
..... $dest = file_directory_path(); $validation = array(); if ($file = file_save_upload('upload', $validation, $dest, FILE_EXISTS_RENAME)) { file_set_status( $file, FILE_STATUS_PERMANENT ); $node->files[$file->fid] = (object)$file; } node_save($node);
В результате нода создается, файл загружается на сервер, но вот файл никак не связан с нодой. Может кто сталкивался?
- caspermax's blog
- Для комментирования войдите или зарегистрируйтесь
скорее всего, должно быть:
$node->files[]=(object)$file;
Но неуверен.
У imgfield'а:
$node->field_blog_teaser_image= array( 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, ), );
Создайте руками ноду с файлами и за'var_dump'те её
- Для комментирования войдите или зарегистрируйтесь
imgfield меня как раз и не интересует, хотел стандартный файл добавлять. Перед этим взял создал ноду, распечатал массив:
......
[files] => Array
(
[106] => Array
(
[filename] => service.jpg
[filepath] => sites/default/files/service_1.jpg
[filemime] => image/jpeg
[source] => upload
[destination] => sites/default/files/service_1.jpg
[filesize] => 18584
[uid] => 9
[status] => 1
[timestamp] => 1257879829
[fid] => 106
)
)
Судя по нему - все верно.
- Для комментирования войдите или зарегистрируйтесь
Есть все же глупый вопрос
$node->field_blog_teaser_image= array( 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, ), );
Это ручная вставка картинки? Разве так правильно?
- Для комментирования войдите или зарегистрируйтесь
Это не ручная, это программная, правильная, неправильная, я хз, но работает как надо.
- Для комментирования войдите или зарегистрируйтесь
Да это понятно, но не хочется все же добавлять лишний функционал к ноде, тем более, если точно знаю что устраивает стандартный....
Что-то мне кажется что не тем путем пошел - создал свою форму ввода данных, хотя, как мне сейчас кажется - наверное проще было добавить все красивости через form_alter.
- Для комментирования войдите или зарегистрируйтесь
Где написано про лишний функционал? Это кусок моего модуля импорта контента из WP, используется для подготовки объекта ноды для сохранения
- Для комментирования войдите или зарегистрируйтесь
Я вообще-то говорил о себе....
- Для комментирования войдите или зарегистрируйтесь
Все же нашел способ сохранять файл и приатачивать его к ноде. Проблема оказалась в том, что за все это безобразие отвечает модуль upload. И пока данные файла и нашей ноды не будут занесены в таблицу upload - ничего не увидим. Жаль конечно что он на автомате не разбирает объект node.
В итоге родилось вот такое решение:
// ===== file upload start ====== $dest = file_directory_path(); $validation = array(); if ($file = file_save_upload('upload', $validation, $dest, FILE_EXISTS_RENAME)) { file_set_status( $file, FILE_STATUS_PERMANENT ); } // ===== file upload end ====== node_save($node); db_query("INSERT INTO {upload} (fid, nid, vid, list, description, weight) VALUES (%d, %d, %d, %d, '%s', %d)", $file->fid, $node->nid, $node->vid, 1, $file->filename, $file->weight);
Если кто придумает более элегантный вариант - буду только рад.
- Для комментирования войдите или зарегистрируйтесь
Раскрою более большой кусок своего кода:
$mime = 'image/jpeg'; $filepath = file_directory_path().'/oldsur/peopletemp/'.$photo->img; $file_temp = file_get_contents($filepath); $file_temp = file_save_data($file_temp, file_directory_path() .'/oldsur/peopleraw/'.time().rand(). '.jpg', FILE_EXISTS_RENAME); $file_drupal_path = $file_temp; $file = new stdClass(); $file->filename = basename($file_drupal_path); $file->filepath = $file_drupal_path; $file->filemime = $mime; $file->filesize = filesize($file_drupal_path); $file->uid = '1'; $file->status = FILE_STATUS_PERMANENT; $file->timestamp = time(); drupal_write_record('files', $file); $file->fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $file->filepath)); $node->field_photo_img = array( 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, ), );
- Для комментирования войдите или зарегистрируйтесь
Ну если я все верно понял, то его можно на порядок сократить. В частности от этого момента:
$file = new stdClass();
Если интересно - могу помочь в оптимизации.
- Для комментирования войдите или зарегистрируйтесь
Что было на d.o, то я и использую
- Для комментирования войдите или зарегистрируйтесь
Ясно, но я тогда вставлю свои 5 копеек:
if ($file = file_save_upload('upload', $validation, $dest, FILE_EXISTS_RENAME)) {
file_set_status( $file, FILE_STATUS_PERMANENT );
}
Эта конструкция 1) создает объект $file ($file = new stdClass();), 2)меняет его статус после удачной загрузки , 3) создает запись в таблице "files", 4) в созданном объекте уже есть элемент $file->fid, а значит строки
drupal_write_record('files', $file);
$file->fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $file->filepath));
оказываются совершенно ненужными. В итоге просто посчитайте на сколько строк сократится ваш код.
- Для комментирования войдите или зарегистрируйтесь


Комментарии