it-swarm-vi.com

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

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 hàm node_submit(), 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?

25
Vinodkumar SC

Tôi thường không ném (array)$file line 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 ...

29
Mark Casias

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

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.

2
Victor Lazov

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
Bram

Để 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
Yusef

Đí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();
0
Tien Wang