Drupal - Adding autocomplete for text-field
If you want to select an entity, then there is a way easier way to do that. Drupal 8 has a standard entity_autocomplete field type, just specify your form element like this:
$form['node'] = [
'#type' => 'entity_autocomplete',
'#target_type' => 'node',
];
See Custom autocomplete field for more information.
Also, never do database queries against node/entity tables. Use \Drupal::entityQuery() for that.
Your class need some modification you need to check request and put it into $string.
<?php
namespace Drupal\mymodule\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Component\Utility\Unicode;
class DefaultController extends ControllerBase
{
/**
* Returns response for the autocompletion.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The current request object containing the search string.
*
* @return \Symfony\Component\HttpFoundation\JsonResponse
* A JSON response containing the autocomplete suggestions.
*/
public function autocomplete(request $request) {
$matches = array();
$string = $request->query->get('q');
if ($string) {
$matches = array();
$query = \Drupal::entityQuery('node')
->condition('status', 1)
->condition('title', '%'.db_like($string).'%', 'LIKE');
//->condition('field_tags.entity.name', 'node_access');
$nids = $query->execute();
$result = entity_load_multiple('node', $nids);
foreach ($result as $row) {
//$matches[$row->nid->value] = $row->title->value;
$matches[] = ['value' => $row->nid->value, 'label' => $row->title->value];
}
}
return new JsonResponse($matches);
}
}
- Create a routing.yml file and add the below code : admin_example.autocomplete:
:
path: '/admin_example/autocomplete'
defaults:
_controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
requirements:
_permission: 'access content'
- The form which you have build in mymodule/src/Form/EditForm.php is correct
You need to change the code in controller .The code is below :
public function autocomplete(Request $request)
{
$string = $request->query->get('q');
$matches = array();
$query = db_select('node_field_data', 'n')
->fields('n', array('title', 'nid'))
->condition('title', $string . '%', 'LIKE')
->execute()
->fetchAll();
foreach ($query as $row) {
$matches[] = array('value' => $row->nid, 'label' => $row->title);
}
return new JsonResponse($matches);
}