it-swarm-eu.dev

Změňte vstupní formát pro 3000+ uzlů

Mám spoustu uzlů, které potřebují změnit svůj vstupní formát - mohl bych to udělat ručně, ale pak nebudu hotov před Vánoci 2014.

Kde je Drupal tyto informace ukládá? Jak mohu změnit vstupní formát za zlomek sekundy pomocí dotazu SQL?

18
mortendk

Tuto odpověď předpovím slovy, že to en-masse představuje potenciální bezpečnostní riziko, zejména pokud měníte formát na mírnější sadu filtrů. Textové formáty upravují výstup pole během zobrazení, nikoli během ukládání. Takže například jakýkoli dříve uniklý HTML nebo PHP odeslaný do pole se přímo vykreslí/spustí, pokud omylem nebo záměrně nastavíte filtr na plný kód HTML nebo PHP.

Z tohoto důvodu funkce Drupal neaktualizuje automaticky všechny existující uzly, když změníte textový formát. Chování textových formátů v podobných scénářích je stále otevřené vydání .

Takže znovu: pozor, tam jsou draci.

S tím bylo každé pole uloženo jako sloupec s názvem field_foo_format, Kde field_foo Je název stroje pole. Tento sloupec budete muset aktualizovat v tabulkách field_revision_field_foo A field_data_field_foo.

Hodnota sloupce je název počítače definovaný jako sloupec format v tabulce filter_format. Aktualizace všech polí by tedy byla otázkou dotazu:

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

pro každé pole, které potřebuje změnu.

Zde můžete určit hodnotu new_format: http://YOURSITE.com/admin/config/content/formats - nakonfigurovat odkaz - číslo nebo řetězec v URL je vaše new_format. Vymažte mezipaměť po aktualizaci.

20
user7

Vyzkoušejte tento postup vytvořením smyčky pro všechny uzly určitého typu:

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

Pro mě to fungovalo:

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'

Samozřejmě musíte změnit new_body_forma a node_type

1
Ámon Tamás

Právě narazil do stejné situace jako Morten tady, s D6 => D7 upgrade, který zřejmě nedokončil vstupní formáty.

Udělali si hrubší přístup než odpovědi, které již zde byly, a napsali modul, který prošel schématem DB a aktualizoval všechny sloupce, které obsahují řetězec 'format', nahrazující hodnoty formátu D6 (1, 2, 3) názvy strojů D7 ( filtered_html, full_html, plain_text).

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

Hardcoded pro podporu mapování

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

Také se můžete pokusit přepsat pole, která jsou pojmenována 'format' (např. "Date_format", ale pokud máte formát data s hodnotou '2', je to váš problém).

1
Chris Burgess
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');

udělal pro mě trik. Nezapomeňte vyčistit mezipaměti

0
duck

Pravděpodobně budete chtít vědět, která pole je třeba aktualizovat, případně provést nějaké protokolování nebo kontroly dat. Chcete-li to provést, získejte všechny názvy tabulek a sloupců, které obsahují sloupec _format:

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

Vyzbrojeni těmito údaji můžete z těchto hodnot vytvářet samostatné dotazy. Nejprve zkontrolujte výstup; možná budete muset odstranit některé položky, které se netýkají obsahu/revizí. K vytváření dotazů doporučuji použít editor schopný regex. Změnil jsem data na velký příkaz select [...] union A pak jsem proti němu spustil aktualizační dotazy.

Tímto přístupem mě zachránil dost času, když jsem potřeboval aktualizovat tisíce uzlů/revizí. Nezapomeňte vymazat mezipaměť pole (NENÍ pokryta drush cc all!):

field_cache_clear();

Nebo pomocí štětce:

drush sqlq "truncate table cache_field;"

Také odebírání textového filtru

Pokud odejdete také do textového filtru, budete muset změnit výchozí formát textu pro CT, která obsahovala pole, která jej použila. Pokud tak neučiníte, vaši uživatelé dostanou zprávy o odepření oprávnění v polích, které používaly old_format. Udělal jsem tento dotaz, abych našel viníky:

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

Pro provedení změn jsem zjistil, že je jednodušší použít rozhraní k návštěvě každé stránky nastavení pole a stisknout tlačítko Uložit (data jsou uložena jako longblob a nebyla schopna prohledávat a nahrazovat kvůli lepším formátům vložení dat modulu). I pole, ve kterých bylo zpracování textu nastaveno na Plain text, Obsahovala old_format! Pro pole, která mají Zpracování textu nastavenou na Filtered text (user selects text format), budete muset navíc vybrat novou výchozí hodnotu a stisknout Uložit.

Po odstranění filtru byste měli vyčistit mezipaměť filtru (opět nespadající pod drush cc all!):

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

Nebo pomocí štětce:

drush sqlq "truncate table cache_filter;"
0
noobish

Pokud máte nainstalovanou entitu.module, můžete použít následující kód.

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