2010-06-04 5 views
1

J'essaie d'écrire une fonction de synchronisation qui enregistre des données sur les nœuds, ce qui fonctionne bien, jusqu'à ce que j'essaie d'enregistrer l'image miniature associée au nœud.Drupal: Enregistrement par image des images imagefield

J'ai réussi à télécharger le fichier et à le placer dans mon dossier sites/default/files, mais quelle est la meilleure façon de dire à Drupal, "mettre ce fichier dans ce CCK imagefield"?

EDIT Pour clarifier un peu .. je synchroniser les vignettes séparément (depuis une image peut être utilisée par plusieurs nœuds) ... Je voudrais que la synchronisation initiale des vignettes pour enregistrer les fichiers dans le dossier correct (pas temp one) et il suffit de pointer l'imagefield vers ce fichier ... C'est ce qui m'énerve avec field_file_save_file(), il enregistre un nouveau fichier au lieu de simplement faire un pointeur .. Un conseil?

Répondre

1

résolu Kinda moi-même je pense. I field_file_save_file() mes vignettes séparément, puis field_file_load() les lors de la synchronisation des noeuds.

Cela semble fonctionner correctement. :)

-4

Vous aurez besoin de fouiller dans la base de données. Malheureusement, votre base de données peut être agencée de nombreuses façons, en fonction de l'utilisation des champs. Donc, expliquer est un peu difficile. CCK va déplacer les tables, renommer les éléments et (dé) normaliser les bases de données s'il le juge nécessaire. Les données peuvent être n'importe où :) Et selon où il vit maintenant, il devient plus facile ou plus difficile de résoudre ce problème.

Dites, votre type de noeud est foo et le champ miniature est bar. Vous pourriez avoir une colonne bar dans le tableau content_foo, mais vous pouvez aussi avoir une table content_field_bar

Dans ce tableau, les magasins de ImageField clés étrangères à la table de fichiers . Vous devez soit trouver l'entrée dans la table de fichiers, si elle existe, soit entrer un nouvel enregistrement. Ce n'est pas facile. Ajoutez ensuite la clé pour cette entrée de fichier dans la table content_foo, dans la barre de colonnes ou dans la barre de contenu.

Mais, avant de commencer: cela ne vaut vraiment pas la peine: il suffit de supprimer le noeud et de copier-coller le contenu dans un nouveau.

+3

Noooooo! ne pas fouiller dans la base de données! – Rimian

+0

sûr. Mais si votre base de données est cassée, vous aurez besoin de poke arount dedans pour le réparer à nouveau. Et la base de données Aces semble cassée. – berkes

+0

Très mauvais conseil ...ne touchez jamais la base de données directement. – Disco

5

Vous pouvez utiliser field_file_save_file(); pour déplacer le fichier d'un répertoire temp vers votre destination et créer l'objet à enregistrer en tant que champ CCK.

Voir: http://api.lullabot.com/field_file_save_file

Ensuite, vous pouvez enregistrer votre champ en utilisant la valeur retournée comme ceci:

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

Vous aurez probablement besoin de passer quelques tests. Vous aurez donc besoin de rayer votre répertoire de destination et recommencez.

5

Ce code fera:

$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

Cool! J'avais quelque chose de similaire, mais sans node_submit() .. Quel est le diff? – Ace

+1

node_submit crée le teaser, ajoute l'utilisateur s'il n'est pas défini et définit la date de création et la date de mise à jour du nœud. – Tom

+0

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

Questions connexes