You are here

public function CSVImportForm::importProducts in Commerce Smart Importer 8

Reads part of CSV file and imports it if it is valid.

File

src/Form/CSVImportForm.php, line 337

Class

CSVImportForm
Class CSVImportForm enales you upload CSV and import products from it.

Namespace

Drupal\commerce_smart_importer\Form

Code

public function importProducts($uri, $fields, ImportingParameters $parameters, $external_folders, $save, &$context) {
  $file = fopen($uri, 'r');
  if (!array_key_exists('last_stop', $context['results'])) {
    $import_name = explode('/', $save);

    // Initializing context.
    $context['results']['import_name'] = end($import_name);
    $context['results']['time'] = 0;
    fgetcsv($file);
    fgetcsv($file);
    $context['results']['current_row'] = 3;
    $context['results']['created'] = 0;
    if ($parameters->createProduct === FALSE) {
      touch($save . '/log.json');
      touch($save . '/override_values.json');
      file_put_contents($save . '/field_definitions.json', json_encode($fields, JSON_UNESCAPED_UNICODE));
    }
  }
  else {
    fseek($file, $context['results']['last_stop']);
  }
  if ($parameters->createProduct === FALSE) {
    $log = file_get_contents($save . '/log.json');
    if (!empty($log)) {
      $log = json_decode($log, TRUE);
    }
    else {
      $log = [];
    }
  }
  $current_stop = ftell($file);
  $first_variation_index = $this
    ->getFirstVariationIndex($fields);
  $products = [];
  $product = [];
  $config = $this->smartImporterService
    ->getConfig();
  $limit_products = $config['batch_products'];
  $override_values = [];
  if ($parameters->createProduct === TRUE) {
    $override_values = file_get_contents($save . '/override_values.json');
    if (empty($override_values)) {
      $override_values = [];
    }
    else {
      $override_values = json_decode($override_values, TRUE);
    }
  }

  // Getting data from CSV.
  $override_values_formatted = [];
  $temp_override_values = [];
  while (($line = fgetcsv($file)) !== FALSE) {
    if (!empty($line[0])) {
      if (empty($product)) {
        $product['product'] = array_slice($line, 0, $first_variation_index);
        $product['row'] = $context['results']['current_row'];
        $product['variations'][] = array_slice($line, $first_variation_index, count($line), TRUE);
        $temp_override_values['product'] = $this
          ->getOverrideValue($override_values, $context['results']['current_row'], 'product');
        $temp_override_values['variations'][] = $this
          ->getOverrideValue($override_values, $context['results']['current_row'], 'variation');
      }
      else {
        $products[] = $product;
        $override_values_formatted[] = $temp_override_values;
        if (count($products) == $limit_products) {
          $product = [];
          $temp_override_values = [];
          break;
        }
        $product = [];
        $temp_override_values = [];
        $product['product'] = array_slice($line, 0, $first_variation_index);
        $product['row'] = $context['results']['current_row'];
        $product['variations'][] = array_slice($line, $first_variation_index, count($line), TRUE);
        $temp_override_values['product'] = $this
          ->getOverrideValue($override_values, $context['results']['current_row'], 'product');
        $temp_override_values['variations'][] = $this
          ->getOverrideValue($override_values, $context['results']['current_row'], 'variation');
      }
    }
    else {
      $product['variations'][] = array_slice($line, $first_variation_index, count($line), TRUE);
      $temp_override_values['variations'][] = $this
        ->getOverrideValue($override_values, $context['results']['current_row'], 'variation');
    }
    $context['results']['current_row']++;
    $current_stop = ftell($file);
  }
  if (!empty($product)) {
    $products[] = $product;
    $override_values_formatted[] = $temp_override_values;
  }
  $context['results']['time']++;
  $context['results']['last_stop'] = $current_stop;
  fclose($file);

  // Handling data.
  foreach ($products as $key => $product) {
    $temp_log = $this->smartImporterService
      ->createNewProduct($fields, $product, $parameters, $external_folders, $override_values_formatted[$key]);
    if ($temp_log !== TRUE && $parameters->createProduct === FALSE) {
      $log[$product['row']] = $temp_log['error_log'];
    }
    else {
      if ($temp_log['created'] && $parameters->createProduct) {
        $context['results']['created']++;
      }
    }
  }

  // Putting error log.
  if ($parameters->createProduct === FALSE) {
    file_put_contents($save . '/log.json', json_encode($log, JSON_UNESCAPED_UNICODE));
  }
}