cloudwords-8.x-1.x-dev/src/Form/CloudwordsProjectForm.php

src/Form/CloudwordsProjectForm.php
<?php

namespace Drupal\cloudwords\Form;

use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Url;
use Drupal\Core\Link;
/**
 * Form controller for Cloudwords project edit forms.
 *
 * @ingroup cloudwords
 */
class CloudwordsProjectForm extends FormBase {

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, \Drupal\cloudwords\CloudwordsDrupalProject $cloudwords_project = null) {
    if (is_null($cloudwords_project->getId())) {
      drupal_set_message($this->t('Project not found.'), 'warning');
      return [];
    }
    $form_state->set(['cloudwords_project'], $cloudwords_project);

    $action_statuses = array(
      'configured_project_name',
      'configured_project_details',
      'uploaded_source_materials',
      'configured_bid_options',
      'waiting_for_bid_selection',
      'bid_selection_expired',
    );

    if (in_array($cloudwords_project->getStatus()->getCode(), $action_statuses)) {
      drupal_set_message($this->t('Please finish <a href="@href" target="_blank">creating your project in Cloudwords</a>.', ['@href' => _cloudwords_ui_url() . '/cust.htm#project/' . $cloudwords_project->getId()]), 'warning');
    }

    // Update project info.
    $project_info = [
      'name' => $cloudwords_project->getName(),
      'status' => $cloudwords_project->getStatus()->getCode(),
    ];
    \Drupal::database()->merge('cloudwords_project')->fields($project_info)->key(['id' => $cloudwords_project->getId()])->execute();

    $client = cloudwords_get_api_client();


    // Project details.
    $form['project_details'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Project Details'),
      '#tree' => TRUE,
    ];
    $form['project_details']['metadata']['source_language'] = [
      '#markup' => $this->t('Source language') . ': ' . $cloudwords_project->getSourceLanguage()->getDisplay() . '<br />',
    ];
    $form['project_details']['metadata']['status'] = [
      '#markup' => $this->t('Status') . ': ' . $cloudwords_project->getStatus()->getCode() . '<br />',
    ];
    $form['project_details']['metadata']['description'] = [
      '#markup' => $this->t('Description') . ': ' . $cloudwords_project->getDescription() . '<br />',
    ];
    $form['project_details']['metadata']['notes'] = [
      '#markup' => $this->t('Notes') . ': ' . $cloudwords_project->getNotes() . '<br />',
    ];
    $form['project_details']['metadata']['delivery_due_date'] = [
      '#markup' => $this->t('Delivery due date') . ': ' . \_cloudwords_format_display_date($cloudwords_project->getDeliveryDueDate()) . '<br />',
    ];

    $options = ['attributes' => ['target' => '_blank']];

    $url = Url::fromUri(_cloudwords_ui_url() . '/cust.htm#project/' . $cloudwords_project->getId());

    $form['project_details']['metadata']['view'] = [
      '#markup' =>  Link::fromTextAndUrl($this->t('View Project in Cloudwords'), $url, $options)->toString(),
    ];

    if ($cloudwords_project->isActive()) {
      $form['project_details']['metadata']['cancel'] = [
        '#type' => 'submit',
        '#value' => $this->t('Cancel'),
        '#submit' => array('\Drupal\cloudwords\form\CloudwordsProjectForm::cloudwords_cancel_project_redirect'),
      ];
    }

    // Build language table.
    $files = [];
    try {
      $files = $client->get_project_translated_files($cloudwords_project->getId());
    }
    catch (CloudwordsApiException $e) {}

    $rows = [];
    foreach ($files as $file) {
      $lang_path = '/admin/cloudwords/projects/' . $cloudwords_project->getId() . '/' . $file->getLang()->getLanguageCode();
      $status_code = $file->getStatus()->getCode();

      $operations = [];

      if ($status_code != 'not_delivered') {
        $operations[] = Link::fromTextAndUrl($this->t('Import'), Url::fromUri('internal:' . $lang_path . '/import'))->toString();
        $operations[] = \Drupal::l($this->t('Review in Cloudwords'), Url::fromUri(_cloudwords_ui_url() . '/cust.htm#project/' . $cloudwords_project->getId() . '/language/' . $file->getLang()->getLanguageCode(), ['attributes' => ['target' => '_BLANK']]));
      }

      //$language_status = '';
      $language_status = $cloudwords_project->getLanguageImportStatus($file->getLang());


      $query = \Drupal::database()->select('cloudwords_content', 'cc');
      $query->addJoin('INNER', 'cloudwords_translatable', 'ct', 'ct.id = cc.ctid');
      $query->condition('ct.language', cloudwords_map_cloudwords_drupal($file->getLang()->getLanguageCode()));
      $query->addExpression('COUNT(cc.ctid)', 'ncount');
      $total = $query->execute()->fetchField();
      $failed = $query->condition('cc.status', 3)->execute()->fetchField();

      if ($status_code == 'approved' && $language_status != CLOUDWORDS_LANGUAGE_FAILED) {
        $language_status = $this->t('Imported');
      }
      elseif ($language_status == 1 && ($status_code == 'delivered' || $status_code == 'in_review')) {
        $language_status = $this->t('Imported');
        $operations[] = \Drupal::l($this->t('Approve'), Url::fromUri('internal:/admin/cloudwords/projects/' . $cloudwords_project->getId() . '/' . $file->getLang()->getLanguageCode() . '/approve'));
      }
      elseif ($language_status == CLOUDWORDS_LANGUAGE_APPROVED) {
        $language_status = $this->t('Imported');
      }
      elseif ($language_status == CLOUDWORDS_LANGUAGE_FAILED) {
        $language_status = '<span class="marker">' . $this->t('Failed') . '</span>';
      }
      else {
        $language_status = $this->t('Not imported');
      }

      if ($failed) {
        $language_status = '<span class="marker">' . "$failed/$total failed" . '</span>';
      }

//      if ($project->isDrupalCancelled()) {
//        $operations = array();
//      }

     $operations_render = [
       '#type' => 'markup',
       '#markup' =>implode(' | ', $operations),
     ];

      $row = [
          Link::fromTextAndUrl($file->getLang()->getDisplay(), Url::fromUri('internal:' . $lang_path)),
          $file->getStatus()->getDisplay(),
          $language_status,
          \Drupal::service('renderer')->render($operations_render),
        ];

      $rows[] = $row;
    }


    $header = [
      $this->t('Name'),
      $this->t('Status'),
      $this->t('Import status'),
      $this->t('Operations'),
    ];

    $form['language_wrapper'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Languages'),
      '#tree' => FALSE,
    ];

    $form['language_wrapper']['table'] = [
      '#theme' => 'table',
      '#header' => $header,
      '#rows' => $rows,
      '#attributes' => ['id' => 'cloudwords-project-table'],
      '#empty' => $this->t('No languages available.'),
    ];

    // Build reference material table.
    $references = [];
    // @todo what to do when
//    Array
//    (
//      [http_status_code] => 404
//    [request_type] => GET
//    [request_url] => https://api-stage.cloudwords.com/1.16/project/14471/file/reference.json
//    [error_message] => The specified resource was not found.
//)
    try {
      $references = $client->get_project_references($cloudwords_project->getId());
    }
    catch (CloudwordsApiException $e) {
      $references = [];
    }

    $reference_rows = [];
    foreach ($references as $reference) {
      $ops = [
        Link::createFromRoute($this->t('Replace'),  'cloudwords.cloudwords_file_replace_form', ['cloudwords_project' => $cloudwords_project->getId(),'cloudwords_file' => $reference->getId()])->toString(),
        Link::createFromRoute($this->t('Download'),  'cloudwords.cloudwords_file_download', ['cloudwords_project' => $cloudwords_project->getId(),'cloudwords_file' => $reference->getId()])->toString(),
      ];
      $ops_render = [
        '#type' => 'markup',
        '#markup' =>implode(' | ', $ops),
      ];
      $row = [
        $reference->getFileName(),
        \_cloudwords_format_display_date($reference->getCreatedDate()),
        \Drupal::service('renderer')->render($ops_render),
      ];
      $reference_rows[] = $row;
    }

    $form['reference_wrapper'] = [
      '#type' => 'fieldset',
      '#title' => $this->t('Project Reference Materials (Optional)'),
      '#tree' => TRUE,
      '#collapsible' => TRUE,
      '#collapsed' => empty($reference_rows),
    ];

    $form['reference_wrapper']['reference_table'] = [
      '#theme' => 'table',
      '#header' => [t('File name'), $this->t('Date'), $this->t('Operations')],
      '#rows' => $reference_rows,
      '#attributes' => ['id' => 'cloudwords-project-table'],
      '#empty' => $this->t('No reference material available.'),
    ];

    $form['reference_wrapper']['upload'] = [
      '#type' => 'container',
      '#title' => $this->t('Project reference material'),
      '#attributes' => ['class' => ['container-inline']],
      '#tree' => FALSE,
    ];

    $form['reference_wrapper']['upload']['reference'] = [
      '#type' => 'file',
      // '#title' => $this->t('Project reference materials'),
      // '#description' => $this->t('Upload additional reference materials.'),

      '#file_info' => NULL,
      '#size' => 10,
    ];

    $form['reference_wrapper']['upload']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Upload'),
    ];

   // $form['#attached']['css'][] = drupal_get_path('module', 'cloudwords') . '/cloudwords.css';

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $upload_dir = 'private://cloudwords/reference_material';

    if (!file_prepare_directory($upload_dir, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
      $form_state->setErrorByName('upload][reference', $this->t('Unable to create the upload directory.'));
    }

    if (!($file = file_save_upload('reference', [
      'file_validate_extensions' => [
        'zip'
      ]
    ], $upload_dir))) {
      // form_set_error('upload][reference', $this->t('Please upload a zip file.'));
    }
    else {
      $form_state->set(['reference_material'], $file);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $cloudwords_project = $form_state->get(['cloudwords_project']);
//    $cloudwords_file = $form_state->get(['cloudwords_file']);
    if ($form_state->get('reference_material') !== null) {
      $error_message = 'There was a problem uploading the reference material. Please try again.';
      $reference_material = $form_state->get('reference_material');

      foreach($reference_material as $file){
        cloudwords_get_api_client()->upload_project_reference($cloudwords_project->getId(), \Drupal::service("file_system")->realpath($file->getFileUri()));
      }
    }
  }

  /**
   * Submit callback that redirects to project cancel page.
   */
  public static function cloudwords_cancel_project_redirect(&$form, FormStateInterface $form_state) {
    $cloudwords_project = $form_state->get(['cloudwords_project']);
    $form_state->setRedirect('cloudwords.cloudwords_project_cancel_form', ['cloudwords_project' => $cloudwords_project->getId()]);
  }
}

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

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