You are here

function quiz_cron in Quiz 6.x

Same name and namespace in other branches
  1. 8.6 quiz.module \quiz_cron()
  2. 8.4 quiz.module \quiz_cron()
  3. 8.5 quiz.module \quiz_cron()
  4. 6.6 quiz.module \quiz_cron()
  5. 6.3 quiz.module \quiz_cron()
  6. 6.4 quiz.module \quiz_cron()
  7. 6.5 quiz.module \quiz_cron()
  8. 7.6 quiz.module \quiz_cron()
  9. 7 quiz.module \quiz_cron()
  10. 7.4 quiz.module \quiz_cron()
  11. 7.5 quiz.module \quiz_cron()

Implements hook_cron().

File

./quiz.module, line 43
Contains quiz.module

Code

function quiz_cron() {
  $db = Drupal::database();
  $result_ids = [];

  // Remove old quiz results that haven't been finished.
  $old_rm_time = Drupal::config('quiz.settings')
    ->get('remove_partial_quiz_record');

  // $time = 0 for never.
  if ($old_rm_time) {
    $res = $db
      ->select('quiz_result', 'qnr')
      ->fields('qnr', [
      'result_id',
    ])
      ->condition('time_end', 0)
      ->where('(:request_time - time_start) > :remove_time', [
      ':request_time' => Drupal::time()
        ->getRequestTime(),
      ':remove_time' => $old_rm_time,
    ])
      ->execute();
    while ($result_id = $res
      ->fetchField()) {
      $result_ids[$result_id] = $result_id;
    }
  }

  // Remove invalid quiz results.
  $inv_rm_time = Drupal::config('quiz.settings')
    ->get('remove_invalid_quiz_record');

  // $time = 0 for never.
  if ($inv_rm_time) {
    $query = $db
      ->select('quiz_result', 'qnr');
    $query
      ->fields('qnr', [
      'result_id',
    ]);
    $query
      ->join('quiz', 'qnp', 'qnr.vid = qnp.vid');

    // If the user has a limited amount of takes we don't delete invalid
    // results.
    $db_or = $query
      ->orConditionGroup();
    $db_or
      ->isNull('qnp.takes');
    $db_or
      ->condition('qnp.takes', 0);
    $query
      ->condition($db_or);
    $query
      ->condition('qnr.is_invalid', 1);
    $query
      ->condition('qnr.time_end', Drupal::time()
      ->getRequestTime() - $inv_rm_time, '<=');
    $res = $query
      ->execute();
    while ($result_id = $res
      ->fetchField()) {
      $result_ids[$result_id] = $result_id;
    }
  }
  $quiz_results = QuizResult::loadMultiple($result_ids);
  Drupal::entityTypeManager()
    ->getStorage('quiz_result')
    ->delete($quiz_results);
}