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


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.