হুক_আপডেট_এন () এ নতুন টেবিলগুলি তৈরি করা উচিত?


11

আপনি যখন একটি নতুন টেবিল তৈরি করেন hook_schema(), সেই টেবিলটিও কি hook_update_N()পাশাপাশি যুক্ত করা উচিত ? বা ডাটাবেইড-আপডেটগুলি স্বয়ংক্রিয়ভাবে টেবিলগুলি যুক্ত করার জন্য কোনও কৌশল, বা আমি কিছু মিস করেছি?

Hook_update_N () এর ডকুমেন্টেশনhook_schema() নতুন টেবিল প্রবর্তন সম্পর্কে কিছুই ব্যাখ্যা করে না, যেখানে ডকুমেন্টেশন বলেছেন:

এই হুক দ্বারা ঘোষিত টেবিলগুলি মডিউলটি প্রথম সক্ষম হয়ে গেলে স্বয়ংক্রিয়ভাবে তৈরি হবে এবং মডিউলটি আনইনস্টল করা অবস্থায় সরিয়ে দেওয়া হবে।

(হাইলাইটটি আমার)

এবং যদি তা হয় তবে কীভাবে সর্বোত্তমভাবে hook_update_N () এবং hook_schema () উভয় ক্ষেত্রেই নতুন টেবিলের জন্য স্কিমা সংজ্ঞাগুলি নকল করা যায়। কেবল নিম্নলিখিত হিসাবে স্কিমার উল্লেখ করা:

 function hook_update_N(&$sandbox) {
   $schema = hook_schema();
   $name = "foo";
   $table = $schema["foo"];
   db_create_table($name, $table);
 }

কাজ মনে হচ্ছে, তবে আবার টেবিল পরিবর্তন করার পরে, যদি কোনও ব্যবহারকারী আপডেটগুলি চালায় এবং দুই বা ততোধিক হুক_আপডেট_এন () চালায় তবে ব্যর্থ হবে। সর্বোপরি: প্রথম হুক_আপডেট_ এন ইতিমধ্যে সঠিক ডাটাবেস ইনস্টল করবে এবং দ্বিতীয় হুক_আপডেট_ এম () ইতিমধ্যে আপ-টু-ডেট থাকা কলামগুলি / পরিবর্তন / পরিবর্তন করার চেষ্টা করবে।

এটার সাথে তুমি কিভাবে চুক্তি করলে?


ডকুমেন্টেশনের জন্য drupal.org/node/150215 দেখুন । সুতরাং মূলত একটি মডিউল ইনস্টল হওয়ার পরে একটি নতুন টেবিল যুক্ত করা হুক_আপডেট_এন এর মাধ্যমে হয় তবে আপনি নতুন ব্যবহারকারী বা নতুন ইনস্টলগুলির জন্য হুক_স্কেমার সাথে সারণী সংজ্ঞাও যুক্ত করেন। সুতরাং আপনি যদি হুক_আপডেট_এন এর মাধ্যমে বর্তমান সারণীগুলি আপডেট করতে কোনও টেবিল পরিবর্তন করেন তবে আপনি হুক_স্কেমার পরিবর্তনগুলিও মার্জ করে নিন।
— জুনেদকাজি

1
সুতরাং ডিআরওয়াই লঙ্ঘন এড়ানোর কোনও উপায় নেই বলে মনে হয়। কৃপা.
— Berkes

কিছুই আমি জানি না। তবে আপনি একটি ছোট ফাংশন লিখতে পারেন যার স্কিমা সংজ্ঞা রয়েছে এবং উভয় ফাংশনে সেই সংজ্ঞাটি কল করতে পারেন।
— জুনেদকাজি

@ বার্কস ওয়ান অন্য একটি ফাংশন সংজ্ঞায়িত করতে পারে যা অতিরিক্ত স্কিমা প্রদান করে এবং এটি আপডেট এবং ইনস্টল হুক উভয় ক্ষেত্রে উল্লেখ করে।
— ব্যবহারকারী1359

উত্তর:


15

সুতরাং drupal.org থেকে কেবল একটি অনুলিপি পেস্ট করুন। Hook_schema এ আপনারও স্কিমা সংজ্ঞা যুক্ত করতে হবে।

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}

আপনি কী বোঝাতে চেয়েছেন যে হুক_স্কেমা () থেকে টেবিল-সংজ্ঞা হুক_আপডেট_এন () এ অনুলিপি করার পরে আর কোনও উপায় নেই। অন্য কথায়: যে ডিআরওয়াই লঙ্ঘন এড়ানোর কোনও উপায় নেই?
— বার্কস

3
@ বার্কস স্পট করেছে ... খুব ভাল ব্যাখ্যা রয়েছে যে আপনি যদি ইতিমধ্যে এটি না দেখে থাকেন তবে এখানে কেন
— ক্লাইভ

@ ক্লাইভ এটি একটি দুর্দান্ত উদাহরণ। এর আগে কখনও দেখেনি। +1
— জুনেদকাজি

@ জুনেদকাজি আপনার মন্তব্যে প্রদত্ত লিঙ্কটিতে এর একটি লিঙ্ক রয়েছে;)
— ক্লাইভ

-2

mymodule_update_7101 () ভাল, এই হুকটি সহ যদি আমরা একটি হুক_ইনস্টল () যুক্ত করি তবে একই সাথে hook_schema () সংজ্ঞা পরিবর্তে মডিউল ইনস্টলেশন করাও আমার পক্ষে কাজ করে।


/**
 * Implements hook_install().
 */
function mymodule_install() {
  // Change the update number accordingly for more updates.
  for ($i = 7101; $i < 7102; $i++) {
    $update_func = 'mymodule_update_' . $i;
    if (function_exists($update_func)) {
      $update_func();
    }
  }
}


নির্দেশিত হিসাবে API ব্যবহার করা দ্রুপাল অনুশীলন। Hook_schema () এবং hook_update_N () সরাসরি ব্যবহার করুন। আমি যা করি তা হ'ল আমার মডিউলের হুক_স্কেমা প্রয়োগটি হুক_আপডেট_এন () এ কল করুন এবং তারপরে সংশ্লিষ্ট ডিবি_ * ফাংশনগুলি পরিচালনা করুন।
— ম্যারাডক্লিফ

hook_install()কোনও সরল সত্যের জন্য কোনও হুক_আপডেট_এন () বাস্তবায়ন কল করা উচিত নয়: hook_install()প্রথমবারের জন্য একটি মডিউল ইনস্টল করার জন্য, যার অর্থ আপডেট করার জন্য কোনও টেবিল নেই। এছাড়াও, আপনার কোডটি এমন আপডেটগুলির জন্য কাজ করবে না যেগুলি চালানোর জন্য একটি ব্যাচের প্রয়োজন।
— কিমলালুনো

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