You are here

function _feed_import_base_process_feed in Feed Import 8

Same name and namespace in other branches
  1. 7.3 feed_import_base/feed_import_base.module \_feed_import_base_process_feed()

Imports a feed.

2 calls to _feed_import_base_process_feed()
drush_feed_import_base_feed in feed_import_base/feed_import_base.drush.inc
Implements drush_COMMANDFILE_COMMANDNAME()
FeedImportController::processFeed in src/Controller/FeedImportController.php
Process a feed

File

feed_import_base/feed_import_base.module, line 111
Basic settings for feed import base module

Code

function _feed_import_base_process_feed($feed, $recheck = FALSE) {
  $state = \Drupal::state();
  $config = \Drupal::config('feed_import_base.settings');
  $running = $state
    ->get('feed_import.running', array());
  $invoke_hooks = $config
    ->get('invoke_hooks', FALSE);
  $overlap = $config
    ->get('let_overlap');
  if ($recheck) {
    if (is_array($overlap) && !in_array($feed->entity, $overlap) && !empty($running[$feed->entity]) && in_array($feed->machine_name, $running[$feed->entity])) {

      // Invoke hooks.
      $invoke_hooks && \Drupal::moduleHandler()
        ->invokeAll('feed_import_error', [
        FeedImport::FEED_OVERLAP_ERR,
        $feed,
        array(),
      ]);
      return FeedImport::FEED_OVERLAP_ERR;
    }
    unset($overlap);
  }
  $running[$feed->entity][] = $feed->machine_name;
  $state
    ->set('feed_import.running', $running);
  unset($running);
  register_shutdown_function('_feed_import_base_remove_running', $feed);
  $report = FeedImport::import($feed, _feed_import_base_get_filters_dir());
  _feed_import_base_remove_running($feed);
  $feed->skip_remove_running = TRUE;
  $report_errors = $config
    ->get('feed_import_reports');

  // Check for errors.
  if (empty($report['init_error'])) {

    // Save last run and duration.
    $feed->last_run = $report['started'];
    $d = $report['finished'] - $report['started'];
    $feed->last_run_duration = $d > 0 ? $d : 0;

    // Check fewer items protection.
    if (strlen($feed->settings['uniq_path']) && $feed->settings['feed']['protect_on_fewer_items']) {
      $d = trim($feed->settings['feed']['protect_on_fewer_items']);
      if (substr($d, -1) == '%') {

        // Do not update last import items if percentage is used!
        $d = rtrim($d, '%') * $feed->last_run_items / 100;
      }
      else {
        $feed->last_run_items = $report['total'];
      }
      $d = (int) $d;
      if ($report['total'] < $d) {

        // Save import status.
        FeedImport::saveFeedImportStatus($feed);

        // Reschedul all.
        $class = $feed->settings['hashes']['class'];
        $class::rescheduleAll($feed->machine_name, $feed->settings['hashes']['options']['ttl']);
        if ($report_errors) {

          // Report base info.
          _feed_import_base_save_report($report, $feed);

          // Report rescheduled all.
          \Drupal::logger('Feed Import')
            ->warning('Rescheduled all items for @name because source contained only @total items but expected @expected. !errors', array(
            '@name' => $feed->name,
            '@total' => $report['total'],
            '@expected' => $d,
            '!errors' => '<br />' . _feed_import_base_get_error_table($report['errors']),
          ));
        }
        $report['expected'] = $d;

        // Invoke hooks.
        $invoke_hooks && \Drupal::moduleHandler()
          ->invokeAll('feed_import_error', [
          FeedImport::FEED_ITEMS_ERR,
          $feed,
          $report,
        ]);
        return FeedImport::FEED_ITEMS_ERR;
      }
    }
    $feed->last_run_items = $report['total'];
    FeedImport::saveFeedImportStatus($feed);

    // Save report if needed.
    $report_errors && _feed_import_base_save_report($report, $feed);

    // Invoke hooks.
    $invoke_hooks && \Drupal::moduleHandler()
      ->invokeAll('feed_import_success', [
      $feed,
      $report,
    ]);
    return FeedImport::FEED_OK;
  }
  else {
    $ret = FALSE;

    // Reader init problem.
    if (strlen($feed->settings['uniq_path']) && $feed->settings['feed']['protect_on_invalid_source']) {
      $ret = TRUE;
      $feed->last_run = time();
      $feed->last_run_duration = 0;
      if (substr(trim($feed->settings['feed']['protect_on_fewer_items']), -1) != '%') {
        $feed->last_run_items = 0;
      }
      FeedImport::saveFeedImportStatus($feed);

      // Reschedule all.
      $class = $feed->settings['hashes']['class'];
      $class::rescheduleAll($feed->machine_name, $feed->settings['hashes']['options']['ttl']);
      if ($report_errors) {

        // Report reschedule all.
        \Drupal::logger('Feed Import')
          ->warning('Rescheduled all items for @name due to a source problem. !errors', array(
          '@name' => $feed->name,
          ':errors' => '<br />' . _feed_import_base_get_error_table($report['errors']),
        ));
      }
    }

    // Invoke hooks.
    $invoke_hooks && \Drupal::moduleHandler()
      ->invokeAll('feed_import_error', [
      FeedImport::FEED_SOURCE_ERR,
      $feed,
      $report,
    ]);
    if ($ret) {
      return FeedImport::FEED_SOURCE_ERR;
    }
    else {
      $invoke_hooks = FALSE;
    }
  }
  if ($report_errors) {
    dpm(_feed_import_base_get_error_table($report['errors']));
    \Drupal::logger('Feed Import')
      ->warning('Cannot process feed @name because it is misconfigured. :errors', [
      '@name' => $feed->name,
      ':errors' => _feed_import_base_get_error_table($report['errors']),
    ]);
  }

  // Invoke hooks.
  $invoke_hooks && \Drupal::moduleHandler()
    ->invokeAll('feed_import_error', [
    FeedImport::FEED_CONFIG_ERR,
    $feed,
    $report,
  ]);
  return FeedImport::FEED_CONFIG_ERR;
}