Entity metadata wrappers
02.04.2016
При помощи Entity metadata wrappers можно легко получать, изменять, удалять значения у сущности и не только…
Вместо
$node->field_number[LANGUAGE_NONE][0]['value'];
лучше использовать
$node_wrapper->field_number->value();
// $node->title, $user->name, ...
$wrapper->label();
// $node->nid, $user->uid, ...
$wrapper->getIdentifier();
// $node->type, ...
$wrapper->getBundle();
Пример работы:
$nid = 1;
$node = node_load($nid);
$node_wrapper = entity_metadata_wrapper('node', $node);
// или
$node_wrapper = entity_metadata_wrapper('node', $nid);
// Entity API >= 7.x-1.6
$node_wrapper = $node->wrapper();
if ($node_wrapper->body->value()) {
$teaser = $node_wrapper->body->summary->value();
$body = $node_wrapper->body->value->value();
$body = $node_wrapper->body->raw();
}
$field_value = $node_wrapper->field_name->value();
$field_value = $node_wrapper->language('ru')->field_name->value();
$node_wrapper->field_value->set('Value 1');
// or
$node_wrapper->field_value = 'Value 1';
// поле с терминами
$node_wrapper= entity_metadata_wrapper('node', $node);
foreach ($node_wrapper->field_taxonomy_terms->getIterator() as $delta => $term_wrapper) {
$label = $term_wrapper->name->value();
}
// поле с ссылкой на сущность
$nids_to_set = array(42, 23);
$node_wrapper->field_entity_reference_field->set($nids_to_set);
// или
$node_wrapper->field_entity_reference_field[] = 42;
$node_wrapper->field_entity_reference_field[] = 23;
// удаляем значение поля
$node_wrapper->field_data->set(NULL);
// или
$node_wrapper->field_data[$delta]->set(NULL);
// Если поле с файлом
$file_obj = file_load($fid);
$node_wrapper->field_attachment_content->file->set( $file_obj );
// или
$node_wrapper->field_attachment_content->set( array('fid' => $fid) );
// сохраняем сущность
$node_wrapper->save();
Пример создания ноды:
// Create an Entity.
$node = entity_create('node', array('type' => 'image'));
// Specify the author.
$node->uid = $user->uid;
// Create a Entity Wrapper of that new Entity.
$emw_node = entity_metadata_wrapper('node', $node);
// Set a title and some text field value.
$emw_node->title = 'Test node';
$emw_node->field_text_field = 'Field value text';
// And save it.
$emw_node->save();
Field collections
// Populate the fields.
$ewrapper = entity_metadata_wrapper('node', $node);
$ewrapper->field_lead_contact_name->set($contact_name);
$ewrapper->field_lead_contact_phone->set($contact_phone);
$ewrapper->field_lead_contact_email->set($contact_email);
// Create the collection entity and set it's "host".
$collection = entity_create('field_collection_item', array('field_name' => 'field_facilities_requested'));
$collection->setHostEntity('node', $node);
// Now define the collection parameters.
$cwrapper = entity_metadata_wrapper('field_collection_item', $collection);
$cwrapper->field_facility->set(intval($offset));
$cwrapper->save();
// Save.
$ewrapper->save();
При работе с entity_metadata_wrapper() рекомендуется использовать try...catch
try {
$node_wrapper = entity_metadata_wrapper('node', $node);
$price = $node_wrapper->field_product->field_price->value();
}
catch (EntityMetadataWrapperException $exc) {
watchdog(
'MODULE_NAME',
'EntityMetadataWrapper exception in %function() @trace',
array('%function' => __FUNCTION__, '@trace' => $exc->getTraceAsString()),
WATCHDOG_ERROR
);
}
Для дебаггинга используйте getPropertyInfo()
// Wrapper for entity type 'node', but not specific bundle.
$wrapper = entity_metadata_wrapper('node');
// Info will contain information only about properties and not about fields.
$info = $wrapper->getPropertyInfo();
или
function _wrapper_debug($w) {
$values = array();
foreach ($w->getPropertyInfo() as $key => $val) {
$values[$key] = $w->$key->value();
}
return $values;
}
<?php dpm(_wrapper_debug($some_wrapped_object)); ?>
#Drupal
