Atualização de campo em massa?


35

Adicionei um novo campo (texto) a um tipo de conteúdo do Drupal 7 que já possui muitos nós.

Como posso preencher o campo com um valor padrão para todos esses nós?

Respostas:


37

Você pode usar EntityFieldQuerypara recuperar uma lista de nós e atualizar os campos do nó com node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Se for uma operação pontual, você pode usar a função Executar PHP do módulo Devel para executar o acima: caso contrário, você pode criar um módulo personalizado simples.


2
Além de usar o devel ou o vbo, você também pode usar "drush scr myscript.php" para executar o código acima em um ambiente totalmente inicializado.
fietserwin

Como esse código é alterado para acomodar a execução da mesma operação em um campo de referência de termo?
Screenack

17

Eu usaria o Views Bulk Operations e o "Executar script arbitrário do PHP" para executar essencialmente os itens acima, mas você não precisa fazer todo o código extra, apenas o pequeno trecho que faz o que você deseja (como $object->field_foo['und'][0]['value'] = 'some_value')


9

Se você deseja apenas atualizar o campo com algum valor, a alternativa mais eficiente à resposta aceita é a seguinte:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

A diferença está em usar diretamente field_attach_presavee field_attach_updatefunções, que atualizam corretamente apenas o campo do nó e ignoram o restante do processo de salvamento do nó. Isso causa um impacto que nenhum gancho de pré-salvamento / salvamento de nó será chamado, a data "alterada" não será atualizada para a data atual etc. De acordo com o seu caso de uso, pode ser melhor usar o processo node_save () inteiro.


4

Na verdade, o VBO (Views Bulk Operations) é uma boa solução. Além disso, com as versões mais recentes, você encontrará a opção "Modificar valores da entidade", que fornece uma maneira muito fácil de atualizar o idioma dos nós em uma operação.


2

Instale e ative o módulo Views Bulk Operations e crie uma exibição com uma exibição de página.

Adicionar => Operações em massa: campo Conteúdo (Conteúdo) em exibição.

Referir

insira a descrição da imagem aqui

Selecione os campos que você deseja definir o valor padrão.

No seu caso, seu título. Na imagem são tags.

Salve a visualização e vá para a página que ela criou. Se você tiver mais de uma página de resultados, poderá selecionar todos os itens na página atual, todos os itens em todas as páginas ou marcar manualmente as caixas correspondentes a nós individuais. Pelo menos uma caixa de seleção deve estar marcada para continuar.

Agora você define o valor padrão e o salva.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.