exposure_api_consumer-8.x-1.x-dev/src/Form/ExposureApiConsumerConfigForm.php

src/Form/ExposureApiConsumerConfigForm.php
<?php
/**
 * @file
 * Contains \Drupal\exposure_api_consumer\Form\ExposureApiConsumerConfigForm.
 */

namespace Drupal\exposure_api_consumer\Form;

use DateTime;
use Drupal\Core\Config\Config;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;
use Drupal\file\Entity\File;
use Exception;

class ExposureApiConsumerConfigForm extends ConfigFormBase
{

  private $options;
  private $uid;

  /**
   * ExposureApiConsumerConfigForm constructor.
   *
   * @param ConfigFactoryInterface $config_factory
   */
  public function __construct(
    ConfigFactoryInterface $config_factory
  )
  {
    parent::__construct($config_factory);
    $this->options = [
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
      CURLOPT_SSL_VERIFYSTATUS => FALSE,
      CURLOPT_SSL_VERIFYPEER => FALSE,
      CURLOPT_FOLLOWLOCATION
    ];
    $this->uid = $this->currentUser()->id();
  }

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state)
  {
    $form              = parent::buildForm($form, $form_state);
    $config            = $this->config('exposure_api_consumer.settings');
    $form['endpoint'] = array(
      '#type' => 'textfield',
      '#title' => t('Endpoint:'),
      '#required' => TRUE,
      '#default_value' => $config->get('endpoint'),
      '#description' => t('Example: https://exposure.co/api/3/site/{endpoint}')
    );
    $form['sync_api'] = [
      '#type' => 'submit',
      '#value' => t('Sync with API'),
    ];
    return $form;
  }

  public function validateForm(array &$form, FormStateInterface $form_state)
  {
    $op = $form_state->getValue('op');
    switch ($op) {
      case 'Save configuration':
        $this->submitForm($form, $form_state);
        break;
      case 'Sync with API':
        $this->syncWithApi($form, $form_state);
        break;
    }
    parent::validateForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state)
  {
    $config = $this->config('exposure_api_consumer.settings');
    $config->set('endpoint', $form_state->getValue('endpoint'));
    $config->save();
    $message = $this->messenger();
    $message->addMessage($this->t("Update successful."), $message::TYPE_STATUS);
  }

  /**
   * @param array $form
   * @param FormStateInterface $form_state
   */
  public function syncWithApi(array &$form, FormStateInterface $form_state)
  {
    $config = $this->config('exposure_api_consumer.settings');

    //Get the data
    $this->getData($config);

    parent::submitForm($form, $form_state);
  }

  /**
   * @param Config $config
   */
  private
  function getData(Config &$config)
  {
    // Get collection and gallery data
    $config = $this->config('exposure_api_consumer.settings');
    $endpoint = $config->get('endpoint');
    $fullUrl = 'https://exposure.co/api/3/site/' . $endpoint . '/stories';
    $curl = curl_init($fullUrl);
    curl_setopt_array($curl, $this->options);

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
      echo "cURL Error #:" . $err;
      exit(1);
    }
    $raw = json_decode($response, TRUE);
    $response = $raw['stories']['stories'];

    // Cycle through all collections
    foreach ($response as $story) {
      $this->saveStory($story);
      unset($story);
    }
    unset($response);
  }

  /**
   * @param array $story
   */
  private function saveStory(
    array &$story
  )
  {
    $storyId = $story['id'];
    $storyTitle = $story['title'];
    $storyUrl = $story['urls']['story_web'];
    $storyThumb = explode("?", $story['cover_photo']['url']);
    $storyModified = $story['published_at'];

    if ($storyThumb[0] !== NULL) {
      $file = File::create([
        'uri' => $storyThumb[0],
        'alt' => t($storyTitle),
      ]);
      try {
        $file->save();
      } catch (EntityStorageException $e) {
        echo $e->getMessage();
      }
    }

    // Check if node exists
    $connection = \Drupal::database();
    $query = $connection->query("SELECT * FROM {node__field_story_link} WHERE `field_story_link_uri`='$storyUrl'");
    $result = $query->fetchAll();

    if ($result == NULL) {
      $node = Node::create([
        'nid' => NULL,
        'langcode' => 'en',
        'uid' => $this->uid,
        'type' => 'photo_essay',
        'title' => $storyTitle,
        'status' => 1,
        'promote' => 0,
        'comment' => 0,
        'field_thumbnail' => isset($file) ?
          ['target_id' => $file->id(), 'alt' => $storyTitle] : NULL,
        'field_story_id' => $storyId,
        'field_story_link' => $storyUrl
      ]);
      /**THIS CODE ADDS A DATE TO THE NODE*/
      //get the date; format it as a timestamp
      $dateStr = substr($storyModified, 0, 19);
      $timezone = new \DateTimeZone(substr($storyModified, -6));
      $date = DateTime::createFromFormat("Y-m-d\TH:i:s", $dateStr, $timezone);
      $timestamp = $date->getTimestamp();

      //change time of the node's creation
      $node->setCreatedTime($timestamp);
      /**END ADDED CODE*/
      try {
        $node->save();
      } catch (Exception $e) {
        echo $e->getMessage();
        exit(1);
      }
      if (isset($file)) {
        unset($file);
      }
      unset($node);
    }
  }

  /**
   * Gets the configuration names that will be editable.
   *
   * @return array
   *   An array of configuration object names that are editable if called in
   *   conjunction with the trait's config() method.
   */
  protected function getEditableConfigNames()
  {
    return ['exposure_api_consumer.settings'];
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc