Ответы:
Я собираюсь предвосхитить этот ответ, сказав, что выполнение этого в массовом порядке представляет потенциальную угрозу безопасности, особенно если вы меняете формат на более мягкий набор фильтров. Текстовые форматы изменяют вывод поля во время отображения, а не во время сохранения. Так, например, любой ранее экранированный HTML или PHP, отправленный в поле, будет выполнять рендеринг / запуск в прямом направлении, если вы случайно или намеренно установили фильтр на код Full 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.
кэш Очистить после обновления.
Просто столкнулся с той же ситуацией, что и Мортен, с обновлением D6 => D7, которое, очевидно, не завершило форматы ввода.
Принял более грубый подход, чем ответы уже здесь, и написал модуль, который пробежал по схеме БД и обновил все столбцы, которые содержат строку 'format', заменив значения формата D6 (1, 2, 3) именами машин D7 ( filtered_html
, full_html
, plain_text
).
https://gist.github.com/xurizaemon/9824872
Закодировано для поддержки отображения
1 => filtered_html,
2 => full_html,
3 => plain_text,
Также может попытаться переписать поля с именем «format» (например, «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
Вы можете использовать следующий код, если у вас установлен 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'));
Предположительно, вы захотите узнать, какие поля нуждаются в обновлении, возможно, для некоторой регистрации или проверки данных. Для этого получите все имена таблиц и столбцов, которые содержат _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:
drush sqlq "truncate table cache_field;"
Если вы также удалите текстовый фильтр, вам нужно будет изменить текстовый формат по умолчанию для ТТ, в которых были поля, которые его использовали. Если вы этого не сделаете, ваши пользователи получат сообщения об отказе в доступе в полях, которые использовали old_format
. Я сделал этот запрос, чтобы найти виновных:
select * from field_config_instance where `data` LIKE '%old_format%';
Чтобы внести изменения, я обнаружил, что проще использовать интерфейс для перехода на каждую страницу настроек поля и нажать кнопку «Сохранить» (данные хранятся в виде длинного блоба, и их поиск и замена были затруднены из-за лучшего ввода данных в модуль форматов). Даже поля, для которых была установлена обработка текста, Plain text
содержали old_format! Для полей, для которых установлена Обработка текста Filtered text (user selects text format)
, вам дополнительно необходимо выбрать новое значение по умолчанию и нажать Сохранить.
Вы должны очистить кэш фильтра после удаления фильтра (опять же, не распространяется drush cc all
!):
cache_clear_all('*', 'cache_filter', TRUE);
Или с drush:
drush sqlq "truncate table cache_filter;"
field_cache_clear();
после того, как изменения вfield_data_...
иfield_revision_...
таблицах