You are here

ImportForm.php in Feed Import 8

File

src/Form/ImportForm.php
View source
<?php

/**
 * @file
 * Contains \Drupal\feed_import\Form\ImportForm
 */
namespace Drupal\feed_import\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\feed_import_base\FeedImport;
class ImportForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'feed_import_import';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['name'] = array(
      '#type' => 'textfield',
      '#title' => t('Feed name'),
      '#maxlength' => 64,
      '#description' => t('This usually is source name.'),
      '#required' => TRUE,
    );
    $form['machine_name'] = array(
      '#type' => 'machine_name',
      '#title' => t('Feed machine name'),
      '#description' => t('This must be unique for each feed and must be not numeric.') . '<br />' . t('Once saved this can not be changed!'),
      '#maxlength' => 64,
      '#required' => TRUE,
      '#machine_name' => array(
        'source' => array(
          'name',
        ),
        'exists' => '\\Drupal\\feed_import_base\\FeedImport::loadFeed',
      ),
    );
    $form['code'] = array(
      '#type' => 'textarea',
      '#rows' => 10,
      '#title' => t('Enter feed in JSON format'),
      '#required' => TRUE,
    );
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Import'),
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    if ($machine_name = $form_state
      ->getValue('machine_name')) {
      if (is_numeric($machine_name) || is_numeric($machine_name[0])) {
        $form_state
          ->setError($form['machine_name'], t('Machine name must be not numeric!'));
      }
    }
    $code = trim($form_state
      ->getValue('code'));
    if (!$code || !($code = @json_decode($code, TRUE))) {
      $form_state
        ->setError($form['code'], t('Invalid JSON code!'));
      return;
    }
    if (!is_array($code)) {
      $form_state
        ->setError($form['code'], t('Invalid feed format!'));
      return;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $options = array(
      'name' => $form_state
        ->getValue('name'),
      'machine_name' => $form_state
        ->getValue('machine_name'),
    );
    if ($code = $this
      ->importFromJson($form_state
      ->getValue('code'), $options)) {
      drupal_set_message(t('Feed imported'));
      $form_state
        ->setRedirect('feed_import.admin_edit', [
        'fid' => $code->machine_name,
      ]);
    }
    else {
      drupal_set_message(t('Feed cannot be imported!'), 'error');
      $form_state
        ->setRedirect('feed_import.admin');
    }
  }

  /**
   * Import a feed from a json file.
   *
   * @param  string $json    The JSON encoded feed configuration
   * @param  array  $options An array of options to add to $json configuration
   * @param  bool   $cleanup TRUE to reset import information
   *
   * @return mixed A feed configuration object on success or false on error
   */
  protected function importFromJson($json, array $options = array(), $cleanup = TRUE, $keep_id = FALSE) {
    if ($code = @json_decode($json, TRUE)) {

      // Get an empty feed configuration.
      $ef = FeedImport::getEmptyFeed();

      // Add options.
      $code = $options + $code;

      // Add empty feed items.
      $code += $ef;

      // Add settings options if any.
      if (!empty($options['settings'])) {
        $code['settings'] = $options['settings'] + $code['settings'];
      }

      // Add empty feed settings.
      $code['settings'] += $ef['settings'];

      // Not needed anymore.
      unset($json, $ef, $options);
      if (!$keep_id) {
        unset($code['id']);
      }

      // Convert to object.
      $code = (object) $code;

      // Cleanup import info.
      if ($cleanup) {
        $code->cron_import = 0;
        $code->last_run = 0;
        $code->last_run_duration = 0;
        $code->last_run_items = 0;
      }

      // Check for group, if no group then use machine_name as group.
      if (empty($code->settings['hashes']['options']['group'])) {
        $code->settings['hashes']['options']['group'] = $code->machine_name;
      }

      // Save feed.
      if (FeedImport::saveFeed($code)) {
        return $code;
      }
    }
    return FALSE;
  }

}

Classes

Namesort descending Description
ImportForm