Answers:
我将通过说这句话带来潜在的安全风险,特别是在您将格式更改为更宽松的过滤器集的情况下,以开头这个答案。文本格式会在显示期间而不是在保存期间修改字段输出。因此,例如,如果您意外或有意将过滤器设置为Full HTML或PHP代码,则提交给字段的任何先前转义的HTML或PHP都会直接渲染/运行。
因此,当您更改文本格式时,Drupal不会自动更新所有现有节点。在类似情况下文本格式的行为仍然是一个未解决的问题。
再说一遍:当心,有龙。
话虽如此,每个字段都将文本存储为名为的列field_foo_format
,其中field_foo
是字段的计算机名称。您需要更新表field_revision_field_foo
和上的该列field_data_field_foo
。
该列的值是定义为列中的机器名称format
在filter_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.
更新后的清除缓存。
通过对特定类型的所有节点进行循环来尝试这种方式:
$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);
只是遇到了与Morten一样的情况,只是D6 => D7升级显然没有完成输入格式。
采取了比此处已经给出的答案更粗略的方法,并编写了一个模块,该模块遍历数据库模式并更新了所有包含字符串'format'的列,并用D7机器名替换了D6格式值(1、2、3)(filtered_html
,full_html
,plain_text
)。
https://gist.github.com/xurizaemon/9824872
硬编码以支持
1 => filtered_html,
2 => full_html,
3 => plain_text,
也可能会尝试重写名为“格式”的字段(例如,“ date_format”,但是如果您的日期格式的值为“ 2”,那是您的问题)。
对我来说,以下工作:
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
大概您将想知道哪些字段需要更新,可能需要进行一些日志记录或检查数据。为此,获取包含_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;"
field_cache_clear();
的更改后,field_data_...
并field_revision_...
表