Usando EntityWrapper para criar um Addressfield em um Field Collection

Field Collection, que por sua vez, contém um campo do tipo Addressfield e no final das contas, precisamos criar um node programaticamente." data-share-imageurl="">

Ei pessoal! Hoje vou abordar um assunto um pouco mais avançado, direcionado para programadores com uma certa experiência, mas certamente muito útil para uma série de desenvolvedores. Sem mais delongas, vamos lá!

Suponhamos que temos um tipo de conteúdo, que contém um campo do tipo Field Collection, que por sua vez, contém um campo do tipo Addressfield e no final das contas, precisamos criar um node programaticamente. Complicou demais? hehehe... Então vamos ver como podemos fazer isso de uma forma simples (?) sem ter que gastar horas e horas navegando em exceções do PHP. :)

Antes de continuar, é bom que aprenda sobre como criar nodes programaticamente com os benefícios proporcionados pelo EntityWrapper, assunto já abordado aqui no Drupal de Elite antes. Com EntityWrapper, a gente reduz drasticamente o trabalho com entities no Drupal. Por exemplo, a gente não precisa mais escrever "[LANGUAGE_NONE][0]", exceto nos casos que o site for multi idioma.

Beleza! Vamos começar com um exemplo mais fácil. Um Addressfield em um node sem um Field Collection:

// Create an Entity with wrapper
$node = entity_create('node', array('type' => 'person'));
$entity = entity_metadata_wrapper('node',  $node);
 
// Add a node title
$entity->title = $person['name'];
 
// Add the address information
$entity->field_person_address->thoroughfare = $person['address'];
$entity->field_person_address->locality = $person['city'];
$entity->field_person_address->administrative_area = $person['state'];
$entity->field_person_address->postal_code = $person['postalcode'];
$entity->field_person_address->country = $person['country'];
 
// Save the entity
$entity->save();

Nota: O código acima, relacionado ao Addressfield, retorna um warning, mas funciona. Veja sobre o assunto no link a seguir: http://drupal.org/node/1764052

Tudo bem! Agora vamos ver um exemplo mais complexo, um node que contém um Field Collection que contém um Addressfield:

// Create an Entity with wrapper
$node = entity_create('node', array('type' => 'person'));
$entity = entity_metadata_wrapper('node',  $node);
 
// Add a node title
$entity->title = $person['name'];
 
// Create a person address Field Collection Entity
$address_raw = entity_create('field_collection_item', array('field_name' => 'field_person_address'));
// Attach to the node. Note: $node, not $entity.
$address_raw->setHostEntity('node', $node);
 
// Wrap new collection in Entity API
$address = entity_metadata_wrapper('field_collection_item', $address_raw);
 
// Add the address information to the 
$address->field_person_addressfield->thoroughfare = $person['address'];
$address->field_person_addressfield->locality = $person['city'];
$address->field_person_addressfield->administrative_area = $person['state'];
$address->field_person_addressfield->postal_code = $person['postalcode'];
$address->field_person_addressfield->country = $person['country'];
 
// Save the field collection
$address->save();
 
// Save the entity
$entity->save();

Talvez você possa estar se perguntando: "Porque não simplificar mais e usar um campo de múltiplos valores?". Neste caso, o exemplo é simplificado, mas no final das contas, serve para quando é preciso armazenar dados adicionais em cada endereço. Bacana, né? :)

É isso galera! Qualquer coisa deixem um comentário. Este post é uma livre tradução adaptada do post de Brad Erickson.

{pt: Nós vamos encorajá-lo a desenvolver as três grande virtudes de um programador: preguiça, impaciência e hybris.}

1. Para instalar o git flow no Ubuntu:

{en: For installing git flow on Ubuntu:}

apt-get install git-flow

Dica da Preguiça: Veja instruções para outros sistemas operacionais