Я собираюсь предвосхитить этот ответ, сказав, что выполнение этого в массовом порядке представляет потенциальную угрозу безопасности, особенно если вы меняете формат на более мягкий набор фильтров. Текстовые форматы изменяют вывод поля во время отображения, а не во время сохранения. Так, например, любой ранее экранированный 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';
Просто столкнулся с той же ситуацией, что и Мортен, с обновлением D6 => D7, которое, очевидно, не завершило форматы ввода.
Принял более грубый подход, чем ответы уже здесь, и написал модуль, который пробежал по схеме БД и обновил все столбцы, которые содержат строку 'format', заменив значения формата D6 (1, 2, 3) именами машин D7 ( filtered_html, full_html, 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
Предположительно, вы захотите узнать, какие поля нуждаются в обновлении, возможно, для некоторой регистрации или проверки данных. Для этого получите все имена таблиц и столбцов, которые содержат _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!):
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');
field_cache_clear();
после того, как изменения вfield_data_...
иfield_revision_...
таблицахПопробуйте так, сделав цикл для всех узлов определенного типа:
источник
Просто столкнулся с той же ситуацией, что и Мортен, с обновлением D6 => D7, которое, очевидно, не завершило форматы ввода.
Принял более грубый подход, чем ответы уже здесь, и написал модуль, который пробежал по схеме БД и обновил все столбцы, которые содержат строку 'format', заменив значения формата D6 (1, 2, 3) именами машин D7 (
filtered_html
,full_html
,plain_text
).https://gist.github.com/xurizaemon/9824872
Закодировано для поддержки отображения
Также может попытаться переписать поля с именем «format» (например, «date_format», но если у вас есть формат даты со значением «2», это ваша проблема).
источник
Для меня сработало следующее:
Конечно, вы должны изменить new_body_forma и node_type
источник
Вы можете использовать следующий код, если у вас установлен entity.module.
источник
Предположительно, вы захотите узнать, какие поля нуждаются в обновлении, возможно, для некоторой регистрации или проверки данных. Для этого получите все имена таблиц и столбцов, которые содержат
_format
столбец:Вооружившись этими данными, вы можете создавать отдельные запросы из этих значений. Сначала проверьте выход; Вам может потребоваться удалить некоторые записи, которые не относятся к содержанию / ревизиям. Я рекомендую использовать редактор с поддержкой регулярных выражений для построения запросов. Я превратил данные в большое
select [...] union
утверждение, а затем провел запросы на обновление к ним.Использование этого подхода сэкономило мне довольно много времени, когда мне нужно было обновить тысячи узлов / ревизий. Не забудьте очистить кэш поля (НЕ покрывается
drush cc all
!):Или с drush:
Также удаление текстового фильтра
Если вы также удалите текстовый фильтр, вам нужно будет изменить текстовый формат по умолчанию для ТТ, в которых были поля, которые его использовали. Если вы этого не сделаете, ваши пользователи получат сообщения об отказе в доступе в полях, которые использовали
old_format
. Я сделал этот запрос, чтобы найти виновных:Чтобы внести изменения, я обнаружил, что проще использовать интерфейс для перехода на каждую страницу настроек поля и нажать кнопку «Сохранить» (данные хранятся в виде длинного блоба, и их поиск и замена были затруднены из-за лучшего ввода данных в модуль форматов). Даже поля, для которых была установлена обработка текста,
Plain text
содержали old_format! Для полей, для которых установлена Обработка текстаFiltered text (user selects text format)
, вам дополнительно необходимо выбрать новое значение по умолчанию и нажать Сохранить.Вы должны очистить кэш фильтра после удаления фильтра (опять же, не распространяется
drush cc all
!):Или с drush:
источник
сделал трюк для меня. Не забудьте очистить кеш
источник