Созонов Алексей

Веб-разработчик

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