trinion_zadachnik-1.0.x-dev/src/Form/TimeRecordForm.php

src/Form/TimeRecordForm.php
<?php

namespace Drupal\trinion_zadachnik\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;

/**
 * Time record form
 */
class TimeRecordForm extends FormBase {

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $zadachnik_helper = \Drupal::service('trinion_zadachnik.helper');
    $open_time_record = $zadachnik_helper->getOpenTimeRecord();
    if ($open_time_record = reset($open_time_record)) {
      $open_time_record = Node::load($open_time_record);
      $time = $zadachnik_helper->calculateTaskTimeRecordsTotal($open_time_record->get('field_tz_zadacha')->getString());
      $task = $open_time_record->get('field_tz_zadacha')->first()->entity;
      $form['#task'] = $task;

      $start_date = new \DateTime($open_time_record->get('field_tz_vremya_nachala_zadachi')->getString());
      $date = new \Drupal\Core\Datetime\DrupalDateTime('+' . $time . ' minutes');
      $date->setTimezone(new \DateTimezone(\Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::STORAGE_TIMEZONE));
      $end_date = $date->format(\Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::DATETIME_STORAGE_FORMAT);
      $end_date = new \DateTime($end_date);
      $diff = $start_date->diff($end_date);
      $time = [];
      if ($diff->y)
        $time[] = t('%years years', ['%years' => $diff->y]);
      if ($diff->m)
        $time[] = t('%months months', ['%months' => $diff->m]);
      if ($diff->d)
        $time[] = t('%days days', ['%days' => $diff->d]);
      if ($diff->h)
        $time[] = t('%hours hours', ['%hours' => $diff->h]);
      if ($diff->i)
        $time[] = t('%minutes minutes', ['%minutes' => $diff->i]);
      if ($diff->s)
        $time[] = t('%seconds seconds', ['%seconds' => $diff->s]);
      $form['#counter'] = implode(' ', $time);
      if (empty($form['#counter'])) {
        $form['#counter'] = t('%seconds second', ['%seconds' => 1]);
      }

      $form['open_time_record'] = [
        '#type' => 'hidden',
        '#default_value' => $open_time_record->id(),
      ];
      $form['stop'] = [
        '#type' => 'submit',
        '#value' => t('Stop'),
        '#attributes' => ['class' => ['primary']],
      ];
    }
    else {
      $form['task'] = [
        '#type' => 'textfield',
        '#placeholder' => t('Task'),
        '#autocomplete_route_name' => 'trinion_zadachnik.start_task.autocomplete',
        '#weight' => -1,
        '#theme_wrappers' => [],
      ];
      $form['start'] = [
        '#type' => 'submit',
        '#value' => t('Start'),
        '#attributes' => ['class' => ['primary']],
        '#no-mt' => TRUE,
      ];
    }
    return $form;
  }

  public function validateForm(array &$form, FormStateInterface $form_state) {
    if ($form_state->getTriggeringElement()['#id'] == 'edit-start') {
      if (preg_match('/\((\d+)\)\s*$/', $form_state->getValue('task'), $match)) {
        if ($node = Node::load($match[1])) {
          if ($node->get('field_tz_otvetstvennyy')->getString() == \Drupal::currentUser()->id())
            if ($node->get('field_tz_status_zadachi')->getString() != \Drupal::config('trinion_zadachnik.settings')->get('status_zakrita_tid')) {
              $form_state->set('task_nid', $match[1]);
              return TRUE;
            }
        }
      }
      $form_state->setError($form['task'], t('You cannot take on this task.'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $trigger_element = $form_state->getTriggeringElement()['#id'];
    $date = new \Drupal\Core\Datetime\DrupalDateTime('now');
    $date->setTimezone(new \DateTimezone(\Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::STORAGE_TIMEZONE));
    $time = $date->format(\Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::DATETIME_STORAGE_FORMAT);
    if ($trigger_element == 'edit-stop') {
      $open_time_record = Node::load($form_state->getValue('open_time_record'));
      $diff = strtotime($time) - strtotime($open_time_record->get('field_tz_vremya_nachala_zadachi')->getString());
      $open_time_record->field_tz_vrem_vypoleniya_zadachi = $time;
      $open_time_record->field_tz_timer = 'finished';
      $open_time_record->field_tz_kolichestvo_minut = round($diff / 60);
      $open_time_record->save();
    }
    elseif ($trigger_element == 'edit-start') {
      $uid = \Drupal::currentUser()->id();
      $node = Node::create([
        'type' => 'stroka_vremeni',
        'uid' => $uid,
        'status' => 1,
        'field_tz_data' => date('Y-m-d', strtotime($time)),
        'field_tz_vremya_nachala_zadachi' => $time,
        'field_tz_zadacha' => (int)$form_state->get('task_nid'),
        'field_tz_polzovatel' => $uid,
        'field_tz_kolichestvo_minut' => 0,
        'field_tz_timer' => 'active',
      ]);
      $node->save();
    }
  }
}

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

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