it-swarm-vi.com

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

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 tôi có thể thay đổi định dạng đầu vào trong tích tắc, bằng truy vấn SQL?

17
mortendk

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. Các đị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 đã thoát trước đó hoặc PHP đượ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 Full HTML hoặc mã PHP.

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 tình huống 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ó rồng.

Như đã nói, mỗi trường lưu trữ văn bản dưới dạng cột có tên field_foo_format, Trong đó field_foo Là 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_foofield_data_field_foo.

Giá trị cho cột là tên máy được xác định là cột format trong bảng filter_format. 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 giá trị new_format Tại đây: http://YOURSITE.com/admin/config/content/formats - định cấu hình liên kết - số hoặc chuỗi trong URL là new_format. Xóa bộ nhớ cache sau khi cập nhật.

20
user7

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);
4
Ek Kosmos

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

1
Ámon Tamás

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ể thử 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
Chris Burgess
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

0
duck

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. Để thực hiện việc này, hãy lấy tất cả các tên bảng và cột có chứa cột _format:

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 câu lệnh select [...] union Lớn và sau đó chạy các truy vấn cập nhật đối vớ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 cấp phép trong các trường đã 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 có xử lý Văn bản được đặt thành Plain text Cũng 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 Save.

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
noobish

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
Lee SeungYoun Carrie