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?

Vinodkumar SC
la source

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 ...

Mark Casias
la source
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.');
 }
Eric van Eldik
la source
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.

Victor Lazov
la source
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;
  }
}
Yusef
la source
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);
Bram
la source
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();
Tien Wang
la source