it-swarm.asia

قم بتغيير تنسيق الإدخال لأكثر من 3000 عقد

لدي الكثير من العقد التي تحتاج إلى تغيير تنسيق الإدخال الخاص بهم - يمكنني القيام بذلك يدويًا ، ولكن بعد ذلك لن أكون قد انتهيت قبل عيد الميلاد 2014.

أين Drupal تخزين تلك المعلومات؟ كيف يمكنني تغيير تنسيق الإدخال في جزء من الثانية باستخدام استعلام SQL؟

17
mortendk

سأقدم هذه الإجابة بالقول إن القيام بهذا العدد الكبير يمثل خطرًا أمنيًا محتملاً ، خاصةً إذا كنت تقوم بتغيير التنسيق إلى مجموعة فلاتر أكثر تساهلاً. تعمل تنسيقات النص على تعديل إخراج الحقل أثناء العرض ، وليس أثناء الحفظ. لذلك ، على سبيل المثال ، أي 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. مسح ذاكرة التخزين المؤقت بعد التحديث.

20
user7

جرب هذه الطريقة عن طريق عمل حلقة لكل العقد من نوع معين:

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

بالنسبة لي ، نجح ما يلي:

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

1
Ámon Tamás

واجهت نفس الموقف مثل مورتن هنا ، مع ترقية D6 => D7 التي يبدو أنها لم تنهي تنسيقات الإدخال.

اتبعت نهجًا أكثر صرامة من الإجابات الموجودة هنا بالفعل ، وكتبت وحدة نمطية تم تشغيلها من خلال مخطط قاعدة البيانات وتحديث جميع الأعمدة التي تحتوي على السلسلة `` تنسيق '' ، واستبدال قيم تنسيق D6 (1 ، 2 ، 3) بأسماء أجهزة D7 ( filtered_html ، full_html ، plain_text).

https://Gist.github.com/xurizaemon/9824872

Hardcoded لدعم رسم الخرائط

1 => filtered_html, 
2 => full_html,
3 => plain_text,

قد تحاول أيضًا إعادة كتابة الحقول المسماة "format" (مثل "date_format" ، ولكن إذا كان لديك تنسيق تاريخ بقيمة "2" ، فهذه هي مشكلتك).

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

خدعت لي. لا تنس مسح ذاكرة التخزين المؤقت

0
duck

من المفترض أنك ستحتاج إلى معرفة الحقول التي تحتاج إلى تحديث ، ربما للقيام ببعض عمليات التسجيل أو التحقق من البيانات. للقيام بذلك ، احصل على جميع أسماء الأعمدة والجداول التي تحتوي على عمود _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 تحتوي على old_format! بالنسبة للحقول التي تم تعيين معالجة النصوص على Filtered text (user selects text format) ، ستحتاج أيضًا إلى تحديد قيمة افتراضية جديدة والضغط على حفظ.

يجب عليك مسح ذاكرة التخزين المؤقت للفلتر بعد إزالة الفلتر (مرة أخرى ، غير مغطاة بـ drush cc all!):

cache_clear_all('*', 'cache_filter', TRUE);

أو مع السحق:

drush sqlq "truncate table cache_filter;"
0
noobish

يمكنك استخدام الكود التالي ، إذا كان لديك الكيان.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