Ich habe versucht, eine automatische Vervollständigung im Textfeld für Drupal 8 in meinem benutzerdefinierten Modul zu implementieren
Alles, was ich wollte, war, den wahrscheinlichen Titel abzurufen und anzuzeigen, den ich über Autocomplete eingegeben hatte, um eine öffentliche Funktion Autocomplete innerhalb einer Klasse in DefaultController.php im Ordnerverzeichnis -> mymodule / src / Controller / DefaultController.php zu deklarieren
<?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);
}
}
Dann erstellte ich eine EditForm.php im Ordnerverzeichnis -> 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;
}
}
hat auch mymodule.routing.yml erstellt
mymodule.autocomplete:
path: '/mymodule/autocomplete'
defaults:
_controller: '\Drupal\mymodule\Controller\DefaultController::autocomplete'
requirements:
_permission: 'access content'
Wird die Autocomplete-Funktionalität immer noch nicht implementiert? Kann mir jemand zeigen, was ich vermisse?
Antworten:
Ihre Klasse muss geändert werden. Sie müssen die Anforderung überprüfen und in $ string einfügen.
quelle
\Drupal::entityQuery('node')
wäre vorzuziehen, neben select zu verwenden.z-index
für ein DOM-Element hatte, das das Formular enthielt. Der Wert war zu hoch und überlappte die Ergebnisse der automatischen Vervollständigung. Das Absenken meines Brauchs hatz-index
es für mich behoben.Wenn Sie eine Entität auswählen möchten, gibt es eine einfachere Möglichkeit, dies zu tun. Drupal 8 hat einen Standardfeldtyp entity_autocomplete. Geben Sie einfach Ihr Formularelement wie folgt an:
Sehen Sie die automatische Vervollständigung für benutzerdefiniertes Feld für weitere Informationen.
Führen Sie außerdem niemals Datenbankabfragen für Knoten- / Entitätstabellen durch. Verwenden Sie dazu \ Drupal :: entityQuery ().
quelle
::
Sie müssen den Code in der Steuerung ändern. Der Code ist unten:
quelle
Verwenden Sie den @ vgoradiya-Code und versuchen Sie es in der foreach-Schleife folgendermaßen:
quelle