byu_news-8.x-1.x-dev/byu_news_consumer/src/Form/ByuNewsConsumerConfigForm.php

byu_news_consumer/src/Form/ByuNewsConsumerConfigForm.php
<?php

/**
 * Copyright 2017 Brigham Young University
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file
 * Contains Drupal\byu_news_consumer\Form\ByuNewsConsumerConfigForm
 */

namespace Drupal\byu_news_consumer\Form;

use DateTime;
use DateTimeZone;
use Drupal\Core\Config\Config;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;
use Drupal\file\Entity\File;
use Exception;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Class ByuNewsConsumerConfigForm
 *
 * @package Drupal\byu_news_consumer\Form
 */
class ByuNewsConsumerConfigForm extends ConfigFormBase {

  /**
   * @var \Drupal\Core\Database\Connection
   */
  protected $connection;

  protected $user;

  private $cookie;

  private $options;

  private $uid;

  /**
   * ByuNewsConsumerConfigForm constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   * @param \Drupal\Core\Database\Connection $connection
   */
  public function __construct(
    ConfigFactoryInterface $config_factory,
    Connection $connection
  ) {
    parent::__construct($config_factory);
    $this->cookie     = dirname(__FILE__) . '/cookie.txt';
    $this->options    = [
      CURLOPT_RETURNTRANSFER   => TRUE,
      CURLOPT_ENCODING         => "",
      CURLOPT_MAXREDIRS        => 10,
      CURLOPT_HTTP_VERSION     => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST    => "GET",
      CURLOPT_COOKIEFILE       => $this->cookie,
      CURLOPT_COOKIEJAR        => $this->cookie,
      CURLOPT_SSL_VERIFYSTATUS => FALSE,
      CURLOPT_SSL_VERIFYPEER   => FALSE,
      CURLOPT_FOLLOWLOCATION
    ];
    $this->connection = $connection;
    $this->uid        = $this->currentUser()->id();
  }

  /**
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *
   * @return static
   */
  public static function create(ContainerInterface $container) {
    /** @noinspection PhpParamsInspection */
    return new static(
      $container->get('config.factory'),
      $container->get('database')
    );
  }

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form              = parent::buildForm($form, $form_state);
    $config            = $this->config('byu_news_consumer.settings');
    $form['tag_ids']   = [
      '#type'          => 'textfield',
      '#title'         => $this->t('Tag ID\'s separated by \'+\'.'),
      '#default_value' => $config->get('tag_ids'),
    ];
    $form['sync_new']  = [
      '#type'  => 'submit',
      '#value' => t('Sync New Additions'),
    ];
    $form['sync_full'] = [
      '#type'  => 'submit',
      '#value' => 'Sync All Data',
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  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 All Data':
        $this->sync_full_submit($form, $form_state);
        break;
      case 'Sync New Additions':
        $this->sync_new_submit($form, $form_state, TRUE);
        break;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('byu_news_consumer.settings');
    $config->set('tag_ids', $form_state->getValue('tag_ids'));
    $config->save();
    parent::submitForm($form, $form_state);
  }

  /**
   * {@inheritdoc}.
   */
  protected function getEditableConfigNames() {
    return ['byu_news_consumer.settings'];
  }

  /**
   * @param array $form
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   */
  private function sync_full_submit(
    array &$form,
    FormStateInterface $form_state
  ) {
    $config = $this->config('byu_news_consumer.settings');

    $time = new DateTime(19700101);

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

    // Update time saved in config
    $this->updateConfigPostSync($config, TRUE);
    parent::submitForm($form, $form_state);
  }

