Lập trình đính kèm tập tin


25

Tôi đã tạo loại nội dung "Thư viện" và thêm hai trường: "ảnh" và "tài liệu". Sau đó, tôi đã sử dụng mã sau đây để tải lên một tệp trong trường "tài liệu":

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

Tôi đang đính kèm tập tin này vào nút bằng đoạn mã sau:

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

Khi tôi gọi node_submit()hàm, tôi gặp lỗi sau:

Vi phạm ràng buộc toàn vẹn: 1048 Cột 'field_document_display' không thể rỗng

Có ai biết tôi đang làm gì sai không?

Câu trả lời:


29

Tôi thường không ném (array)$filedòng vì thực sự điều duy nhất mà dữ liệu trường cần là fid, mô tả và hiển thị. Vì vậy, tôi thường làm như sau:

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

Bằng cách này nếu màn hình được yêu cầu, tôi không gặp lỗi. Nhưng đó chỉ là tôi ...


Nhầm lẫn với tôi tại sao nó không có giá trị mặc định.
32i

Bạn không thấy các giá trị mặc định vì đây là gán trực tiếp.
Lester Peabody

7

Giải pháp của bạn là gần như đúng; tuy nhiên, trong một số trường hợp, bạn cũng cần phải đặt hiển thị và mô tả.

Để làm cho mã của bạn hoạt động, hãy làm điều này:

$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

Tôi nghĩ chìa khóa ở đây là những dòng

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

như Eric van Eldik đã chỉ ra. Tôi đã đấu tranh với cùng một vấn đề, chỉ thêm

$file->display = 1;

không giúp, nhưng

$file->description = "";

làm cho ngày của tôi


0

Để thêm tệp theo chương trình vào nút, bạn có thể sử dụng

$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

Chỉ cần dán giải pháp của tôi ở đây là tốt, tôi cần phải tạo một nút mới và tải lên một hình ảnh theo chương trình.

$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

Đính kèm nhiều tệp theo chương trình trong Drupal 8:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.