Published:
Coleção de tasks para executar no Drupal de forma iterativa Permalink
Programar no Drupal pela linha de comando de uma forma iterativa nos facilita a vida quando precisamos executar tarefas que são pontuais e que não vale a pena preparar um módulo para tal.
Formas de acesso ao Drupal cli
Você pode acessar o Drupal e programar em php iterativo usando drush ou drupal console:
drush php
# ou
drupal shell
Caso use o aegir:
drush @seusite.com.br php
Dump de um node
Carregando um node com nid 3 e dando um dump:
$node = \Drupal::entityTypeManager()->getStorage('node')->load(3);
dump($node)
Corrigindo o formato do campo boby
Carregando todos nodes do tipo ficha e alterando o campo body->format para full_html:
$nids = \Drupal::entityQuery('node')->condition('type','ficha')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
$node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
$node->body->format = 'full_html';
$node->save();
}
Corrigindo o formato do campo field_resumo para múltiplos tipos de conteúdos
Carregando todos nodes do tipo ficha e alterando o campo body->format para full_html:
$tipos = ['catalogos','livros',,'producoes_visuais','trabalhos_de_conclusao'];
$nids = \Drupal::entityQuery('node')->condition('type',$tipos, 'IN')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
$node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
$node->field_resumo->format = 'full_html';
$node->save();
}
Se o campo for multivalorado talvez tenha que fazer algo do tipo:
$node->field_resumo[0]->format
ou um loop no campo
Substituindo string em um campo de todos nodes do mesmo tipo
Dado um tipo de conteúdo chamado verbete
no qual há um campo field_verbete
, vamos substituir tudo de antigo.fflch.usp.br
para novo.fflch.usp.br
:
$nids = \Drupal::entityQuery('node')->condition('type','verbete')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
$node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
$node->field_verbete->value =
str_replace('antigo.fflch.usp.br','novo.fflch.usp.br',$node->field_verbete->value);
$node->save();
}
Trocando o campo alias
Dado que você tem o objeto $node
pode trocar a url alternativa dessa forma:
$node->path->alias = '/novo-caminho-do-node'
$node->path->pathauto = Drupal\pathauto\PathautoState::SKIP;
$node->save();
Marcando pais dos termos de taxonomia
Esse script carrega todos nodes de um tipo de conteúdo chamado fotos_bd
que contém um campo que faz referência a termos de taxonomia: field_descritores
. Ocorre que esses termos apresentam uma hierarquia entre si, mas somente os termos filhos estão marcados nos nodes. Esse script procura os termos de que pai e os marca também.
$nids = \Drupal::entityQuery('node')->condition('type','fotos_bd')->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
foreach ($nodes as $node) {
$node = \Drupal::entityTypeManager()->getStorage('node')->load($node->nid->value);
$descritores = $node->get('field_descritores');
# 1. Guardar todos tids, de pais e filhos
$tids = [];
foreach ($descritores->referencedEntities() as $descritor) {
array_push($tids, $descritor->id());
if($descritor->parent->target_id != 0) {
array_push($tids, $descritor->parent->target_id);
}
}
$tids = array_unique($tids);
# 2. monta um array $update com somente os tids que deve ficar
$update = [];
foreach($tids as $tid) {
$update[] = ['target_id' => $tid];
}
$node->field_descritores = $update;
$node->save();
}
Manipulating nodes usign Api:
Nodes are fundamental entities that represent individual pieces of content such as articles, pages, blog posts, and more. The Drupal API provides a powerful set of functions and methods to manipulate nodes programmatically.
Attach a file to the node:
<?php
use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;
$data = file_get_contents('/home/thiago/sabrina.pdf');
$file = file_save_data($data, 'public://sabrina.pdf', FILE_EXISTS_REPLACE);
$node = Node::create([
'type' => 'livros',
'title' => 'Teste com Sabrina',
'field_tombo' => 123,
'field_arquivo' => [
'target_id' => $file->id(),
'alt' => 'Pdf com o nome da sabrina',
'title' => 'Sabrina pdf'
],
]);
$node->save();
Attach multiple files to the node:
<?php
use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;
$data1 = file_get_contents('/home/thiago/sabrina1.pdf');
$data2 = file_get_contents('/home/thiago/sabrina2.pdf');
$file1 = file_save_data($data1, 'public://sabrina1.pdf', FILE_EXISTS_REPLACE);
$file2 = file_save_data($data2, 'public://sabrina2.pdf', FILE_EXISTS_REPLACE);
$node = Node::create([
'type' => 'livros',
'title' => 'Teste com Sabrina 2 arquivos',
'field_tombo' => 123,
'field_arquivo' => [
[
'target_id' => $file1->id(),
'alt' => 'Pdf 1 com o nome da sabrina',
'title' => 'Sabrina 1 pdf'
],
[
'target_id' => $file2->id(),
'alt' => 'Pdf 2 com o nome da sabrina',
'title' => 'Sabrina 2 pdf'
],
],
]);
$node->save();