Secara sistematis melampirkan file

25

Saya telah membuat tipe konten "Galeri", dan menambahkan dua bidang: "foto," dan "dokumen." Saya kemudian menggunakan kode berikut untuk mengunggah file di bidang "dokumen":

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

Saya melampirkan file ini ke node menggunakan kode berikut:

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

Ketika saya memanggil node_submit()fungsi, saya mendapatkan kesalahan berikut:

Pelanggaran batasan integritas: 1048 Kolom 'field_document_display' tidak boleh nol

Adakah yang tahu apa yang saya lakukan salah?

Vinodkumar SC
sumber

Jawaban:

29

Saya biasanya tidak membuang (array)$filegaris karena satu-satunya hal yang dibutuhkan data lapangan adalah fid, deskripsi dan tampilan. Jadi saya biasanya melakukan hal berikut:

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

Dengan cara ini jika tampilan diperlukan, saya tidak mendapatkan kesalahan. Tapi itu hanya aku ...

Mark Casias
sumber
Membingungkan saya mengapa tidak memiliki nilai default.
32i
Anda tidak melihat nilai default karena ini adalah penugasan langsung.
Lester Peabody
7

Solusi Anda hampir benar; namun, dalam beberapa kasus mengharuskan Anda juga mengatur tampilan dan deskripsi.

Untuk membuat kode Anda berfungsi, lakukan ini:

$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
sumber
2

Saya pikir kuncinya di sini adalah garis-garis itu

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

seperti yang ditunjukkan oleh Eric van Eldik. Saya berjuang dengan masalah yang sama persis, menambahkan adil

$file->display = 1;

tidak membantu, tapi

$file->description = "";

membuatku bahagia.

Victor Lazov
sumber
0

Untuk menambahkan file secara terprogram ke node yang dapat Anda gunakan

$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
sumber
0

Hanya akan menempelkan solusi saya di sini juga, saya perlu membuat simpul baru, dan mengunggah gambar secara terprogram.

$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
sumber
0

Lampirkan beberapa file secara terprogram di Drupal 8:

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