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?

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


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

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


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;
  }
}

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);

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.