it-swarm.asia

كيفية الحصول على hook_install () لتشغيل كل hook_update_N ()؟

كيف يمكنني الحصول على hook_install () لتشغيل جميع التحديثات التي أملكها للوحدة النمطية الخاصة بي؟ لدي فيه ملف mymod.install.

لقد حاولت

function mymod_install() {
  mymod_update_6001();
}

ولكن لا يبدو أنها تفعل أي شيء. إذا كان لدي mymod_update_6002 () ، فما زلت أتصل برقم 6001 () ، فقط اتصل برقم 6002 () أو اتصل بالرقم 6001 () ، 6002 ().

اعتقدت أنه سيكون من المنطق السليم تشغيل جميع التحديثات عند تثبيت وحدة بشكل افتراضي.

18
Lucy

لا يجب أن تحصل على ربط التثبيت الخاص بك لتشغيل التحديثات. عندما يتم تثبيت وحدة نمطية للمرة الأولى لا ينبغي أن تكون التحديثات ضرورية.

يتم استخدام التحديثات عند تثبيت الوحدة بالفعل (تم إنشاء قاعدة البيانات أو المتغيرات). في هذه الحالة ، لا ترغب في إعادة تثبيت الوحدة النمطية لأنها سوف تمسح جميع البيانات ، بدلاً من ذلك تقوم بإنشاء ربطات تحديث. Drupal التحديثات المطلوبة والتي سيتم تشغيلها في update.php. في Drupal 6 سيحدد تلقائيًا التحديثات التي يجب إجراؤها ، ولكن يمكنك تغييرها ، بينما هذا غير ممكن في Drupal 7.

يكتشف دروبال التحديثات المطلوبة من خلال حفظ رقم آخر تحديث تم تشغيله. يمكن أن يكون هذا تغييرات في قاعدة البيانات ، والتي ستسمح بإعادة تشغيل التحديثات في Drupal 7. عادة ما تكون إعادة التشغيل فكرة سيئة وستتسبب غالبًا في حدوث أخطاء ويمكن في بعض الحالات أن تفسد بياناتك.

تذكر دائمًا نسخ قاعدة البيانات احتياطيًا قبل تشغيل التحديثات.

19
googletorp

الغرض من الخطافات مختلف.

  • hook_install () يتم استدعاء عند تثبيت وحدة نمطية ؛ هذا يعني أن الوحدة لم تكن مثبتة مسبقًا ، وبالتالي ، لا تحتاج إلى تحديث.
  • hook_update_N () يتم استدعاؤه عندما تكون الوحدة مثبتة بالفعل ، ويجب تحديثها.

إذا كانت هناك بعض المهام التي يجب القيام بها عند تثبيت الوحدة ، وعند تحديث الوحدة ، يجب أن يكون الرمز موجودًا في كل من الخطافين. لا توجد وحدة تستدعي كل عمليات ربط التحديث أثناء التثبيت ، وسيكون ذلك خطأ بشكل خاص عندما تقوم وظائف التحديث بتحديث مخطط جداول قاعدة البيانات المستخدمة من الوحدة النمطية ؛ hook_schema () يجب دائمًا إعادة المخطط المحدّث ، وسيكون تحديث المخطط أيضًا مع وظائف التحديث خاطئًا.

لا يعمل الرمز الذي كتبته لأن استدعاء إحدى وظائف التحديث لا ينفذ تلقائيًا جميع وظائف التحديث الأخرى.
استدعاء وظائف التحديث من تنفيذ hook_install() خطأ ، لأنه من الخطأ استدعاء وظيفة التحديث من وظيفة أخرى ؛ إذا كان هناك رمز يجب تنفيذه من وظيفتين أو أكثر من وظائف التحديث ، فيجب وضع هذا الرمز في وظيفة يتم استدعاؤها من وظائف التحديث ، ومن hook_install() ، إذا لزم الأمر.

15
kiamlaluno

يتم استدعاء خطاف التثبيت فقط عندما يتم تثبيت الوحدة حديثًا ، لذلك ليست هناك حاجة لأي تحديثات. يتم تنفيذ التحديثات فقط عندما تكون الوحدة النمطية مثبتة بالفعل ، بحيث يمكنها تطبيق تغييرات إضافية.

لفرض وظائف التحديث على التثبيت ، عليك تغيير إصدار المخطط الخاص بك ، على سبيل المثال:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

أو تشغيله من السحق: drush -y updb.

انظر أيضًا: هل من الممكن فرض ربط تحديث الوحدة الخاصة بك على التشغيل؟

5
kenorb

لن يعمل hook_install في ملف mymod.module.

يجب عليك وضع hook_install و hook_uninstall في ملف منفصل mymod.install

أعتقد أنه يجب أيضًا وضع hook_update_N() في mymod.install


الإجابة بعد تحديث السؤال:

نقلاً عن link ، يرجى التحقق من رقم الإصدار في ملف المعلومات.

نظرًا لأنني أقوم بالتطوير بشكل خاص وليس للمساهمة ، فإن حقل "الإصدار" الخاص بي في ملف .info الخاص بوحدتي إما فارغ أو لم يتغير عند تحديث وحدة. أنا في الواقع أستخدم Subversive لـ Eclipse PDT وبالتالي لا يتم تحديث أرقام إصدارات ملفات المعلومات الخاصة بي مطلقًا. وبالتالي ، لم يتم استدعاء hook_update_6001 الخاص بي بواسطة update.php.

1
Shoaib Nawaz