Drupal: программное сохранение изображений полей изображения - PullRequest
1 голос
/ 04 июня 2010

Я пытаюсь написать функцию синхронизации, которая сохраняет некоторые данные на узлах, которая работает нормально, пока я не попытаюсь сохранить уменьшенное изображение, связанное с узлом.

Мне удалось скачать файл и поместить его в папку «sites / default / files», но как лучше всего сказать Drupal «поместить этот файл в это поле изображения CCK»?

EDIT Чтобы уточнить немного ... Я синхронизирую миниатюры отдельно (так как одно изображение может использоваться несколькими узлами) ... Я хотел бы, чтобы начальная синхронизация миниатюр сохраняла файлы в правильной папке (не временной) и просто указывала imagefield к этому файлу ... Вот что меня раздражает с помощью field_file_save_file (), он сохраняет новый файл вместо того, чтобы просто сделать указатель .. Любой совет?

Ответы [ 4 ]

5 голосов
/ 04 июня 2010

Вы можете использовать field_file_save_file();, чтобы переместить файл из временного каталога в нужное вам место и создать объект, который будет сохранен как поле CCK.

См .: http://api.lullabot.com/field_file_save_file

Затем вы можете сохранить свое поле, используя возвращаемое значение следующим образом:

$node->field_image[0] = field_file_save_file($my_file_path, array(), $my_destination);

Возможно, вам потребуется выполнить несколько тестов. Поэтому вам нужно будет очистить каталог назначения и сделать это снова.

5 голосов
/ 04 июня 2010

Этот код сделает это:

$imagefile = '/temp/somefile.jpg';
// Load up the CCK field  
$field = content_fields('field_image', 'mycontenttype');
// Load up the appropriate validators
$validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field));
// Where do we store the files?
$files_path = filefield_widget_file_path($field);
// Create the file object, replace existing file with new file as source and dest are the same
$file = field_file_save_file($imagefile, $validators, $files_path, FILE_EXISTS_REPLACE);


$node = node_load($mynode);
$node->field_image[] = $file;
$node = node_submit($node);
node_save($node);
1 голос
/ 09 июня 2010

Кинда решил это сам, я думаю.Я field_file_save_file () мои эскизы отдельно, а затем field_file_load () их при синхронизации узлов.

Кажется, работает нормально:)

0 голосов
/ 04 июня 2010

Вам нужно будет ковыряться в базе данных. К сожалению, ваша база данных может быть размещена различными способами, в зависимости от использования полей. Так что объяснять немного сложно. CCK будет перемещаться по таблицам, переименовывать вещи и (де) нормализовать базы данных, если сочтет это необходимым. Данные могут быть где угодно :) И в зависимости от того, где они сейчас живут, становится все труднее или труднее решить эту проблему.

Скажем, ваш тип узла - foo , а поле миниатюр - bar . Вы можете иметь столбец bar в таблице content_foo , но вы также можете иметь таблицу content_field_bar

Внутри этой таблицы в поле изображения хранятся внешние ключи для таблицы file . Вам нужно либо найти запись в таблице файлов, если она существует, либо ввести новую запись. Это не легко. Затем добавьте ключ для этой записи файла в таблицу content_foo, строку столбца или в поле content_field_bar.

Но, прежде чем начать с этого: это действительно не стоит боли: просто удалите узел и скопируйте и вставьте содержимое в новый.

...