Programmgesteuertes Anhängen von Dateien


25

Ich habe den Inhaltstyp "Galerie" erstellt und zwei Felder hinzugefügt: "Foto" und "Dokument". Ich habe dann den folgenden Code zum Hochladen einer Datei im Feld "Dokument" verwendet:

$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.');
 }

Ich hänge diese Datei mit dem folgenden Code an den Knoten an:

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

Wenn ich node_submit()function aufrufe, erhalte ich folgende Fehlermeldung:

Verletzung der Integritätsbedingung: 1048 Die Spalte 'field_document_display' darf nicht null sein

Weiß jemand, was ich falsch mache?

Antworten:


29

Normalerweise werfe ich keine (array)$fileZeile, weil das einzige, was die Felddaten wirklich benötigen, die ID, die Beschreibung und die Anzeige ist. Also mache ich normalerweise folgendes:

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

Auf diese Weise erhalte ich keine Fehlermeldung, wenn das Display benötigt wird. Aber das bin nur ich ...


Verwirrend für mich, warum es keine Standardwerte hat.
32i

Sie sehen keine Standardwerte, da dies eine direkte Zuweisung ist.
Lester Peabody

7

Ihre Lösung ist fast richtig; In einigen Fällen müssen Sie jedoch auch Anzeige und Beschreibung festlegen.

Damit Ihr Code funktioniert, gehen Sie folgendermaßen vor:

$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

Ich denke, der Schlüssel hier sind diese Zeilen

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

wie Eric van Eldik betonte. Ich kämpfte mit genau dem gleichen Problem und fügte gerade hinzu

$file->display = 1;

hat nicht geholfen, aber

$file->description = "";

meinen Tag gerettet.


0

Zum programmgesteuerten Hinzufügen von Dateien zu Knoten können Sie verwenden

$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

Um meine Lösung auch hier einzufügen, musste ich einen neuen Knoten erstellen und ein Bild programmgesteuert hochladen.

$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

Hängen Sie mehrere Dateien programmgesteuert in Drupal 8 an:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.