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;
}
}
