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


18

У мене дуже багато вузлів, яким потрібно змінити формат введення - я міг би це зробити вручну, але тоді я не закінчу до Різдва 2014 року.

Де Drupal зберігає цю інформацію? Як я можу змінити формат вводу за частку секунди за допомогою SQL-запиту?

Відповіді:


20

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


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, яке, очевидно, не закінчило формати введення.

Прийняв більш жорстокий підхід, ніж відповіді, які вже були тут, і написав модуль, який пройшов через схему БД і оновив усі стовпці, що містять рядок "формат", замінивши значення формату 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", це ваша проблема).


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


Це спрацьовувало як шарм, але мені довелося очистити кеші, щоб побачити ефект. Дякую.
shasi kanth

0

Ви можете використовувати наступний код, якщо у вас встановлений 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'));

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

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.