Câu trả lời:
Tôi sẽ mở đầu câu trả lời này bằng cách nói rằng việc thực hiện điều này có nguy cơ bảo mật tiềm ẩn, đặc biệt nếu bạn đang thay đổi định dạng thành một bộ lọc nhẹ nhàng hơn. Định dạng văn bản sửa đổi đầu ra trường trong khi hiển thị, không phải trong khi lưu. Vì vậy, ví dụ, mọi HTML hoặc PHP đã thoát trước đó được gửi tới một trường sẽ ngay lập tức kết xuất / chạy nếu bạn vô tình hoặc cố ý đặt bộ lọc thành mã HTML hoặc PHP đầy đủ.
Vì lý do này mà Drupal không tự động cập nhật tất cả các nút hiện có khi bạn thay đổi định dạng văn bản. Hành vi của các định dạng văn bản trong các kịch bản tương tự vẫn là một vấn đề mở .
Vì vậy, một lần nữa: hãy cẩn thận, có những con rồng.
Như đã nói, mỗi trường lưu trữ văn bản dưới dạng một cột có tên field_foo_format
, trong đó field_foo
tên máy của trường. Bạn sẽ cần cập nhật cột đó trên các bảng field_revision_field_foo
và field_data_field_foo
.
Giá trị cho cột là tên máy được xác định là cột format
trong filter_format
bảng. Vì vậy, cập nhật tất cả các trường sẽ là một vấn đề của truy vấn như:
UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';
cho từng lĩnh vực cần thay đổi.
Bạn có thể xác định new_format
giá trị tại đây: http://YOURSITE.com/admin/config/content/formats - cấu hình liên kết - số hoặc chuỗi trong URL là new_format.
Xóa bộ nhớ cache của bạn sau khi cập nhật.
Cũng gặp phải tình huống tương tự như Morten đã làm ở đây, với bản nâng cấp D6 => D7 dường như không hoàn thành các định dạng đầu vào.
Đã thực hiện một cách tiếp cận hơn so với các câu trả lời đã có ở đây và đã viết một mô-đun chạy qua lược đồ DB và cập nhật tất cả các cột có chứa chuỗi 'định dạng', thay thế các giá trị định dạng D6 (1, 2, 3) bằng tên máy D7 ( filtered_html
, full_html
, plain_text
).
https://gist.github.com/xurizaemon/9824872
Mã hóa cứng để hỗ trợ ánh xạ
1 => filtered_html,
2 => full_html,
3 => plain_text,
Cũng có thể cố gắng viết lại các trường có tên 'định dạng' (ví dụ: "date_format", nhưng nếu bạn có định dạng ngày có giá trị '2', đó là vấn đề của bạn).
Đối với tôi, sau đây làm việc:
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'
Tất nhiên, bạn phải thay đổi new_body_forma và node_type
Bạn có thể sử dụng mã sau đây, nếu bạn đã cài đặt 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'));
Có lẽ bạn sẽ muốn biết trường nào cần cập nhật, có thể thực hiện một số ghi nhật ký hoặc kiểm tra dữ liệu. Để làm điều này, hãy lấy tất cả các tên bảng và cột có chứa một _format
cột:
select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';
Được trang bị dữ liệu này, bạn có thể xây dựng các truy vấn riêng biệt từ các giá trị đó. Kiểm tra đầu ra trước; bạn có thể cần xóa một số mục không liên quan đến nội dung / sửa đổi. Tôi khuyên bạn nên sử dụng trình soạn thảo có khả năng regex để xây dựng các truy vấn. Tôi đã biến dữ liệu thành một select [...] union
tuyên bố lớn và sau đó chạy các truy vấn cập nhật chống lại nó.
Sử dụng phương pháp này đã tiết kiệm cho tôi khá nhiều thời gian khi tôi cần cập nhật hàng ngàn nút / phiên bản. Nhớ xóa bộ đệm trường (KHÔNG được bao phủ bởi drush cc all
!):
field_cache_clear();
Hoặc với drush:
drush sqlq "truncate table cache_field;"
Nếu bạn cũng đang gỡ bỏ bộ lọc văn bản, sau đó bạn sẽ cần thay đổi định dạng văn bản mặc định cho các CT có các trường sử dụng nó. Nếu bạn không làm điều này, người dùng của bạn sẽ nhận được các tin nhắn bị từ chối trong các trường được sử dụng old_format
. Tôi đã thực hiện truy vấn này để tìm ra thủ phạm:
select * from field_config_instance where `data` LIKE '%old_format%';
Để thực hiện các thay đổi, tôi thấy việc sử dụng giao diện dễ dàng hơn để truy cập từng trang cài đặt trường và nhấn Save (dữ liệu được lưu dưới dạng longblob và không dễ tìm kiếm và thay thế do tiêm dữ liệu mô-đun định dạng tốt hơn). Ngay cả các trường đã xử lý Văn bản được đặt để Plain text
chứa old_format! Đối với các trường có xử lý Văn bản được đặt thành Filtered text (user selects text format)
, bạn cũng cần phải chọn một giá trị mặc định mới và nhấn Lưu.
Bạn nên xóa bộ đệm bộ lọc sau khi xóa bộ lọc (một lần nữa, không được bao phủ bởi drush cc all
!):
cache_clear_all('*', 'cache_filter', TRUE);
Hoặc với drush:
drush sqlq "truncate table cache_filter;"
field_cache_clear();
sau khi thay đổi trongfield_data_...
vàfield_revision_...
bảng