не получается приатачить файл к ноде. В чем хитрость?

Прислано: 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);

В результате нода создается, файл загружается на сервер, но вот файл никак не связан с нодой. Может кто сталкивался?

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано RxB в вт, 10/11/2009 - 19:27.

скорее всего, должно быть:
$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'те её


Опубликовано caspermax в вт, 10/11/2009 - 19:42.

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
)

)
Судя по нему - все верно.


Опубликовано caspermax в ср, 11/11/2009 - 14:50.

Есть все же глупый вопрос

		$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,
			),
		);

Это ручная вставка картинки? Разве так правильно?


Опубликовано RxB в ср, 11/11/2009 - 15:18.

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


Опубликовано caspermax в ср, 11/11/2009 - 18:52.

Да это понятно, но не хочется все же добавлять лишний функционал к ноде, тем более, если точно знаю что устраивает стандартный....
Что-то мне кажется что не тем путем пошел - создал свою форму ввода данных, хотя, как мне сейчас кажется - наверное проще было добавить все красивости через form_alter.


Опубликовано RxB в ср, 11/11/2009 - 18:57.

Где написано про лишний функционал? Это кусок моего модуля импорта контента из WP, используется для подготовки объекта ноды для сохранения


Опубликовано caspermax в вс, 15/11/2009 - 12:52.

Я вообще-то говорил о себе....


Опубликовано caspermax в вс, 22/11/2009 - 20:27.

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

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


Опубликовано RxB в вс, 22/11/2009 - 20:32.

Раскрою более большой кусок своего кода:

$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,
    ),
  );


Опубликовано caspermax в ср, 25/11/2009 - 11:00.

Ну если я все верно понял, то его можно на порядок сократить. В частности от этого момента:
$file = new stdClass();
Если интересно - могу помочь в оптимизации.


Опубликовано RxB в ср, 25/11/2009 - 15:04.

Что было на d.o, то я и использую


Опубликовано caspermax в чт, 26/11/2009 - 09:12.

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


Новое на сайте

Ссылки партнёров