Відповіді:
Я буду передбачати цю відповідь, кажучи, що це масово представляє потенційний ризик для безпеки, особливо якщо ви змінюєте формат на більш м'який набір фільтрів. Текстові формати змінюють вихід поля під час відображення, а не під час збереження. Так, наприклад, будь-який раніше уникнутий 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.
кеш-очищення після оновлення.
Просто зіткнувся з тією ж ситуацією, що і тут Мортен, з оновленням D6 => D7, яке, очевидно, не закінчило формати введення.
Прийняв більш жорстокий підхід, ніж відповіді, які вже були тут, і написав модуль, який пройшов через схему БД і оновив усі стовпці, що містять рядок "формат", замінивши значення формату 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,
Також можна спробувати переписати поля з назвою "формат" (наприклад, "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
Ви можете використовувати наступний код, якщо у вас встановлений entit.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 sqlq "truncate table cache_field;"
Якщо ви також знімаєте текстовий фільтр, після цього вам потрібно буде змінити текстовий формат за замовчуванням для КТ, у яких були поля, які його використовували. Якщо цього не зробити, ваші користувачі отримуватимуть повідомлення, відхилені в дозволі, у полях, які використовували old_format
. Я зробив цей запит, щоб знайти винуватців:
select * from field_config_instance where `data` LIKE '%old_format%';
Щоб внести зміни, мені було простіше за допомогою інтерфейсу відвідати кожну сторінку налаштувань поля та натиснути Зберегти (дані зберігаються як longblob і були непростими для пошуку та заміни через кращі інжекції даних модуля форматів). Навіть поля, для яких було встановлено обробку тексту, Plain text
містили старий_формат! Для полів, для яких встановлено обробку тексту 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_...
таблицях