Programowo załączanie plików

25

Utworzyłem typ zawartości „Galeria” i dodałem dwa pola: „zdjęcie” i „dokument”. Następnie użyłem następującego kodu do przesłania pliku w polu „dokument”:

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

Załączam ten plik do węzła za pomocą następującego kodu:

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

Po wywołaniu node_submit()funkcji pojawia się następujący błąd:

Naruszenie ograniczenia integralności: 1048 Kolumna „wyświetlanie_pliku_dokumentu” nie może mieć wartości NULL

Czy ktoś wie, co robię źle?

Vinodkumar SC
źródło

Odpowiedzi:

29

Zazwyczaj nie rzucam (array)$filelinii, ponieważ tak naprawdę jedyne, czego potrzebują dane pola, to fid, opis i wyświetlanie. Więc zazwyczaj wykonuję następujące czynności:

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

W ten sposób, jeśli wymagany jest wyświetlacz, nie pojawia się błąd. Ale to tylko ja ...

Mark Casias
źródło
Mylące dla mnie, dlaczego nie ma wartości domyślnych.
32i
Nie widzisz wartości domyślnych, ponieważ jest to bezpośrednie przypisanie.
Lester Peabody
7

Twoje rozwiązanie jest prawie właściwe; jednak w niektórych przypadkach wymaga to również ustawienia wyświetlania i opisu.

Aby kod działał, wykonaj następujące czynności:

$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
źródło
2

Myślę, że kluczem tutaj są te linie

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

jak zauważył Eric van Eldik. Walczyłem z dokładnie tym samym problemem, dodając tylko

$file->display = 1;

nie pomogło, ale

$file->description = "";

uczyniło mój dzień.

Victor Lazov
źródło
0

Do programowego dodania pliku do węzła można użyć

$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
źródło
0

Wkrótce też tutaj wkleję moje rozwiązanie, musiałem utworzyć nowy węzeł i załadować programowo obraz.

$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
źródło
0

Dołącz programowo wiele plików w Drupal 8:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
Tien Wang
źródło