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が割り当てられていることを確認してください(つまり、少なくとも1回保存されている)。そうでない場合は機能しません。
Neograph734

これを複数のファイルフィールドにどのように適用しますか?私はそれが次のようなものであるべきだと思う$wrapper->field_photo[]->file->set($file)が、私にはわからない。このような状況に直面したことがありますか?
ミケルコレアカサブランカ

5

私のノードはすでに存在しており、次のパラメーターを設定する必要がありました。

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

さまざまなセットアップには、さまざまなパラメーターが必要になる場合があります。エラーログ(admin / reports / dblog)を見ると、必要なパラメーターを確認できます。


1
これは私のために働いた。ファイルフィールドを問題なく追加できましたdisplay0、何らかの理由で表示されませんでした。
アロス14年

0

誰かがこれが役立つと思う場合に備えて:

実際のファイルハンドルがなく、fid使用できるものだけがわかっている場合:

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

そして(そのfidを持つファイルが存在すると仮定すると)Drupalは正しいファイルをに添付します$wrapper->save()


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.