You are here

function uc_file_action_order_renew in Ubercart 8.4

Same name and namespace in other branches
  1. 6.2 uc_file/uc_file.ca.inc \uc_file_action_order_renew()
  2. 7.3 uc_file/uc_file.rules.inc \uc_file_action_order_renew()

Renews an orders product files.

This function updates access limits on all files found on all products on a given order. First, the order user is loaded, then the order's products are scanned for file product features. An order comment is saved, and the user is notified in Drupal, as well as through the email address associated with the order.

Parameters

\Drupal\uc_order\OrderInterface $order: An Ubercart order object.

1 string reference to 'uc_file_action_order_renew'
uc_file_rules_action_info in uc_file/uc_file.rules.inc
Implements hook_rules_action_info().

File

uc_file/uc_file.rules.inc, line 271
Rules hooks and functions for uc_file.module.

Code

function uc_file_action_order_renew(OrderInterface $order) {
  $user_downloads = [];

  // Load user.
  if (!($order_user = $order
    ->getOwner())) {
    return;
  }

  // Scan products for models matching downloads.
  foreach ($order->products as $product) {
    $files = db_query("SELECT * FROM {uc_file_products} fp " . "INNER JOIN {uc_product_features} pf ON pf.pfid = fp.pfid " . "INNER JOIN {uc_files} f ON f.fid = fp.fid " . "WHERE nid = :nid", [
      ':nid' => $product->nid,
    ]);
    foreach ($files as $file) {

      // Either they match, or the file was set to any SKU.
      if (!empty($file->model) && $file->model != $product->model) {
        continue;
      }

      // Grab any existing privilege so we can calculate the new expiration time
      // as an offset of the previous.
      $file_user = _uc_file_user_get($order_user, $file->fid);

      // Get the limit info from the product feature.
      $file_modification = [
        'download_limit' => uc_file_get_download_limit($file),
        'address_limit' => uc_file_get_address_limit($file),
        'expiration' => _uc_file_expiration_date(uc_file_get_time_limit($file), $file_user ? max($file_user->expiration, \Drupal::time()
          ->getRequestTime()) : NULL),
      ];

      // Add file_user(s) for this file/directory. (No overwrite)
      $new_files = uc_file_user_renew($file->fid, $order_user, $file->pfid, $file_modification, FALSE);

      // Save for notification.
      $user_downloads = array_merge($user_downloads, $new_files);

      // Note on the order where the user has gained download permission.
      if (is_dir(uc_file_qualify_file($file->filename))) {
        $comment = t('User can now download files in the directory %dir.', [
          '%dir' => $file->filename,
        ]);
      }
      else {
        $comment = t('User can now download the file %file.', [
          '%file' => \Drupal::service('file_system')
            ->basename($file->filename),
        ]);
      }
      uc_order_comment_save($order
        ->id(), $order_user
        ->id(), $comment);
    }
  }

  // Notify the user of their download(s).
  if ($user_downloads) {
    rules_invoke_event('uc_file_notify_grant', $order, $user_downloads);
  }
}