Atualize todos os nós com um campo padrão após adicionar um novo campo ao tipo de conteúdo

15

Eu tenho um tipo de conteúdo existente com vários nós. Acabei de adicionar um novo campo booleano com o valor padrão "off".

No entanto, até salvar novamente cada nó, o valor padrão não está definido, portanto, uma visualização que deve mostrar apenas os nós em que o novo campo está usando o valor padrão fica vazia no momento.

Como posso atualizar os nós existentes, criados antes da adição do campo, para definir esse campo com seu valor padrão?

DanH
fonte
Eu resolvi esse problema usando Visualizações Granel Operações e Normas conforme descrito neste fantástico vídeo: commerceguys.com/resources/articles/217
DANH
O módulo Salvar nós novamente pode ajudá-lo a forçar os nós de atualização.
Supriya Rajgopal

Respostas:

9

Infelizmente, não há uma maneira muito simples de fazer isso (além do VBO / rules), mas aqui está o código que eu uso nas funções de atualização nos arquivos de instalação do meu módulo personalizado quando preciso preencher previamente os valores do campo para um determinado tipo de nó após adicionar um novo campo ( neste caso, nós de 'página'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Outro método manual mencionado nesta resposta usa EntityFieldQuery e carrega / salva cada nó. Mais Drupal-y, mas com menos desempenho ... (requer uma carga completa do nó e operação de salvamento para cada nó!).

geerlingguy
fonte
Isso é muito triste
AlxVallejo
Você viu o módulo Padrões de campo? dgo.to/field_defaults
forest
É um bug para executar código como este sem também liberando todos os nós afetados a partir do cache de carga entidade: entity_get_controller('node')->resetCache($nids);- caso contrário uma posterior node_load()pode carregar dados obsoletos do cache, e qualquer node_save()desse objeto iria escrever isso de volta dados obsoletos no banco de dados.
phils
2

A melhor aposta é diretamente no MySQl. As tabelas ficariam assim:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Se você olhar para eles, é bem direto - você precisa de mim para começar com a aparência da consulta ou você está bem a partir daqui?

Mike
fonte
Obrigado Mike, não, não é um problema, eu posso lidar com o SQL realmente. Eu apenas sinto que deve haver uma opção de 'salvar novamente' ou algo fornecido como uma operação em massa, acho que posso olhar para a integração de VBO e Regras para isso de fato.
DANH
Entendido. Estou em uma posição semelhante, estou migrando cerca de 30.000 artigos de outro CMS para o Drupal. Não vi sentido em adicionar outro módulo quando o SQL estava rápido e sujo. Talvez você também possa escrever uma função rápida que chamaria node_load () para todos os seus nós, que também pode funcionar.
Mike
0

Apenas tente a lógica abaixo. é muito mais rápido e passa por todas as implementações de gancho também. mais detalhes . você pode escrever uma consulta db_select direta e simples para obter todos os nids e fazer um loop com esse código de amostra.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);
nadeesha meththananda
fonte
0

usando sql, considerando que os nós com o valor do campo não definido são

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document, sendo a tabela correspondente ao meu campo e contendo um valor nominal de entrada definido com o ID da entidade referente ao nó

eu fiz usando SQL insert ... selecione sintaxe

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
Matoeil
fonte
0

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.

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 pode 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.

DRUPWAY
fonte
0

Encontrei uma maneira fácil de atualizar campos no tipo de conteúdo com este módulo: Padrões de campo

Veja a captura de tela. Você pode atualizar o conteúdo existente com os valores padrão ou manter os valores existentes.

Eu testei no D7 e funciona.

insira a descrição da imagem aqui

Sébastien Gicquel
fonte