content_deploy-1.0.1/src/Form/DeployForm.php

src/Form/DeployForm.php
<?php

namespace Drupal\content_deploy\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\node\Entity\Node;
use Drupal\Core\Url;
use Drupal\user\Entity\User;

/**
 * Provides the database logging filter form.
 */
class DeployForm extends FormBase {

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $params = \Drupal::request()->query->all();

    $form['action'] = [
      '#type' => 'details',
      '#title' => $this->t('Action'),
      '#open' => TRUE,
    ];

    $envOptions = ['dev' => 'Dev', 'stage' => 'Stage', 'prod' => 'Prod'];
    $enabledEnvOptions = [];
    $defaultEnvValue = 'prod';
    foreach ($envOptions as $envValue => $env) {
      $envDetails = \Drupal::config('content_deploy.settings')->get('content_deploy.' . $envValue . '_env_url');
      if (\Drupal::currentUser()->hasPermission($envValue . ' deploy content') && !empty($envDetails)) {
        $enabledEnvOptions[$envValue] = $env;
      }
    }

    if (empty($enabledEnvOptions)) {
      $enabledEnvOptions['prod'] = 'Prod';
      $defaultEnvValue = 'prod';
    }
    elseif (!array_key_exists($defaultEnvValue, $enabledEnvOptions)) {
      $defaultEnvValue = array_key_first($enabledEnvOptions);
    }

    $form['action']['environment'] = [
      '#title' => $this->t('Target Environment'),
      '#type' => 'radios',
      '#required' => TRUE,
      '#options' => $enabledEnvOptions,
      '#default_value' => $defaultEnvValue,
      '#attributes' => ['class' => ['inline']],
    ];

    $form['action']['status'] = [
      '#title' => $this->t('Deployed Node Status'),
      '#type' => 'radios',
      '#required' => TRUE,
      '#options' => ['1' => t('Published'), '0' => t('Unpublished')],
      '#default_value' => '1',
      '#attributes' => ['class' => ['container-inline']],
    ];

    // Query for newest articles and return max 3 results.
    $query = \Drupal::entityQuery('node');
    $nodes = $query->sort('changed', 'DESC');
    if (!empty($params['title'])) {
      $query->condition('title', '%' . $params['title'] . '%', 'LIKE');
    }
    if (!empty($params['type'])) {
      $query->condition('type', $params['type'], '=');
    }
    if (!empty($params['status'])) {
      $status = ($params['status'] == 1) ? 1 : 0;
      $query->condition('status', $status);
    }
    if (!empty($params['langcode'])) {
      $query->condition('langcode', $params['langcode']);
    }
    $nodes = $query->pager(20)->execute();
    // LoadMultiple News in $nodes variable.
    $nodes = Node::loadMultiple($nodes);
    $options = [];
    if ($nodes) {
      foreach ($nodes as $node) {
        $nid = $node->id();
        $nodeUUID = $node->uuid();
        $url_options = ['absolute' => FALSE];
        $url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $url_options);
        $node_title = $node->getTitle();
        $url = $url->toString();
        $user = $node->getOwner();
        $node_link = Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $node->id()]);
        if ($user->id()) {
          $name = $user->getAccountName();
          $user_link = Link::createFromRoute($name, 'entity.user.canonical', ['user' => $user->id()]);
        }
        else {
          $user_link = t('Anonymous');
        }
        if ($node->isPublished()) {
          $status = t('Published');
        }
        else {
          $status = t('Unpublished');
        }
        $cchanged = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'm/d/Y H:i');
        $options[$nodeUUID] = [
          'label' => ['data' => $node_link],
          'url' => ['data' => $url],
          'type' => ['data' => $node->getType()],
          'author' => ['data' => $user_link],
          'status' => ['data' => $status],
          'changed' => ['data' => $cchanged],
        ];
      }
    }
    $header = [
      'label' => [
        'data' => $this->t('Title'),
        'specifier' => 'title',
      ],
      'url' => [
        'data' => $this->t('Url'),
      ],
      'type' => [
        'data' => $this->t('Content Type'),
        'specifier' => 'type',
      ],
      'author' => [
        'data' => $this->t('Author'),
      ],
      'status' => [
        'data' => $this->t('Status'),
      ],
      'changed' => [
        'data' => $this->t('Updated'),
        'specifier' => 'changed',
        'sort' => 'desc',
      ],
    ];

    $form['action']['deploy_date_time'] = [
      '#title' => $this->t('Deployment Time'),
      '#type' => 'datetime',
      '#required' => TRUE,
    ];

    $form['filters']['actions'] = [
      '#type' => 'actions',
      '#attributes' => ['class' => ['container-inline']],
    ];

    $form['filters']['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Deploy'),
    ];

    $form['result'] = [
      '#type' => 'tableselect',
      '#options'  => $options,
      '#header' => $header,
      '#empty' => $this->t('Data not found'),
      '#attributes' => ['class' => ['views-table views-view-table cols-8 responsive-enabled sticky-enabled sticky-table']],
    ];

    $form['pager'] = [
      '#type' => 'pager',
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {

    if (empty($form_state->getValue('environment')) || $form_state->getValue('environment') == 'none') {
      $form_state->setErrorByName('environment', t('No Environment selected or You don\'t have access to deploy on any Environment.'));
      return;
    }

    $tableNodes = $form_state->getValue('result');
    $selectedNodes = array_filter($tableNodes, function ($singleTableNode) {
      return $singleTableNode;
    });
    if (empty($selectedNodes)) {
      $form_state->setErrorByName('result', t('No node selected for deployment. Please select the nodes.'));
      return;
    }
    else {
      foreach ($selectedNodes as $singleSelectedNode) {
        $currTimestamp = \Drupal::time()->getCurrentTime();
        $autoDeployQuery = \Drupal::database()->select('cd_auto_nodes_export', 'ane');
        $autoDeployQuery->fields('ane');
        $autoDeployQuery->condition('ane.node_uuid', $singleSelectedNode, '=');
        $autoDeployQuery->condition('ane.deployment_time', $currTimestamp, '>=');
        $autoDeployQuery->condition('ane.deployment_status', 0, '=');
        $autoDeployNodes = $autoDeployQuery->countQuery()->execute()->fetchField();
        if (!empty($autoDeployNodes) && $autoDeployNodes > 0) {
          $form_state->setErrorByName('result][' . $singleSelectedNode, t('Some selected nodes (marked red below) are already added in deployment list. Please remove them from deployment list before re-adding or you can update those deployments separately.'));
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

    $nodeTargetStatus = $form_state->getValue('status');

    $targetEnv = $form_state->getValue('environment');

    $deployDateTime = $form_state->getValue('deploy_date_time');
    $deployDateTime = $deployDateTime->getTimestamp();

    $current_user = User::load(\Drupal::currentUser()->id());
    $currentUserUUID = $current_user->uuid();

    $currTimestamp = \Drupal::time()->getCurrentTime();

    $tableNodes = $form_state->getValue('result');
    $selectedNodes = array_filter($tableNodes, function ($singleTableNode) {
      return $singleTableNode;
    });

    foreach ($selectedNodes as $selectedNodeUUID) {
      \Drupal::database()->insert('cd_auto_nodes_export')
        ->fields(['node_uuid', 'node_target_status', 'target_environment', 'deployment_time', 'user_uuid', 'created'])
        ->values([$selectedNodeUUID, $nodeTargetStatus, $targetEnv, $deployDateTime, $currentUserUUID, $currTimestamp])
        ->execute();
    }
    return \Drupal::messenger()->addMessage(t('Selected Nodes has been added in list of auto deployment.'), 'status');
  }

}

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

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