2010-06-04 1 views
1

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

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

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

ответ

1

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

Кажется, что все в порядке. :)

-4

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

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

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

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

+3

Noooooo! не ткните в базе данных! – Rimian

+0

уверен. Но если ваша база данных сломана, вам нужно будет прогнать ее, чтобы исправить ее снова. И база данных Aces кажется сломанной. – berkes

+0

Очень плохой совет ...никогда не касайтесь базы данных напрямую. – Disco

5

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

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

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

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

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

5

Этот код будет сделать это:

$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); 
+0

Прохладный! У меня было что-то подобное выложенное, но без node_submit() .. Что такое diff? – Ace

+1

node_submit создает тизер, добавляет пользователя, если он не установлен, и устанавливает дату создания и дату обновления для узла. – Tom

+0

http://api.drupal.org/api/function/node_submit/6 – Tom