cms/drupal/modules/system/form.api.php
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * @file
       
     5  * Callbacks provided by the form system.
       
     6  */
       
     7 
       
     8 /**
       
     9  * @addtogroup callbacks
       
    10  * @{
       
    11  */
       
    12 
       
    13 /**
       
    14  * Perform a single batch operation.
       
    15  *
       
    16  * Callback for batch_set().
       
    17  *
       
    18  * @param $MULTIPLE_PARAMS
       
    19  *   Additional parameters specific to the batch. These are specified in the
       
    20  *   array passed to batch_set().
       
    21  * @param $context
       
    22  *   The batch context array, passed by reference. This contains the following
       
    23  *   properties:
       
    24  *   - 'finished': A float number between 0 and 1 informing the processing
       
    25  *     engine of the completion level for the operation. 1 (or no value
       
    26  *     explicitly set) means the operation is finished: the operation will not
       
    27  *     be called again, and execution passes to the next operation or the
       
    28  *     callback_batch_finished() implementation. Any other value causes this
       
    29  *     operation to be called again; however it should be noted that the value
       
    30  *     set here does not persist between executions of this callback: each time
       
    31  *     it is set to 1 by default by the batch system.
       
    32  *   - 'sandbox': This may be used by operations to persist data between
       
    33  *     successive calls to the current operation. Any values set in
       
    34  *     $context['sandbox'] will be there the next time this function is called
       
    35  *     for the current operation. For example, an operation may wish to store a
       
    36  *     pointer in a file or an offset for a large query. The 'sandbox' array key
       
    37  *     is not initially set when this callback is first called, which makes it
       
    38  *     useful for determining whether it is the first call of the callback or
       
    39  *     not:
       
    40  *     @code
       
    41  *       if (empty($context['sandbox'])) {
       
    42  *         // Perform set-up steps here.
       
    43  *       }
       
    44  *     @endcode
       
    45  *     The values in the sandbox are stored and updated in the database between
       
    46  *     http requests until the batch finishes processing. This avoids problems
       
    47  *     if the user navigates away from the page before the batch finishes.
       
    48  *   - 'message': A text message displayed in the progress page.
       
    49  *   - 'results': The array of results gathered so far by the batch processing.
       
    50  *     This array is highly useful for passing data between operations. After
       
    51  *     all operations have finished, this is passed to callback_batch_finished()
       
    52  *     where results may be referenced to display information to the end-user,
       
    53  *     such as how many total items were processed.
       
    54  */
       
    55 function callback_batch_operation($MULTIPLE_PARAMS, &$context) {
       
    56   if (!isset($context['sandbox']['progress'])) {
       
    57     $context['sandbox']['progress'] = 0;
       
    58     $context['sandbox']['current_node'] = 0;
       
    59     $context['sandbox']['max'] = db_query('SELECT COUNT(DISTINCT nid) FROM {node}')->fetchField();
       
    60   }
       
    61 
       
    62   // For this example, we decide that we can safely process
       
    63   // 5 nodes at a time without a timeout.
       
    64   $limit = 5;
       
    65 
       
    66   // With each pass through the callback, retrieve the next group of nids.
       
    67   $result = db_query_range("SELECT nid FROM {node} WHERE nid > %d ORDER BY nid ASC", $context['sandbox']['current_node'], 0, $limit);
       
    68   while ($row = db_fetch_array($result)) {
       
    69 
       
    70     // Here we actually perform our processing on the current node.
       
    71     $node = node_load($row['nid'], NULL, TRUE);
       
    72     $node->value1 = $options1;
       
    73     $node->value2 = $options2;
       
    74     node_save($node);
       
    75 
       
    76     // Store some result for post-processing in the finished callback.
       
    77     $context['results'][] = check_plain($node->title);
       
    78 
       
    79     // Update our progress information.
       
    80     $context['sandbox']['progress']++;
       
    81     $context['sandbox']['current_node'] = $node->nid;
       
    82     $context['message'] = t('Now processing %node', array('%node' => $node->title));
       
    83   }
       
    84 
       
    85   // Inform the batch engine that we are not finished,
       
    86   // and provide an estimation of the completion level we reached.
       
    87   if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
       
    88     $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
       
    89   }
       
    90 }
       
    91 
       
    92 /**
       
    93  * Complete a batch process.
       
    94  *
       
    95  * Callback for batch_set().
       
    96  *
       
    97  * This callback may be specified in a batch to perform clean-up operations, or
       
    98  * to analyze the results of the batch operations.
       
    99  *
       
   100  * @param $success
       
   101  *   A boolean indicating whether the batch has completed successfully.
       
   102  * @param $results
       
   103  *   The value set in $context['results'] by callback_batch_operation().
       
   104  * @param $operations
       
   105  *   If $success is FALSE, contains the operations that remained unprocessed.
       
   106  */
       
   107 function callback_batch_finished($success, $results, $operations) {
       
   108   if ($success) {
       
   109     // Here we do something meaningful with the results.
       
   110     $message = t("!count items were processed.", array(
       
   111       '!count' => count($results),
       
   112       ));
       
   113     $message .= theme('item_list', array('items' => $results));
       
   114     drupal_set_message($message);
       
   115   }
       
   116   else {
       
   117     // An error occurred.
       
   118     // $operations contains the operations that remained unprocessed.
       
   119     $error_operation = reset($operations);
       
   120     $message = t('An error occurred while processing %error_operation with arguments: @arguments', array(
       
   121       '%error_operation' => $error_operation[0],
       
   122       '@arguments' => print_r($error_operation[1], TRUE)
       
   123     ));
       
   124     drupal_set_message($message, 'error');
       
   125   }
       
   126 }