如何使用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).

任何帮助都非常感谢。

Answers:


14

将文件数组包装到另一个数组中似乎对我有用:

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

但是我还没有找到原因 ...


确实做到了。非常感谢您的帮助,不胜感激!
Smos 2013年

5
我认为这与字段的增量索引有关。如果您没有为字段分配增量索引(即$ ewrapper-> field_name-> set();),则必须在其周围包装另一个数组。如果确实为字段分配了增量索引(即$ ewrapper-> field_name [0]-> set();),则可以只使用$ file =(数组)$ file。
Smos

是的,这很有意义,感谢您的跟进
克莱夫(Clive)

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
这对我有用。我可以添加文件场没有问题,但它不会显示为display0出于某种原因。
2014年

0

万一有人发现这有帮助:

如果您没有实际的文件句柄并且只知道它fid,则可以使用:

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

并且(假设存在具有该fid的文件)Drupal将在上附加正确的文件$wrapper->save()


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.