프로그래밍 방식으로 파일 첨부


25

"갤러리"컨텐츠 유형을 작성하고 "사진"및 "문서"의 두 필드를 추가했습니다. 그런 다음 "문서"필드에 파일을 업로드하기 위해 다음 코드를 사용했습니다.

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

다음 코드를 사용하여이 파일을 노드에 첨부합니다.

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

node_submit()함수를 호출 하면 다음 오류가 발생합니다.

무결성 제약 조건 위반 : 1048 'field_document_display'열은 null 일 수 없습니다.

아무도 내가 뭘 잘못하고 있는지 알고 있습니까?

답변:


29

(array)$file실제로 필드 데이터에 필요한 유일한 것은 fid, 설명 및 표시이기 때문에 나는 일반적으로 선을 던지지 않습니다 . 그래서 나는 보통 다음을 수행합니다.

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

이렇게하면 디스플레이가 필요한 경우 오류가 발생하지 않습니다. 하지만 그건 나 뿐이야


왜 기본값이 없는지 혼란 스럽습니다.
32i

직접 할당이므로 기본값이 표시되지 않습니다.
레스터 피바디

7

귀하의 솔루션은 거의 옳습니다. 그러나 경우에 따라 표시 및 설명도 설정해야합니다.

코드를 작동 시키려면 다음을 수행하십시오.

$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

여기 열쇠가 그 줄이라고 생각합니다

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

Eric van Eldik이 지적한대로. 나는 똑같은 문제로 어려움을 겪고 있었고,

$file->display = 1;

도움이되지 않았지만

$file->description = "";

내 하루를 만들었습니다.


0

프로그래밍 방식으로 노드에 파일을 추가하려면 다음을 사용할 수 있습니다

$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

여기에 솔루션을 붙여 넣으려면 새 노드를 만들고 프로그래밍 방식으로 이미지를 업로드해야했습니다.

$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

Drupal 8에서 프로그래밍 방식으로 여러 파일을 첨부하십시오.

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.