Saya mencoba menerapkan pelengkapan otomatis di bidang teks untuk drupal 8 di modul khusus saya
semua yang saya inginkan adalah mengambil dan menampilkan judul yang mungkin saya ketik melalui autocomplete sehingga mendeklarasikan fungsi publik autocomplete dalam sebuah kelas di DefaultController.php dalam direktori folder -> 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);
}
}
kemudian membuat EditForm.php di direktori folder -> 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;
}
}
juga membuat mymodule.routing.yml
mymodule.autocomplete:
path: '/mymodule/autocomplete'
defaults:
_controller: '\Drupal\mymodule\Controller\DefaultController::autocomplete'
requirements:
_permission: 'access content'
masih fungsi autocomplete tidak diimplementasikan? Adakah yang bisa menunjukkan padaku apa yang hilang?
Jawaban:
Kelas Anda memerlukan beberapa modifikasi, Anda perlu memeriksa permintaan dan memasukkannya ke dalam $ string.
sumber
\Drupal::entityQuery('node')
akan lebih baik menggunakan selain pilih.z-index
pada elemen DOM yang berisi formulir. Nilainya terlalu tinggi dan tumpang tindih dengan hasil autocomplete. Menurunkan kebiasaan sayaz-index
memperbaikinya untuk saya.Jika Anda ingin memilih entitas, maka ada cara yang lebih mudah untuk melakukannya. Drupal 8 memiliki tipe bidang entitas_autocomplete standar, cukup tentukan elemen formulir Anda seperti ini:
Lihat bidang Pelengkapan otomatis khusus untuk informasi lebih lanjut.
Juga, jangan pernah melakukan query database terhadap tabel node / entitas. Gunakan \ Drupal :: entityQuery () untuk itu.
sumber
:
Anda perlu mengubah kode di controller. Kode di bawah ini:
sumber
Gunakan kode @vgoradiya kemudian di loop foreach coba dengan cara ini:
sumber