3000+ নোডের জন্য ইনপুট ফর্ম্যাটটি পরিবর্তন করুন


18

আমার কাছে প্রচুর নোড রয়েছে যা তাদের ইনপুট ফর্ম্যাটটি বদলাতে হবে - আমি এটি হাতে হাতে করতে পারতাম, তবে তারপরে আমার ক্রিসমাস 2014 এর আগে করা হবে না।

দ্রুপাল সেই তথ্য কোথায় সঞ্চয় করছে? এসকিউএল কোয়েরি সহ আমি কীভাবে একটি বিভক্ত সেকেন্ডে ইনপুট ফর্ম্যাটটি পরিবর্তন করতে পারি?

উত্তর:


20

আমি এই উত্তরটি বলার মাধ্যমে এই উত্তরটি উপস্থাপন করতে যাচ্ছি এই এন-ম্যাসেজটি একটি সম্ভাব্য সুরক্ষা ঝুঁকি উপস্থাপন করছে, বিশেষত যদি আপনি ফর্ম্যাটটিকে ফিল্টারগুলির আরও লেন্সেন্ট সেটটিতে পরিবর্তন করছেন। পাঠ্যের বিন্যাসগুলি সংরক্ষণের সময় নয়, প্রদর্শনের সময় ক্ষেত্রের আউটপুট পরিবর্তন করে। সুতরাং উদাহরণস্বরূপ, কোনও ক্ষেত্রের কাছে পূর্ববর্তী পালানো এইচটিএমএল বা পিএইচপি সরাসরি দুর্ঘটনাক্রমে বা ইচ্ছাকৃতভাবে ফিল্টারটি সম্পূর্ণ এইচটিএমএল বা পিএইচপি কোডে সেট করে দিলে সরাসরি রেন্ডার / রান হয়ে যায়।

এ কারণেই আপনি কোনও পাঠ্য বিন্যাস পরিবর্তন করলে দ্রুপাল সমস্ত বিদ্যমান নোড স্বয়ংক্রিয়ভাবে আপডেট করে না। অনুরূপ পরিস্থিতিতে টেক্সট ফর্ম্যাটগুলির আচরণ এখনও একটি মুক্ত বিষয়

তাই আবার: সাবধান, ড্রাগন আছে।

সঙ্গে বলেন যে, প্রতিটি ক্ষেত্রের নামে একটি কলাম হিসাবে পাঠ্য সঞ্চয় করে 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 - লিঙ্ক কনফিগার - নম্বর বা স্ট্রিং 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 আপগ্রেড যা দৃশ্যত ইনপুট ফর্ম্যাটগুলি শেষ করেনি finish

ইতিমধ্যে এখানে উত্তরগুলির চেয়ে ক্রুডার পদ্ধতির সাহায্য নিয়েছেন এবং একটি মডিউল লিখেছেন যা ডিবি স্কিমার মধ্য দিয়ে চলেছে এবং D7 মেশিনের নামগুলির সাথে ডি 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,

এছাড়াও 'ফর্ম্যাট' নামযুক্ত ক্ষেত্রগুলি পুনরায় লেখার চেষ্টা করতে পারে (উদাঃ "ডেট_ফর্ম্যাট", তবে আপনার যদি '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'

অবশ্যই আপনাকে অবশ্যই নতুন_বডি_ফর্ম এবং নোড_প্রকার পরিবর্তন করতে হবে


এটি একটি কবজির মতো কাজ করেছে, তবে প্রভাবটি দেখতে আমাকে ক্যাশে সাফ করতে হয়েছিল। ধন্যবাদ.
শশী কাঁথ

0

আপনি সত্তা.মডিউল ইনস্টলড থাকলে নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন।

// I'm using node_save($node); 
$wrapper = entity_metadata_wrapper('node', $node->nid); 
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));

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

পাঠ্য ফিল্টার অপসারণও

আপনি যদি কোনও পাঠ্য ফিল্টারও অবসর নিচ্ছেন, তারপরে আপনাকে সিটিগুলির ক্ষেত্রে ডিফল্ট পাঠ্য বিন্যাসটি পরিবর্তন করতে হবে যা ক্ষেত্রগুলি ব্যবহার করেছিল। আপনি যদি এটি না করেন তবে আপনার ব্যবহারকারীরা যে ক্ষেত্রগুলি ব্যবহার করেছেন সেগুলির মধ্যে অনুমতি প্রত্যাখ্যান বার্তাগুলি পাবেন 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');

আমার জন্য কৌশলটি। ক্যাশে সাফ করতে ভুলবেন না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.