Я попытался реализовать автозаполнение в текстовом поле для drupal 8 в моем пользовательском модуле
все, что я хотел, это выбрать и отобразить вероятный заголовок, который я набрал с помощью автозаполнения, поэтому объявил открытую функцию автозаполнения в классе в DefaultController.php в каталоге папки -> mymodule / src / Controller / DefaultController.php
<?php
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\JsonResponse;
class DefaultController extends ControllerBase
{
public function autocomplete($string)
{
$matches = array();
$db = \Drupal::database();
$result = $db->select('node_field_data', 'n')
->fields('n', array('title', 'nid'))
->condition('title', '%'.db_like($string).'%', 'LIKE')
->addTag('node_access')
->execute();
foreach ($result as $row) {
$matches[$row->nid] = check_plain($row->title);
}
return new JsonResponse($matches);
}
}
затем создал EditForm.php в каталоге папок -> mymodule / src / Form / EditForm.php
<?php
namespace Drupal\mymodule\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class EditForm extends FormBase
{
public function getFormId()
{
return 'mymodule_edit_form';
}
public function buildForm(array $form, FormStateInterface $form_state)
{
$form = array();
$form['input_fields']['nid'] = array(
'#type' => 'textfield',
'#title' => t('Name of the referenced node'),
'#autocomplete_route_name' => 'mymodule.autocomplete',
'#description' => t('Node Add/Edit type block'),
'#default' => ($form_state->isValueEmpty('nid')) ? null : ($form_state->getValue('nid')),
'#required' => true,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Create'),
);
return $form;
}
}
также создал mymodule.routing.yml
mymodule.autocomplete:
path: '/mymodule/autocomplete'
defaults:
_controller: '\Drupal\mymodule\Controller\DefaultController::autocomplete'
requirements:
_permission: 'access content'
все еще не реализована функция автозаполнения? Кто-нибудь может указать мне, что мне не хватает ??
Ответы:
Ваш класс нуждается в некоторой модификации, вам нужно проверить запрос и поместить его в $ string.
источник
\Drupal::entityQuery('node')
было бы предпочтительнее использовать отдельно от выбора.z-index
для элемента DOM, который содержит форму. Значение было слишком высоким и перекрывало результаты автозаполнения. Понижение моего обычаяz-index
исправило это для меня.Если вы хотите выбрать сущность, то есть более простой способ сделать это. Drupal 8 имеет стандартный тип поля entity_autocomplete, просто укажите свой элемент формы следующим образом:
См. Пользовательское поле автозаполнения для получения дополнительной информации.
Кроме того, никогда не выполняйте запросы базы данных к таблицам узлов / сущностей. Для этого используйте \ Drupal :: entityQuery ().
источник
:
Вам нужно изменить код в контроллере. Код ниже:
источник
Используйте код @vgoradiya, затем в цикле foreach попробуйте это так:
источник