3000+ नोड्स के लिए इनपुट प्रारूप बदलें


18

मेरे पास बहुत सारे नोड हैं जिनके इनपुट प्रारूप को बदलने की आवश्यकता है - मैं ऐसा हाथ से कर सकता हूं, लेकिन फिर मैं क्रिसमस 2014 से पहले नहीं करूंगा।

द्रुपाल उस जानकारी को कहाँ संग्रहीत कर रहा है? एसक्यूएल क्वेरी के साथ मैं विभाजित प्रारूप में इनपुट प्रारूप को कैसे बदल सकता हूं?

जवाबों:


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

बस उसी स्थिति में भाग गया, जैसा कि मोर्टन ने डी 6 => डी 7 अपग्रेड के साथ किया था, जो स्पष्ट रूप से इनपुट प्रारूपों को पूरा नहीं करता था।

यहां पहले से मौजूद उत्तरों की तुलना में एक गंभीर दृष्टिकोण लिया, और एक मॉड्यूल लिखा, जो डीबी स्कीमा के माध्यम से चला और उन सभी स्तंभों को अपडेट किया, जिनमें डी 6 मशीन के नाम के साथ डी 6 प्रारूप मान (1, 2, 3) की जगह स्ट्रिंग प्रारूप है ( 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 को बदलना होगा


यह एक आकर्षण की तरह काम करता था, लेकिन मुझे प्रभाव देखने के लिए कैश को साफ करना पड़ा। धन्यवाद।
शशी कांत


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

टेक्स्ट फ़िल्टर भी हटा रहा है

यदि आप एक टेक्स्ट फ़िल्टर को भी रिटायर कर रहे हैं, तो बाद में आपको CTs के लिए डिफ़ॉल्ट टेक्स्ट फॉर्मेट को बदलना होगा जिसमें इसे इस्तेमाल किया गया था। यदि आप ऐसा नहीं करते हैं, तो आपके उपयोगकर्ताओं को उन फ़ील्ड्स के भीतर अनुमति अस्वीकृत संदेशों की अनुमति मिल जाएगी जो उपयोग करते थे old_format। दोषियों को खोजने के लिए मैंने यह क्वेरी की:

select * from field_config_instance where `data` LIKE '%old_format%';

परिवर्तन करने के लिए, मुझे प्रत्येक फ़ील्ड सेटिंग्स पृष्ठ पर जाने और सहेजें को दबाने के लिए इंटरफ़ेस का उपयोग करना आसान लगा (डेटा को लॉन्गब्लो के रूप में संग्रहीत किया गया है और बेहतर प्रारूप मॉड्यूल डेटा इंजेक्शन के कारण खोज और प्रतिस्थापित करने के लिए अनिच्छुक था)। यहां तक ​​कि फ़ील्ड्स जिसमें टेक्स्ट प्रोसेसिंग का सेट 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.