entity_metadata_wrapper를 사용하여 파일 필드의 값을 설정하는 방법


24

entity_metadata_wrapper를 사용할 때 파일 필드의 값을 어떻게 설정합니까?

코드 에서이 작업을 시도했습니다.

$file = new stdClass();
$file->uid = 1;
$file->uri = $file_path;
$file->filename = basename($file_path);
$file->filemime = file_get_mimetype($file_path);
$file->filesize = filesize($file_path);
$file->status = FILE_STATUS_PERMANENT;
$file->display = '1';
file_save($file); // I also tried: $file = file_save($file);

$node = array(
  'type' => 'news_item',
  'uid' => 1,
  'status' => 1,
  'comment' => 0,
  'promote' => 0,
  'language' => 'en',
);

$entity = entity_create('node', $node);

$ewrapper = entity_metadata_wrapper('node', $entity);

$ewrapper->field_document->set((array) $file); // I also tried: $ewrapper->field_document->set($file);

$ewrapper->save(true);
entity_save('node', $entity);

그러나이 예외가 발생합니다.

EntityMetadataWrapperException: Invalid data value given. Be sure it matches the required data type and format. in EntityMetadataWrapper->set() (line 122 of C:\wamp\www\drupal\sites\all\modules\entity\includes\entity.wrapper.inc).

어떤 도움이라도 대단히 감사합니다.

답변:


14

파일 배열을 다른 배열로 감싸는 것이 나를 위해 속임수처럼 보입니다.

$file = (array) $file;
$items = array($file);
$ewrapper->field_document->set($items);

그러나 나는 아직 알지 못했습니다 ...


그것은 실제로 트릭을 수행합니다. 도와 주셔서 감사합니다. 감사합니다!
Smos

5
나는 그것이 필드의 델타 인덱스와 관련이 있다고 생각합니다. 델타 인덱스를 필드에 할당하지 않으면 (예 : $ ewrapper-> field_name-> set ();) 다른 배열을 감싸 야합니다. 델타 인덱스를 필드에 할당하는 경우 (예 : $ ewrapper-> field_name [0]-> set ();) $ file = (array) $ file을 사용할 수 있습니다.
Smos

예 그 많은 이해, 후속 주셔서 감사합니다
클라이브

19

글쎄, 방금 이미지를 설정 하는 간단하고 덜 추악한 방법을 발견했습니다 .

$image_file = A FILE OBJECT; //Lot of choices here : new stdClass(), file_load, etc
$wrapper->FIELD_NAME->file->set($image_file);

분류법 또는 노드 / 엔티티 참조와 마찬가지로 파일 필드 이름은로드 된 객체를 가리 키므로 내가 찾는 방법입니다.


:: 포스터 편집 ::

여기에 OP 질문으로 어떻게 할 것입니까?

// Get the file
$file = file_save_data(file_get_contents('/my_local_path/img1.jpg'), 'public://remote_name.jpg');

// Wrap' it like one of your French girls
$wrapper = entity_metadata_wrapper('node', $node);

// And set the photo
$wrapper->field_photo->file->set($file);

// And save the node
$wrapper->save();

치명적인 오류 : null에서 멤버 함수 set () 호출 ... 텍스트 필드를 추가 할 수 있지만 파일을 추가해도 작동하지 않습니다.
PatrickS

@PatrickS 파일 객체를 만들었습니까? Clive의 방법조차도 효과가 없었습니까?
JudaPriest

Joomla 컨텐츠를 Drupal로 마이그레이션하려고합니다. 파일을 처음 마이그레이션하면 작동합니다. 모든 제품을 지우고 다른 마이그레이션을 시도하면 더 이상 작동하지 않습니다. 내가 그것을 작동시키는 유일한 방법은 새로 설치하는 것입니다. Joomla 데이터를 JSON 파일에 저장했습니다.이 파일을 사용하여 엔티티를 만듭니다. 의견을 남길 당시 아직 첫 번째 가져 오기 만 작동하고 엔티티를 만들기 위해 모든 종류의 메소드를 시도하고 있음을 알지 못했습니다. 이미지를 제외한 모든 필드를 만들 수 있었기 때문에 무슨 일이 있었는지 전혀 몰랐습니다!
PatrickS

1
new stdClass()코멘트 내가 직접 필드에 새로 생성 된 파일 객체를 할당 할 수 가정, 나에게 약간의 오해. 이것을 사용할 때, 파일에 fid가 할당되어 있는지 확인하십시오 (즉, 적어도 한 번 저장된 것). 그렇지 않으면 작동하지 않습니다.
Neograph734

다중 파일 필드에 어떻게 적용 하시겠습니까? 나는 그것이 같아야 $wrapper->field_photo[]->file->set($file)하지만 확실하지 않습니다. 이 상황에 직면 한 적이 있습니까?
Miquel Correa Casablanca

5

내 노드가 이미 존재하고 다음 매개 변수를 설정해야했습니다.

$wrapper->field_pdf->set(array('fid'=>$fid, 'display'=>1, 'description'=>'This is a PDF'));

다른 설정에는 내가 생각하는 다른 매개 변수가 필요할 수 있습니다. 오류 로그 (admin / reports / dblog)를 보면 필요한 매개 변수를 확인할 수 있습니다.


1
이것은 나를 위해 일했습니다. 나는 파일 필드에게 문제를 추가 할 수 없었다, 그러나로는 표시되지 것 display이었다 0어떤 이유로.
aross

0

누군가 이것이 도움이되는 경우를 대비하여 :

실제 파일 핸들이없고 fid사용할 수있는 경우 에만 다음을 사용할 수 있습니다.

$wrapper->field_file->set( array( 'fid'=>1234 ) );

그리고 (그 fid를 가진 파일이 존재한다고 가정) Drupal은에 올바른 파일을 첨부합니다 $wrapper->save().


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.