更改3000多个节点的输入格式


18

我有很多需要更改其输入格式的节点-我可以手工完成,但是在2014年圣诞节之前我不会做。

Drupal在哪里存储这些信息?如何通过SQL查询在一秒钟内更改输入格式?

Answers:


20

我将通过说这句话带来潜在的安全风险,特别是在您将格式更改为更宽松的过滤器集的情况下,以开头这个答案。文本格式会在显示期间而不是在保存期间修改字段输出。因此,例如,如果您意外或有意将过滤器设置为Full HTML或PHP代码,则提交给字段的任何先前转义的HTML或PHP都会直接渲染/运行。

因此,当您更改文本格式时,Drupal不会自动更新所有现有节点。在类似情况下文本格式的行为仍然是一个未解决的问题

再说一遍:当心,有龙。

话虽如此,每个字段都将文本存储为名为的列field_foo_format,其中field_foo是字段的计算机名称。您需要更新表field_revision_field_foo和上的该列field_data_field_foo

该列的值是定义为列中的机器名称formatfilter_format表中。因此,更新所有字段将是一个查询问题,例如:

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

对于每个需要更改的字段。

您可以new_format在此处确定值:http : //YOURSITE.com/admin/config/content/formats-配置链接-URL中的数字或字符串是new_format.更新后的清除缓存。


1
好答案。你也应该做field_cache_clear();的更改后,field_data_...field_revision_...
milkovsky

4

通过对特定类型的所有节点进行循环来尝试这种方式:

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

1

只是遇到了与Morten一样的情况,只是D6 => D7升级显然没有完成输入格式。

采取了比此处已经给出的答案更粗略的方法,并编写了一个模块,该模块遍历数据库模式并更新了所有包含字符串'format'的列,并用D7机器名替换了D6格式值(1、2、3)(filtered_htmlfull_htmlplain_text)。

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

硬编码以支持

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

也可能会尝试重写名为“格式”的字段(例如,“ date_format”,但是如果您的日期格式的值为“ 2”,那是您的问题)。


1

对我来说,以下工作:

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'

当然,您必须更改new_body_forma和node_type


这就像一个魅力,但我必须清除缓存才能看到效果。谢谢。
shasi kanth

0

如果安装了entity.module,则可以使用以下代码。

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

0

大概您将想知道哪些字段需要更新,可能需要进行一些日志记录或检查数据。为此,获取包含_format列的所有表和列名称:

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

有了这些数据,您就可以根据这些值构建单独的查询。首先检查输出;您可能需要删除一些与内容/修订不相关的条目。我建议使用具有正则表达式的编辑器来构建查询。我将数据变成一个大select [...] union语句,然后针对它运行更新查询。

当我需要更新数千个节点/修订时,使用这种方法为我节省了很多时间。记住要清除字段缓存(不包括drush cc all!):

field_cache_clear();

或匆忙:

drush sqlq "truncate table cache_field;"

同时删除文字过滤器

如果您也要停用文本过滤器,那么之后,您将需要为具有使用该过滤器字段的CT更改默认文本格式。如果您不这样做,您的用户将在使用的字段中收到拒绝权限的消息old_format。我执行此查询来查找罪魁祸首:

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

为了进行更改,我发现使用界面更容易访问每个字段设置页面,然后按保存(数据存储为longblob,由于格式模块数据注入更好,因此难以搜索和替换)。甚至将文本处理设置为的字段也Plain text包含old_format!对于将文本处理设置为的字段Filtered text (user selects text format),您还需要选择一个新的默认值,然后按保存。

您应该在删除过滤器后再次清除过滤器缓存(同样,不包括drush cc all!):

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

或匆忙:

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');

为我做了把戏。不要忘记清除缓存

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.