From 7ca98bac221ba2f3467bd66d5adb4eb2533c5e59 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Fri, 31 Jul 2020 13:41:32 +0100
Subject: [PATCH] Issue #2939645 by quietone, hgoto, dhirendra.mishra, jungle,
 kostyashupenko, govind.maloo, John Cook, alexpott: The sample batch finished
 callback function should have the fourth parameter

---
 core/includes/form.inc                        |  4 +-
 core/lib/Drupal/Core/Form/form.api.php        | 10 +++--
 .../batch_test/batch_test.callbacks.inc       | 43 ++++++++++---------
 .../src/Functional/Batch/ProcessingTest.php   | 18 ++++----
 4 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/core/includes/form.inc b/core/includes/form.inc
index fe3230707e42..4d69fa4c4f79 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -651,7 +651,9 @@ function template_preprocess_form_element_label(&$variables) {
  *
  * Sample callback_batch_finished():
  * @code
- * function my_finished_callback($success, $results, $operations) {
+ * function my_finished_callback($success, $results, $operations, $elapsed) {
+ *   // See callback_batch_finished() for more information about these
+ *   // parameters.
  *   // The 'success' parameter means no fatal PHP errors were detected. All
  *   // other error management should be handled using 'results'.
  *   if ($success) {
diff --git a/core/lib/Drupal/Core/Form/form.api.php b/core/lib/Drupal/Core/Form/form.api.php
index f2acc93b8bfc..5c46e1ee027b 100644
--- a/core/lib/Drupal/Core/Form/form.api.php
+++ b/core/lib/Drupal/Core/Form/form.api.php
@@ -109,13 +109,17 @@ function callback_batch_operation($multiple_params, &$context) {
  *   The value set in $context['results'] by callback_batch_operation().
  * @param $operations
  *   If $success is FALSE, contains the operations that remained unprocessed.
+ * @param string $elapsed
+ *   A string representing the elapsed time for the batch process, e.g.,
+ *   '1 min 30 secs'.
  */
-function callback_batch_finished($success, $results, $operations) {
+function callback_batch_finished($success, $results, $operations, $elapsed) {
   if ($success) {
     // Here we do something meaningful with the results.
-    $message = t("@count items were processed.", [
+    $message = t("@count items were processed (@elapsed).", [
       '@count' => count($results),
-      ]);
+      '@elapsed' => $elapsed,
+    ]);
     $list = [
       '#theme' => 'item_list',
       '#items' => $results,
diff --git a/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc b/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc
index 35c18fec75ca..b3ac6f303478 100644
--- a/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc
+++ b/core/modules/system/tests/modules/batch_test/batch_test.callbacks.inc
@@ -122,7 +122,7 @@ function _batch_test_nested_batch_callback(array $batches = []) {
 /**
  * Provides a common 'finished' callback for batches 1 to 7.
  */
-function _batch_test_finished_helper($batch_id, $success, $results, $operations) {
+function _batch_test_finished_helper($batch_id, $success, $results, $operations, $elapsed) {
   if ($results) {
     foreach ($results as $op => $op_results) {
       $messages[] = 'op ' . Html::escape($op) . ': processed ' . count($op_results) . ' elements';
@@ -141,9 +141,10 @@ function _batch_test_finished_helper($batch_id, $success, $results, $operations)
   // Use item list template to render the messages.
   $error_message = [
     '#type' => 'inline_template',
-    '#template' => 'results for batch {{ batch_id }}{{ errors }}',
+    '#template' => 'results for batch {{ batch_id }} ({{ elapsed }}){{ errors }}',
     '#context' => [
       'batch_id' => $batch_id,
+      'elapsed' => $elapsed,
       'errors' => [
         '#theme' => 'item_list',
         '#items' => $messages,
@@ -152,6 +153,8 @@ function _batch_test_finished_helper($batch_id, $success, $results, $operations)
   ];
 
   \Drupal::messenger()->addStatus(\Drupal::service('renderer')->renderPlain($error_message));
+
+  \Drupal::messenger()->addMessage('elapsed time: ' . $elapsed);
 }
 
 /**
@@ -159,8 +162,8 @@ function _batch_test_finished_helper($batch_id, $success, $results, $operations)
  *
  * Triggers 'finished' callback for batch 0.
  */
-function _batch_test_finished_0($success, $results, $operations) {
-  _batch_test_finished_helper(0, $success, $results, $operations);
+function _batch_test_finished_0($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(0, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -168,8 +171,8 @@ function _batch_test_finished_0($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 1.
  */
-function _batch_test_finished_1($success, $results, $operations) {
-  _batch_test_finished_helper(1, $success, $results, $operations);
+function _batch_test_finished_1($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(1, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -177,8 +180,8 @@ function _batch_test_finished_1($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 1.
  */
-function _batch_test_finished_1_finished($success, $results, $operations) {
-  _batch_test_finished_helper(1, $success, $results, $operations);
+function _batch_test_finished_1_finished($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(1, $success, $results, $operations, $elapsed);
   return new RedirectResponse(Url::fromRoute('test_page_test.test_page', [], ['absolute' => TRUE])->toString());
 }
 
@@ -187,8 +190,8 @@ function _batch_test_finished_1_finished($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 2.
  */
-function _batch_test_finished_2($success, $results, $operations) {
-  _batch_test_finished_helper(2, $success, $results, $operations);
+function _batch_test_finished_2($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(2, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -196,8 +199,8 @@ function _batch_test_finished_2($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 3.
  */
-function _batch_test_finished_3($success, $results, $operations) {
-  _batch_test_finished_helper(3, $success, $results, $operations);
+function _batch_test_finished_3($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(3, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -205,8 +208,8 @@ function _batch_test_finished_3($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 4.
  */
-function _batch_test_finished_4($success, $results, $operations) {
-  _batch_test_finished_helper(4, $success, $results, $operations);
+function _batch_test_finished_4($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(4, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -214,8 +217,8 @@ function _batch_test_finished_4($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 5.
  */
-function _batch_test_finished_5($success, $results, $operations) {
-  _batch_test_finished_helper(5, $success, $results, $operations);
+function _batch_test_finished_5($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(5, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -223,8 +226,8 @@ function _batch_test_finished_5($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 6.
  */
-function _batch_test_finished_6($success, $results, $operations) {
-  _batch_test_finished_helper(6, $success, $results, $operations);
+function _batch_test_finished_6($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(6, $success, $results, $operations, $elapsed);
 }
 
 /**
@@ -232,6 +235,6 @@ function _batch_test_finished_6($success, $results, $operations) {
  *
  * Triggers 'finished' callback for batch 7.
  */
-function _batch_test_finished_7($success, $results, $operations) {
-  _batch_test_finished_helper(7, $success, $results, $operations);
+function _batch_test_finished_7($success, $results, $operations, $elapsed) {
+  _batch_test_finished_helper(7, $success, $results, $operations, $elapsed);
 }
diff --git a/core/modules/system/tests/src/Functional/Batch/ProcessingTest.php b/core/modules/system/tests/src/Functional/Batch/ProcessingTest.php
index 7a2109846011..69e23ed0c6ee 100644
--- a/core/modules/system/tests/src/Functional/Batch/ProcessingTest.php
+++ b/core/modules/system/tests/src/Functional/Batch/ProcessingTest.php
@@ -316,38 +316,40 @@ public function _resultStack($id, $value = 0) {
   public function _resultMessages($id) {
     $messages = [];
 
+    // The elapsed time should be either in minutes and seconds or only seconds.
+    $pattern_elapsed = ' \((\d+ mins? )?\d+ secs?\)';
     switch ($id) {
       case 'batch_0':
-        $messages[] = 'results for batch 0<div class="item-list"><ul><li>none</li></ul></div>';
+        $messages[] = 'results for batch 0' . $pattern_elapsed . '<div class="item-list"><ul><li>none</li></ul></div>';
         break;
 
       case 'batch_1':
-        $messages[] = 'results for batch 1<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 1' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
         break;
 
       case 'batch_2':
-        $messages[] = 'results for batch 2<div class="item-list"><ul><li>op 2: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 2' . $pattern_elapsed . '<div class="item-list"><ul><li>op 2: processed 10 elements</li></ul></div>';
         break;
 
       case 'batch_3':
-        $messages[] = 'results for batch 3<div class="item-list"><ul><li>op 1: processed 10 elements</li><li>op 2: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 3' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li><li>op 2: processed 10 elements</li></ul></div>';
         break;
 
       case 'batch_4':
-        $messages[] = 'results for batch 4<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 4' . $pattern_elapsed . '<div class="item-list"><ul><li>op 1: processed 10 elements</li></ul></div>';
         $messages = array_merge($messages, $this->_resultMessages('batch_2'));
         break;
 
       case 'batch_5':
-        $messages[] = 'results for batch 5<div class="item-list"><ul><li>op 5: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 5' . $pattern_elapsed . '<div class="item-list"><ul><li>op 5: processed 10 elements</li></ul></div>';
         break;
 
       case 'batch_6':
-        $messages[] = 'results for batch 6<div class="item-list"><ul><li>op 6: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 6' . $pattern_elapsed . '<div class="item-list"><ul><li>op 6: processed 10 elements</li></ul></div>';
         break;
 
       case 'batch_7':
-        $messages[] = 'results for batch 7<div class="item-list"><ul><li>op 7: processed 10 elements</li></ul></div>';
+        $messages[] = 'results for batch 7' . $pattern_elapsed . '<div class="item-list"><ul><li>op 7: processed 10 elements</li></ul></div>';
         $messages = array_merge($messages, $this->_resultMessages('batch_6'));
         $messages = array_merge($messages, $this->_resultMessages('batch_5'));
         break;
-- 
GitLab