web-dev-qa-db-fra.com

Comment affecter (attacher) par programme un fichier à un champ de fichier lors de la création / sauvegarde du nœud?

J'essaie d'assigner (pas de télécharger) des fichiers aux nœuds par programme.

Voici le scénario:

Je vais créer 2000 nœuds et il y a 2000 PDF (un PDF par nœud). Je ne veux pas télécharger ces fichiers via Drupal. Je téléchargerai tous ces fichiers PDF via FTP.

Ces fichiers PDF sont bien nommés, je veux dire tous ont un nom standardisé tel que {field_magazine_name}-{field_issue_number}.pdf (sous sites/default/files/pdf par exemple).

Ce que je veux faire, c'est affecter ces fichiers PDF aux nœuds associés lors de la création/sauvegarde des nœuds.


Méthode possible 1

Une méthode pour ce faire serait d'utiliser le module File Field Sources . enter image description here

Je pense que le transfert de fichiers à distance peut être utilisé avec du code JavaScript. L'entrée de transfert de fichiers à distance peut être automatiquement remplie avec les champs que je veux et cela fonctionnera (par exemple http://example.com/sites/default/files/pdf/{field_magazine_name}-{field_issue_number}.pdf) ... mais je ne crée pas de nœuds manuellement , je crée les nœuds via Feeds . Donc, utiliser JavaScript n'est pas la méthode que je peux utiliser.

Existe-t-il un moyen d'affecter (attacher) par programme un fichier à un champ de fichier lors de la création/sauvegarde du nœud?

4
herci

J'avais une situation similaire. Ma situation est d'attacher un fichier à un nœud dans la création d'un nœud de type de contenu différent. Fait ceci dans hook_node_insert

  1. Au départ, j'ai téléchargé tous les fichiers dans un répertoire temporaire dans/default/files /.
  2. Ensuite, pour chaque nœud, j'ai créé un nouvel objet fichier avec mes attributs de fichier.
  3. Ensuite, j'ai déplacé ce fichier particulier vers la destination où je veux que les fichiers soient placés. Il en résulte un objet fichier complet propre avec fid.
  4. Ensuite, affectez simplement ces attributs d'objet de fichier au champ de fichier et enregistrez le nœud.

Le code utilisé est le suivant.

$source_node = node_load($nid);
$filename = $bio_file_name; //your specific filename 
$dir = 'public://temp-path/'.$filename; //path to specific file with name
$file_size = filesize($dir);

//New file object
$file = new stdClass;
$file->uid = $source_node->uid;
$file->filename = $filename;
$file->uri = $dir;
$file->filemime = file_get_mimetype($dir);
// Make it permanent, otherwise it will get deleted later.
$file->status = FILE_STATUS_PERMANENT;
// Save file object to make it a 'managed file'.
$file_obj = file_move($file, 'public://newpath', FILE_EXISTS_REPLACE);

$source_node->your-file-field-name['und'][0] = array(
 'fid'  => $file_obj->fid,
 'uid'  => $file_obj->uid,
 'filename'  => $file_obj->filename,
 'uri'  => $file_obj->uri,
 'filemime'  => $file_obj->filemime,
 'filesize'  => $file_obj->filesize,
 'status'  => 1,
 'display'  => 1,
 'description'  => '', 
 );

 node_save($source_node); 

J'espère que cela vous aidera..

4
Abin

Ajouter des champs de fichier/image

// Some file on our system
$file_path = drupal_realpath('somefile.png'); // Create a File object
$file = (object) array(
  'uid' => 1,
  'uri' => $file_path,
  'filemime' => file_get_mimetype($file_path),
  'status' => 1,
); 
$file = file_copy($file, 'public://'); // Save the file to the root of the files directory. You can specify a subdirectory, for example, 'public://images' 
$node->field_image[LANGUAGE_NONE][0] = (array)$file; //associate the file object with the image field:

Pour plus de détails

2
Adi

En plus d'Abin: définissez également l'utilisation du fichier en ajoutant ce code après la sauvegarde du nœud:

file_usage_add($file_obj, 'file', 'node', $source_node->nid);

Voir les documents drupal .

Une dernière chose à part cela: il est préférable d'utiliser LANGUAGE_NONE au lieu de "und".

1
Patrick Scheffer