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?

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


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

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.


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

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

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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.