Alterar o formato de entrada para mais de 3000 nós


18

Eu tenho muitos nós que precisam alterar o formato de entrada - eu poderia fazer isso manualmente, mas não o farei antes do Natal de 2014.

Onde o Drupal está armazenando essas informações? Como posso alterar o formato de entrada em uma fração de segundo, com uma consulta SQL?

Respostas:


20

Vou prefaciar esta resposta dizendo que fazer isso em massa representa um risco potencial à segurança, especialmente se você estiver alterando o formato para um conjunto de filtros mais tolerante. Os formatos de texto modificam a saída do campo durante a exibição, não durante o salvamento. Por exemplo, qualquer HTML ou PHP previamente escapado enviado a um campo será renderizado / executado diretamente se você definir acidentalmente ou intencionalmente o filtro como HTML completo ou código PHP.

É por esse motivo que o Drupal não atualiza automaticamente todos os nós existentes quando você altera um formato de texto. O comportamento dos formatos de texto em cenários semelhantes ainda é um problema em aberto .

Então, novamente: cuidado, existem dragões.

Com isso dito, cada campo armazena o texto como uma coluna denominada field_foo_format, onde field_fooé o nome da máquina do campo. Você precisará atualizar essa coluna nas tabelas field_revision_field_fooe field_data_field_foo.

O valor para a coluna é um nome de máquina definido como a coluna formatna filter_formattabela. Portanto, atualizar todos os campos seria uma questão como:

UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';

para cada campo que precisa ser alterado.

Você pode determinar o new_formatvalor aqui: http://YOURSITE.com/admin/config/content/formats - configure link - número ou string no URL é o seu new_format.Limpar cache após a atualização.


11
Boa resposta. Você também deve fazer field_cache_clear();depois de mudanças na field_data_...e field_revision_...mesas
milkovsky

4

Tente dessa maneira, criando um loop para todos os nós de um determinado tipo:

$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);

1

Acabei de encontrar a mesma situação que Morten fez aqui, com uma atualização D6 => D7 que aparentemente não terminou os formatos de entrada.

Adotou uma abordagem mais grosseira do que as respostas já aqui e escreveu um módulo que percorreu o esquema do banco de dados e atualizou todas as colunas que contêm a string 'format', substituindo os valores de formato D6 (1, 2, 3) pelos nomes de máquinas D7 ( filtered_html, full_html, plain_text).

https://gist.github.com/xurizaemon/9824872

Codificado para suportar o mapeamento de

1 => filtered_html, 
2 => full_html,
3 => plain_text,

Também pode tentar reescrever os campos denominados 'formato' (por exemplo, "formato_de_data", mas se você tiver um formato de data com o valor '2', esse é o seu problema).


1

Para mim, o seguinte funcionou:

update `field_revision_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'
update `field_data_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'

Claro que você deve alterar o new_body_forma e o node_type


Isso funcionou como um encanto, mas eu tive que limpar os caches para ver o efeito. Obrigado.
Shasi kanth

0

Você pode usar o seguinte código, se você tiver o entity.module instalado.

// I'm using node_save($node); 
$wrapper = entity_metadata_wrapper('node', $node->nid); 
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));

0

Presumivelmente, você desejará saber quais campos precisam ser atualizados, possivelmente para fazer algum log ou verificação dos dados. Para fazer isso, obtenha todos os nomes de tabelas e colunas que contêm uma _formatcoluna:

select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';

Armado com esses dados, você pode criar consultas separadas desses valores. Verifique a saída primeiro; pode ser necessário remover algumas entradas que não pertencem a conteúdo / revisões. Eu recomendo usar um editor capaz de regex para criar as consultas. Transformei os dados em uma select [...] uniondeclaração grande e depois executei consultas de atualização.

O uso dessa abordagem me salvou bastante tempo quando eu precisava atualizar milhares de nós / revisões. Lembre-se de limpar o cache do campo (NÃO coberto por drush cc all!):

field_cache_clear();

Ou com drush:

drush sqlq "truncate table cache_field;"

Removendo também filtro de texto

Se você também estiver retirando um filtro de texto, depois precisará alterar o formato de texto padrão para os CTs que tinham campos que o usavam. Se você não fizer isso, seus usuários receberão mensagens de permissão negada nos campos que usaram o old_format. Eu fiz essa consulta para encontrar os culpados:

select * from field_config_instance where `data` LIKE '%old_format%';

Para fazer as alterações, achei mais fácil usar a interface para visitar cada página de configurações de campo e pressionar Salvar (os dados são armazenados como um botão longo e era difícil de pesquisar e substituir devido aos melhores formatos de injeção de dados do módulo). Até os campos que tinham o processamento de texto definido como Plain textcontinha o formato_ antigo! Para os campos em que o processamento de texto está definido Filtered text (user selects text format), você também precisará selecionar um novo valor padrão e pressionar Salvar.

Você deve limpar o cache do filtro após remover um filtro (novamente, não coberto por drush cc all!):

cache_clear_all('*', 'cache_filter', TRUE);

Ou com drush:

drush sqlq "truncate table cache_filter;"

0
update field_revision_body set body_format = 'full_html' WHERE bundle IN ('book','page');
update field_data_body set body_format = 'full_html' WHERE bundle IN ('book','page');

fez o truque para mim. Não se esqueça de limpar caches

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.