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?

Vinodkumar SC
quelle

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

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

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