Joindre des fichiers par programme


25

J'ai créé le type de contenu "Galerie" et ajouté deux champs: "photo" et "document". J'ai ensuite utilisé le code suivant pour télécharger un fichier dans le champ "document":

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);

} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }

J'attache ce fichier au nœud en utilisant le code suivant:

$customNode->field_document[$customNode->language][0] = (array)$file;

Lorsque j'appelle la node_submit()fonction, j'obtiens l'erreur suivante:

Violation de contrainte d'intégrité: 1048 La colonne 'field_document_display' ne peut pas être nulle

Quelqu'un sait-il ce que je fais mal?

Réponses:


29

Je ne lance généralement pas la (array)$fileligne parce que la seule chose dont les données de terrain ont besoin est la fidélité, la description et l'affichage. Je fais donc généralement ce qui suit:

$node->field_image[LANGUAGE_NONE][] = array(
  'fid' => $file->fid,
  'display' => 1,
  'description' => '',
);
node_save( $node );

De cette façon, si l'affichage est requis, je ne reçois pas d'erreur. Mais c'est juste moi ...


Confus pour moi pourquoi il n'a pas de valeurs par défaut.
32i

Vous ne voyez pas les valeurs par défaut car il s'agit d'une affectation directe.
Lester Peabody

7

Votre solution est presque la bonne; cependant, dans certains cas, cela nécessite que vous définissiez également l'affichage et la description.

Pour faire fonctionner votre code, procédez comme suit:

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);
  //set the extra values needed to make node_save work
  $file->display = 1;
  $file->description = "";
} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }

2

Je pense que la clé ici sont ces lignes

$file->display = 1;
$file->description = "";

comme l'a souligné Eric van Eldik. Je me débattais avec exactement le même problème, ajoutant juste

$file->display = 1;

n'a pas aidé, mais

$file->description = "";

fait ma journée.


0

Pour ajouter un fichier par programme au nœud, vous pouvez utiliser

$managed = TRUE; // Whether or not to create a Drupal file record
$filename = 'public://imdb-cast-' . time() . '.jpg';
$iamge_file = system_retrieve_file($url,$filename , $managed);
if($iamge_file){
$file = file_load(db_query('SELECT MAX(fid) FROM {file_managed}')->fetchField());
$node->field_image['und'][0] = (array) $file;
  }
}

0

Juste pour coller ma solution ici aussi, je devais créer un nouveau nœud et télécharger une image par programme.

$filepath = variable_get('file_public_path') . '/xmas_banner.jpg';
$file_temp = file_get_contents($filepath);
$file_temp = file_save_data($file_temp, file_default_scheme() . '://' .'xmas_banner_nl.jpg', FILE_EXISTS_RENAME);

$node = new stdClass();
$node->type = 'carousel'; // custom content type
$node->title = 'XMAS NL';
$node->field_banner_image['und'][0] = (array) $file_temp;
$node->uid = 1;
$node->status = 0;
$node->active = 0;
$node->promote = 0;
node_save($node);

0

Attachez plusieurs fichiers par programme dans Drupal 8:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.