Thay đổi định dạng đầu vào cho hơn 3000 nút


18

Tôi có rất nhiều nút cần thay đổi định dạng đầu vào của chúng - tôi có thể làm điều đó bằng tay, nhưng sau đó tôi sẽ không hoàn thành trước Giáng sinh 2014.

Drupal lưu trữ thông tin đó ở đâu? Làm cách nào để thay đổi định dạng đầu vào trong tích tắc, với truy vấn SQL?

Câu trả lời:


20

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_footê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_foofield_data_field_foo.

Giá trị cho cột là tên máy được xác định là cột formattrong filter_formatbả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_formatgiá 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.


1
Câu trả lời tốt. Bạn cũng nên làm field_cache_clear();sau khi thay đổi trong field_data_...field_revision_...bảng
milkovsky

4

Hãy thử theo cách này, bằng cách tạo một vòng lặp cho tất cả các nút thuộc loại nhất định:

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

1

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).


1

Đố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


Điều này làm việc như một bùa mê, nhưng tôi đã phải xóa bộ nhớ cache để thấy hiệu quả. Cảm ơn bạn.
shasi kanth

0

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

0

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 _formatcộ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 [...] uniontuyê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;"

Đồng thời xóa bộ lọc văn bản

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

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

đã lừa tôi Đừng quên xóa bộ nhớ cache

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.