back

Knowledge Centre

عملية الدفعة في Drupal 8: لماذا ومتى يجب استخدامها

| 09.03.2018

عملية الدفعة في Drupal 8: لماذا ومتى يجب أن تستخدمها

في أحد مشاريعنا المتعلقة بـ Drupal 8، كنا بحاجة إلى تنفيذ عملية دفعية. دعونا نستكشف ما هي العمليات الدفعية في Drupal 8، ونفهم كيف ومتى يمكن استخدامها بفعالية.

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

لماذا استخدام عملية دفعية؟

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

دعونا نستكشف سيناريو عملي: تخيل أن لديك عرض يقوم بتصفية أنواع المحتوى المقال حيث تم تعيين `field_boring` على TRUE، وتريد حذفها جميعًا. مع أكثر من 500 مقالة مطابقة، ستكون الحذف اليدوي مستهلكًا للوقت وغير فعال. دعونا ننفذ عملية دفعية للتعامل مع هذه المهمة تلقائيًا.

المكونات المطلوبة

لتنفيذ عملية الدفع الخاصة بنا، نحتاج إلى ثلاث ملفات:

  1. وحدة تحكم (Delete.php)
  2. ملف معلومات الوحدة (module.info.yml)
  3. تكوين التوجيه (module.routing.yml)

دعونا ننشئ كل مكون:

أولاً، قم بإنشاء ملف معلومات الوحدة:

# module.info.yml
name: Delete
description: 'Delete articles'
core: 8.x
type: module
package: Custom

ثم، قم بإعداد تكوين التوجيه للتعامل مع الطلبات إلى '/delete-boring-articles':

# module.routing.yml
module.delete:
 path: '/delete-boring-articles'
 defaults:
   _controller: '\Drupal\module\Controller\Delete::delete'
   _title: 'Delete boring articles'
 requirements:
   _permission: 'administer node'

أخيرًا، دعونا ننشئ وحدة التحكم الخاصة بنا التي تتعامل مع عملية الحذف:

<?php
namespace Drupal\module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Provides batch operations for deleting articles.
*/
class Delete extends ControllerBase {
 /**
  * Initiates the batch process for deleting articles.
  *
  * @return array
  *   Returns a batch array.
  */
 public function delete() {
   // Get results from our view.
   $view_results = views_get_view_result('boring_articles', 'page_1');
   $operations = [];
   // Build the operations array from view results.
   foreach ($view_results as $result) {
     $operations[] = [
       [$this, 'batchFunction'],
       [$result->_entity->id()],
     ];
   }
   $batch = [
     'title' => $this->t('Deleting articles'),
     'operations' => $operations,
     'finished' => [$this, 'finishedCallback'],
     'progressive' => TRUE,
   ];
   batch_set($batch);
   return batch_process();
 }
 /**
  * Processes a single node deletion.
  *
  * @param int $id
  *   The node ID to delete.
  * @param array $context
  *   The batch context array.
  */
 public function batchFunction($id, &$context) {
   try {
     $node = Node::load($id);
     if ($node) {
       $node->delete();
       $context['results'][] = $id;
       $context['message'] = $this->t('Deleted article with ID: @id', ['@id' => $id]);
     }
   }
   catch (\Exception $e) {
     $context['error_messages'][] = $this->t('Error deleting article @id: @message', [
       '@id' => $id,
       '@message' => $e->getMessage(),
     ]);
   }
 }
 /**
  * Handles batch completion.
  *
  * @param bool $success
  *   Indicates whether the batch process completed successfully.
  * @param array $results
  *   An array of processed node IDs.
  * @param array $operations
  *   An array of unprocessed operations.
  */
 public function finishedCallback($success, $results, $operations) {
   if ($success) {
     $message = $this->t('Successfully deleted @count articles.', [
       '@count' => count($results),
     ]);
     $this->messenger()->addMessage($message);
   }
   else {
     $message = $this->t('An error occurred while deleting articles.');
     $this->messenger()->addError($message);
   }
   return new RedirectResponse('/admin/content');
 }
}

التحسينات الرئيسية في الكود

  1. التعامل السليم مع الأخطاء: تمت إضافة كتل try-catch للتعامل مع الأخطاء المحتملة أثناء حذف العقدة.
  2. استخدام السياق: تم تنفيذ استخدام سليم لسياق الدفعة لتتبع التقدم والنتائج.
  3. الحقن المعتمد: تم استخدام خدمات الترجمة والرسائل المدمجة في Drupal بشكل صحيح.
  4. الأمان النوعي: تمت إضافة تلميحات نوعية صحيحة وكتل توثيق.
  5. تتبع التقدم: تمت إضافة رسائل تقدم معنوية أثناء تنفيذ الدفعة.
  6. الإكمال النظيف: تم تحسين الرد النهائي لتقديم تغذية مرتدة مفيدة.

ملاحظات مهمة

  1. اختبر دائمًا العمليات الدفعية بشكل كامل في بيئة التطوير أولاً.
  2. فكر في إضافة خطوة تأكيد قبل بدء العملية الدفعية.
  3. تذكر أن تقوم بعمل نسخة احتياطية لقاعدة البيانات الخاصة بك قبل تشغيل العمليات المدمرة.
  4. راقب استخدام الذاكرة عند التعامل مع مجموعات بيانات كبيرة جدًا.

الخاتمة

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

إذا واجهت أي مشاكل في التنفيذ أو لديك أسئلة، فلا تتردد في ترك تعليق أدناه.

عملية الدفعة في دروبال 8
  • المعرفة
    مركز المعرفة
    داخل عقل الذكاء الصناعي
  • المعرفة
    مركز المعرفة
    تنعيم LLaMA لإعادة إنشاء أسلوب إمينيسكو الأدبي
  • المعرفة
    مركز المعرفة
    تبدأ عهدًا جديدًا: إطلاق نظام إدارة المحتوى دروبال 1.0