page_tester-1.0.x-dev/src/Form/PageTesterForm.php

src/Form/PageTesterForm.php
<?php

namespace Drupal\page_tester\Form;

use Drupal\page_tester\PageTesterService;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Url;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\page_tester\TestsPluginManager;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Form\FormBuilderInterface;

/**
 * Provides the database logging filter form.
 *
 * @internal
 */
class PageTesterForm extends FormBase {

  /**
   * The tests session name.
   *
   * @var string
   */
  private $sessionName;

  /**
   * The tests plugin manager.
   *
   * @var \Drupal\page_tester\TestsPluginManager
   */
  protected $testsPluginManager;

  /**
   * The page tester service.
   *
   * @var \Drupal\page_tester\PageTesterService
   */
  protected $pageTesterService;

  /**
   * The messenger service.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * PageTesterForm constructor.
   * @TODO use pagination buttons for tests instead of textfield
   *
   * @param \Drupal\page_tester\TestsPluginManager $testsPluginManager
   *   The page tester service.
   * @param \Drupal\page_tester\PageTesterService $pageTesterService
   *   The page tester service.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   Load messenger service.
   */
  public function __construct(
    TestsPluginManager $testsPluginManager,
    PageTesterService $pageTesterService,
    MessengerInterface $messenger,
  ) {
    $this->testsPluginManager = $testsPluginManager;
    $this->pageTesterService = $pageTesterService;
    $this->messenger = $messenger;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('plugin.manager.tests'),
      $container->get('page_tester.pagetester_service'),
      $container->get('messenger')
    );
  }

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

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) {
    $this->sessionName = 'page_tests_array_'. $options['test'];
    $page_tests_array = $this->getRequest()->getSession()->get($this->sessionName, []);
    if(!isset($page_tests_array['test'])) {
      $page_tests_array['test'] = 1;
      $this->getRequest()->getSession()->set($this->sessionName, $page_tests_array);
    }
    if(!isset($page_tests_array['action'])) {
      $page_tests_array['action'] = 'stop';
      $this->getRequest()->getSession()->set($this->sessionName, $page_tests_array);
    }
    $page_tests_array = $this->getRequest()->getSession()->get($this->sessionName, []);
    dump($page_tests_array);

    $form['#attached']['library'][] = 'page_tester/page_tester.orgchart';
    $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
    $form['container'] = [
      '#type' => 'container',
      '#attributes' => array(
        'class' => array(
          'floating-bar'
        ),
      ),
    ];
    $form['container']['grid-container'] = [
      '#type' => 'container',
      '#attributes' => array(
        'class' => array(
          'grid-container'
        ),
      ),
    ];
    $form['container']['grid-container']['test_id'] = [
      '#type' => 'hidden',
      '#value' => $options['test'],
      '#attributes' => ['id' => 'page-tester-test-id'],
    ];
    $form['container']['grid-container']['test_number'] = [
      '#type' => 'textfield',
      '#default_value' => $page_tests_array['test'],
      '#attributes' => [
        'id' => 'page-tester-test-number',
        'class' => ['text-field-small']
      ],
    ];
    $form['container']['grid-container']['move_by'] = [
      '#type' => 'textfield',
      '#default_value' => $page_tests_array['move_by'] ?? 1,
      '#attributes' => ['class' => ['text-field-small']],
    ];

    $form['container']['grid-container']['actions'] = [
      '#type' => 'actions',
      '#attributes' => ['class' => ['container-inline']],
    ];
    $form['container']['grid-container']['actions']['move_to'] = [
      '#type' => 'submit',
      '#value' => $this->t('Move To'),
      '#submit' => ['::moveTo'],
    ];
    $form['container']['grid-container']['actions']['moveby'] = [
      '#type' => 'submit',
      '#value' => $this->t('Move By'),
      '#submit' => ['::moveBy'],
    ];

    if($options['type'] == 'automated') {
      $form['#attached']['library'][] = 'page_tester/page_tester.automated';
      if($page_tests_array['action'] == 'stop') {
        $form['container']['grid-container']['actions']['play'] = [
          '#type' => 'button',
          '#value' => $this->t('Play'),
          '#id' => 'page-tester-play-button',
          '#submit_button' => FALSE,
          '#attributes' => [
            'class' => ['page-tester-success'],
          ],
        ];
      } else {
        $form['container']['grid-container']['actions']['stop'] = [
          '#type' => 'button',
          '#value' => $this->t('Stop'),
          '#id' => 'page-tester-stop-button',
          '#submit_button' => FALSE,
          '#attributes' => [
            'class' => ['page-tester-danger'],
          ],
        ];
      }
    } else {
      $form['container']['grid-container']['actions']['back'] = [
        '#type' => 'submit',
        '#value' => '<< Back',
        '#submit' => ['::pageTestsBack'],
        '#attributes' => [
          'class' => ['page-tester-success'],
        ],
      ];
      $form['container']['grid-container']['actions']['forward'] = [
        '#type' => 'submit',
        '#value' => 'Forward >>',
        '#submit' => ['::pageTestsForward'],
        '#attributes' => [
          'class' => ['page-tester-success'],
        ],
      ];
    }

    $form['container']['grid-container']['actions']['leave_comment'] = [
      '#type' => 'submit',
      '#value' => $this->t('Comment'),
      '#ajax' => [
        'callback' => [$this, 'createComment'],
        'url' => Url::fromRoute('page_tester.open_create_comment_modal', [
          'test_id' => $options['test'],
          'test_number' => $page_tests_array['test']
        ]),
        'options' => [
          'query' => [
            FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
          ],
        ],
      ],
      '#attributes' => [
        'class' => ['use-ajax'],
        'data-dialog-type' => 'modal',
        'data-dialog-options' => Json::encode([
          'classes' => [
            'ui-dialog' => 'no-close',
          ],
        ]),
      ],
    ];
    $form['container']['grid-container']['actions']['view_comments'] = [
      '#type' => 'submit',
      '#value' => $this->t('Comments'),
      '#ajax' => [
        'callback' => [$this, 'viewComments'],
        'url' => Url::fromRoute('page_tester.open_view_comments_modal', ['test_id' => $options['test']]),
        'options' => [
          'query' => [
            FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
          ],
        ],
      ],
      '#attributes' => [
        'class' => ['use-ajax'],
        'data-dialog-type' => 'modal',
        'data-dialog-options' => Json::encode([
          'classes' => [
            'ui-dialog' => 'no-close',
          ],
        ]),
      ],
    ];

    return $form;
  }

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

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

  private function setNextTest($test_number, $test_id, $action) {
    $testArray = $this->pageTesterService->getTestCount($test_id);
    $page_tests_array = $this->getRequest()->getSession()->get($this->sessionName, []);
    if($test_number < $testArray[0]) $test_number = $testArray[0];
    if($test_number > $testArray[1]) $test_number = $testArray[1];
    $page_tests_array['test'] = $test_number;
    $page_tests_array['action'] = $action;
    $this->getRequest()->getSession()->set($this->sessionName, $page_tests_array);
    $testPlugin = $this->pageTesterService->getTestPlugin($test_id);
    $testPlugin->setTest($test_id, $page_tests_array['test']);
    $this->messenger->addStatus('Test number: ' . $page_tests_array['test'] . ' out of ' . $testArray[2]);
  }

  public function pageTestsBack(array &$form, FormStateInterface $form_state) {
    $test_number = $form_state->getValue('test_number');
    $move_by = $form_state->getValue('move_by');
    $nextTest = $test_number - $move_by;
    $this->setNextTest($nextTest++, $form_state->getValue('test_id'));
  }
  public function pageTestsForward(array &$form, FormStateInterface $form_state) {
    $test_number = $form_state->getValue('test_number');
    $move_by = $form_state->getValue('move_by');
    $nextTest = $test_number + $move_by;
    $this->setNextTest($nextTest++, $form_state->getValue('test_id'));
  }
  public function moveTo(array &$form, FormStateInterface $form_state) {
    $test_number = intval($form_state->getValue('test_number'));
    $this->setNextTest($test_number, $form_state->getValue('test_id'));
  }
  public function moveBy(array &$form, FormStateInterface $form_state) {
    $move_by = $form_state->getValue('move_by');
    $page_tests_array = $this->getRequest()->getSession()->get($this->sessionName, []);
    $page_tests_array['move_by'] = $move_by;
    $test_number = $form_state->getValue('test_number');
    $nextTest = $test_number;
    $this->getRequest()->getSession()->set($this->sessionName, $page_tests_array);
    $this->setNextTest($nextTest, $form_state->getValue('test_id'));
  }

  public function createComment(array &$form, FormStateInterface $form_state) {
    $response = new AjaxResponse();
    return $response;
  }
  public function viewComments(array &$form, FormStateInterface $form_state) {
    $response = new AjaxResponse();
    return $response;
  }

}

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

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