I created a modal form with Ajax:
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Drupal\hello\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax;
use Drupal\Core\Ajax\OpenModalDialogCommand;
/**
* Description of HelloModalForm
*
* @author arthur
*/
class HelloModalForm extends FormBase {
public function buildForm(array $form, FormStateInterface $form_state) {
$form['#attached']['library'][] = 'core/drupal.dialog.ajax';
$form['node_title'] = array(
'#type' => 'textfield',
'#title' => $this->t('Node\'s title'),
'#description' => $this->t('Enter a portion of the title to search for'),
);
$form['actions']['type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Search'),
'#ajax' => array( // here we add ajax callback where we will process
'callback' => '::open_modal', // the data that came from the form in modal window
),
);
$form['#title'] = 'Seach for Node by Title';
return $form;
}
public function getFormId() {
return 'hello_model_form';
}
public function validateForm(array &$form, FormStateInterface $form_state) {
// input your code for validation, no validation required in this search
}
public function submitForm(array &$form, FormStateInterface $form_state) {
}
public function open_modal(&$form, FormStateInterface $form_state) {
$node_title = $form_state->getValue('node_title');
$query = \Drupal::entityQuery('node')->condition('title', $node_title, 'CONTAINS');
$entity = $query->execute();
$key = array_keys($entity);
$id = !empty($key[0]) ? $key[0] : NULL;
$response = new AjaxResponse();
$title = 'Node ID';
if ($id !== NULL) {
$content = '<div class="test-popup-content"> Node ID is: ' . $id . '</div>';
$options = array(
'dialogClass' => 'popup-dialog-class',
'width' => '300',
'height' => '300',
);
$response->addCommand(new OpenModalDialogCommand($title, $content, $options));
} else {
$content = 'Not found record with this title <strong>' . $node_title . '</strong>';
$options = array(
'dialogClass' => 'popup-dialog-class',
'width' => '300',
'height' => '300',
);
$response->addCommand(new OpenModalDialogCommand($title, $content, $options));
}
return $response;
}
}
Error Message on calling Modal form:
User error: "type" is an invalid render array key in Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php). Drupal\Core\Render\Element::children(Array) (Line: 1027) Drupal\Core\Form\FormBuilder->doBuildForm('hello_model_form', Array, Object) (Line: 1073) Drupal\Core\Form\FormBuilder->doBuildForm('hello_model_form', Array, Object) (Line: 575) Drupal\Core\Form\FormBuilder->processForm('hello_model_form', Array, Object) (Line: 321) Drupal\Core\Form\FormBuilder->buildForm(Object, Object) (Line: 91) Drupal\Core\Controller\FormController->getContentResult(Object, Object) call_user_func_array(Array, Array) (Line: 123) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber{closure}() (Line: 573) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 124) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) (Line: 97) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber{closure}() (Line: 151) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106) Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 708) Drupal\Core\DrupalKernel->handle(Object) (Line: 19) User error: "type" is an invalid render array key in Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php). Drupal\Core\Render\Element::children(Array, ) (Line: 402) Drupal\Core\Render\Renderer->doRender(Array) (Line: 444) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 200) Drupal\Core\Render\Renderer->render(Array, ) (Line: 226) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent{closure}() (Line: 573) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 227) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 117) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 111) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch('kernel.view', Object) (Line: 156) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106) Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 47) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 708) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
$node_title
is indeed a string not an array?