forena-8.x-1.x-dev/src/Form/AjaxFormTrait.php
src/Form/AjaxFormTrait.php
<?php
namespace Drupal\forena\Form;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\CloseDialogCommand;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Form\FormStateInterface;
use Drupal\forena\Controller\AjaxPageControllerBase;
/**
* Class AjaxFormTrait
*
* Use this trait to add ajax submit handler behaviors that complement an
* AjaxControllerInterface class.
*
* @deprecated Extend |Drupal\e\Form\AjaxFormBase instead.
*/
trait AjaxFormTrait {
/**
* @var \Drupal\forena\Controller\AjaxPageControllerBase
* The Ajax cotnroller bound to this form.
*/
protected $controller;
/**
* Return the controller that is bound to the form.
*/
public function getController() {
return $this->controller;
}
/**
* Ajax callback handler for submit buttons.
*
* @param array $form
* Form array
* @param \Drupal\Core\Form\FormStateInterface $form_state
* Drupal form state object.
* @return \Drupal\Core\Ajax\AjaxResponse
* The ajax response object used to update the page.
*/
public function submitCallback(&$form, FormStateInterface $form_state) {
if ($this->controller->is_modal_form) {
return $this->ajaxModalCallback($form, $form_state);
}
else {
return $this->ajaxCallback($form, $form_state);
}
}
/**
* Ajax callback.
* @param array $form
* Drupal form render array
* @param $form_state
* Drupral form state object.
* @return \Drupal\Core\Ajax\AjaxResponse
*/
public function ajaxCallback($form, FormStateInterface $form_state) {
$commands = $this->controller->getCommands();
$response = new AjaxResponse();
// Make sure form error rebuilds happen.
if ($form_state->getErrors() || $form_state->isRebuilding()) {
$ctl['status_messages'] = [
'#type' => 'status_messages',
'#weight' => -10,
];
// Array merge the status element onto the beginning of the form.
$form = array_merge($ctl, $form);
$section = $form_state->get('e_section');
$command = new HtmlCommand("#$section", $form);
$response->addCommand($command);
}
foreach ($commands as $command) {
$response->addCommand($command);
}
$this->controller->saveState();
return $response;
}
/**
* Ajax callback.
* @param $form
* @param $form_state
* @return \Drupal\Core\Ajax\AjaxResponse
*/
public function ajaxModalCallback(&$form, FormStateInterface $form_state) {
if ($form_state->getErrors() || $form_state->isRebuilding()) {
unset($form['#prefix']);
unset($form['#suffix']);
// array merge the status elements onto the beginning of the form
$ctl['status_messages'] = [
'#type' => 'status_messages',
'#weight' => -10,
];
$form = array_merge($ctl, $form);
$this->controller->setEndCommand(new HtmlCommand('#e-modal-form', $form));
}
else {
$this->controller->setEndCommand( new CloseDialogCommand());
}
$commands = $this->controller->getCommands();
$response = new AjaxResponse();
foreach ($commands as $command) {
$response->addCommand($command);
}
$this->controller->saveState();
return $response;
}
/**
* @param \Drupal\forena\Controller\AjaxPageControllerBase $controller
* @param $form
* @param \Drupal\Core\Form\FormStateInterface $form_state
*/
public function bindAjaxForm(AjaxPageControllerBase $controller, &$form, FormStateInterface $form_state) {
if ($controller->is_modal_form && $controller->jsMode!='nojs') {
$form_state->set('e_modal', TRUE);
$form['#prefix'] = "<div id='e-modal-form'>";
$form['#suffix'] = "</div>";
}
else {
$form_state->set('e_section', $controller->section);
}
$form[$controller::TOKEN_PARAMETER] = [
'#type' => 'hidden',
'#value' => $controller->getStateToken(),
];
// Disable caching on this form.
$form_state->setCached(FALSE);
// Set the form state handler.
$controller->form_state = $form_state;
// Alter the submit handlers.
$this->controller = $controller;
$method = "::submitCallback";
$callback = $method;
$this->alterForm($form, $callback);
}
/**
* @param array $elements
* Drupal form render array section.
* @param string $callback
* Callback to apply to the form submit buttons.
*/
private function alterForm(&$elements, $callback) {
foreach ($elements as $key => $element) {
if (strpos($key, '#')!==0 && is_array($element)) {
if (!empty($element['#type'])){
switch ($element['#type']) {
case 'submit':
if (!isset($element['#ajax'])) {
$elements[$key]['#mode'] = $callback;
$elements[$key]['#ajax'] = [
'callback' => $callback,
'event' => 'click',
];
}
break;
}
}
$this->alterForm($elements[$key], $callback);
}
}
}
public function __wakeup() {
$this->controller = AjaxPageControllerBase::service();
}
}