Back-End

31 jan, 2013

EntityDrupalWrapper e o Drupal orientado a objetos

Publicidade

Um dos meus primeiros trabalhos com Drupal foi uma integração com webservices de um sistema acadêmico. Foi assim que usei um node_save() pela primeira vez. Em quatro anos de Drupal, usei esse método para criar muitos tipos de nodes programaticamente e desde de então nada mudou nesse processo:

$node = node_load($nid);
$node->field_ingredientes[LANGUAGE_NONE][0]['nid'] = $ingrediente;
$node->field_dificuldade[LANGUAGE_NONE][0]['value'] = 'fácil';
node_save($node);

Isso até agora. O módulo Entity API chegou para nos dar inúmeras melhorias no núcleo do sistema de entities do Drupal, como por exemplo, o CRUD. Também nos dá uma técnica muito interessante para edição de nodes, que são um tipo de entity. Ao invés de usarmos a versão acima, que é muito feia, totalmente procedural e sujeita a bugs, podemos usar a classe EntityDrupalWrapper.

Com isso temos os fields como atributos do objeto node:

$node = new EntityDrupalWrapper('node', $nid);
// Nos campos multivalorados temos um array
$node->field_ingredientes[0]->set($ingrediente);
// Nos campos com apenas um valor fica mais simples
$node->field_dificuldade->set('facil');
$node->save();

Essa classe transforma os objetos do core em objetos reais e não apenas um array mais bonitinho. Ou seja, agora podemos estender uma entity e colocar nossos próprios métodos, apenas estendendo o EntityDrupalWrapper:

class Receita extends EntityDrupalWrapper {
public function __construct($data = NULL, $info = array()) {
parent::__construct('node', $data, $info);
}
public function save() {
// algum código aqui
parent::save();
return;
}
}
$node = new Receita($nid);
$node->field_ingredientes[0]->set($ingrediente);
$node->field_dificuldade->set('dificil');
$node->save();
//Também podemos pegar os dados nesse formato
$dificuldade = $node->field_dificuldade->value();

Isso é muito legal, pois vemos o Drupal caminhando cada vez mais para a orientação a objetos, nos permitindo interagir com o core de um modo muito mais elegante. O EntityDrupalWrapper nos permite encapsular muito mais que apenas nodes e nos dá muitos helpers para ajudar no desenvolvimento.

Este artigo é apenas conceitual, para ilustrar as mudanças que estão vindo no Drupal 8. As boas praticas dizem para usarmos entity_metadata_wrapper para fazer essa instanciação em projetos.

Então, a apartir de agora esqueça o velho método de criar nodes programaticamente e entre nessa revolução também.

***

Artigo publicado originalmente no Drupal de Elite – http://drupaldeelite.com.br/blog/entitydrupalwrapper-e-o-drupal-orientado-objetos