  /**
   * @param bool $update
   * @param array $form
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   */
  private function sync_new_submit(
    array &$form,
    FormStateInterface $form_state, bool $update = FALSE
  ) {
    $config = $this->config('byu_news_consumer.settings');
    $time   = $config->get('last_sync');

    // Get the date
    if ($time === 'Never') {
      try {
        $time = new DateTime(NULL, new DateTimeZone('GMT'));
      } catch (Exception $e) {
        echo $e->getMessage();
        exit(1);
      }
    }
    else {
      $time = DateTime::createFromFormat(DateTime::RFC850, $time,
        new DateTimeZone('GMT'));
    }

    //Get the data
    $this->getData($time, $config, $update);
    // Update time saved in config
    $this->updateConfigPostSync($config);
    parent::submitForm($form, $form_state);
  }

  /**
   * @param \DateTime $time
   * @param bool $update
   * @param \Drupal\Core\Config\Config $config
   */
  private function getData(DateTime &$time, Config &$config, bool $update = FALSE) {
    // Get collection and gallery data
    $config   = $this->config('byu_news_consumer.settings');
    $tagIds  = $config->get('tag_ids');
    $fullUrl = 'https://news.byu.edu/api/Stories?_format=json&categories=all&tags=' . $tagIds;
    $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);
    }
    $response = json_decode($response, TRUE);

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

  /**
   * @param array $story
   * @param \DateTime $time
   * @param bool $update
   * @param \Drupal\Core\Config\Config $config
   */
  private function saveStory(
    array &$story, DateTime &$time,
    bool $update, Config &$config
  ) {
    $storyId = $story['StoryId'];
    $storyTitle = $story['Title'];
    $storySummary = $story['Summary'];
    $storyUrl = $story['FullUrl'];
    $storyThumb = $story['FeaturedImgUrl'];
    $storyModified = $story['DatePublished'];

    // Check if modified time is after time
    $storyTime = DateTime::createFromFormat('M-DD-y',
      $storyModified, new DateTimeZone('GMT'));
    if ($update) {
      if ($storyTime < $time) {
        unset($storyTime);
        return;
      }
    }
    unset($storyTime);

    if ($storyThumb !== NULL) {
      $file = File::create([
        'uri' => $storyThumb,
        'alt' => t($storyTitle),
      ]);
      $file->save();
    }

    // Create node from $collection and $keyImageId
    if (!$this->nodeExists('byu_news_story_summary', $storyId)) {
      $node = Node::create([
        'nid'                  => NULL,
        'langcode'             => 'en',
        'uid'                  => $this->uid,
        'type'                 => 'byu_news_story_summary',
        'title_field'          => $storyTitle,
        'title'                => $storyTitle,
        'body'                 => $storySummary,
        'status'               => 1,
        'promote'              => 0,
        'comment'              => 0,
        'field_feature_image' => isset($file) ?
          ['target_id' => $file->id()] : NULL,
        'field_story_id' => $storyId,
        'field_story_link' => $storyUrl
      ]);
       /**THIS CODE ADDS A DATE TO THE NODE*/
               //get date from longer string
               $dateOffset = 38;
               $dateLength = 11;
               $date = substr($storyModified, $dateOffset, $dateLength);
               //get the date; format it as a timestamp
               $format = "M-d-Y";
               $date= DateTime::createFromFormat($format, $date);

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

  /**
   * @param bool $isFullSync
   * @param \Drupal\Core\Config\Config $config
   */
  private function updateConfigPostSync(
    Config &$config,
    bool $isFullSync = FALSE
  ) {
    try {
      $currentTime = new DateTime(NULL, new DateTimeZone('GMT'));
    } catch (Exception $e) {
      echo $e->getMessage();
      exit(1);
    }
    if ($isFullSync) {
      $config->set('last_full_sync', $currentTime->format(
        DateTime::RFC850));
    }
    $config->set('last_sync', $currentTime->format(
      DateTime::RFC850));
    $config->save();
  }

  /**
   * @param null $contentType
   * @param null $id
   *
   * @return int|null|string
   */
  private function nodeExists($contentType = NULL, $id = NULL) {
    $nids = \Drupal::entityQuery('node')
                   ->condition('type', $contentType)
                   ->condition('field_story_id', $id)
                   ->execute();
    $node = reset($nids);

    return !empty($node) ? TRUE : FALSE;
  }
}

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

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