Изменить формат ввода для 3000+ узлов


18

У меня есть много узлов, которым нужно изменить их формат ввода - я мог бы сделать это вручную, но тогда я не буду делать это до Рождества 2014 года.

Где Drupal хранит эту информацию? Как я могу изменить формат ввода за доли секунды с помощью SQL-запроса?

Ответы:


20

Я собираюсь предвосхитить этот ответ, сказав, что выполнение этого в массовом порядке представляет потенциальную угрозу безопасности, особенно если вы меняете формат на более мягкий набор фильтров. Текстовые форматы изменяют вывод поля во время отображения, а не во время сохранения. Так, например, любой ранее экранированный 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.кэш Очистить после обновления.


1
Хороший ответ. Вы также должны делать field_cache_clear();после того, как изменения в field_data_...и field_revision_...таблицах
Мильковский

4

Попробуйте так, сделав цикл для всех узлов определенного типа:

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

1

Просто столкнулся с той же ситуацией, что и Мортен, с обновлением 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», это ваша проблема).


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


Это сработало как шарм, но мне пришлось очистить кеш, чтобы увидеть эффект. Спасибо.
Шаси Кант

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:

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;"

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

сделал трюк для меня. Не забудьте очистить кеш

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.