Menambahkan pelengkapan otomatis untuk bidang teks


10

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?


Anda perlu memberikan parameter juga drupal.org/node/2070985
Shreya Shetty

1
@ShreyaShetty Tidak, saya tidak perlu parameter karena di d7 saya akan menggunakan '#autocomplete_path' => 'mymodule / autocomplete', jadi di d8 saya menggunakan '#autocomplete_route_name' => 'mymodule.autocomplete', jadi saya tidak pernah menggunakan parameter saya juga tidak memerlukan satu ....
make-me-

Jawaban:


10

Kelas Anda memerlukan beberapa modifikasi, Anda perlu memeriksa permintaan dan memasukkannya ke dalam $ 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);
  }
}

itu masih TIDAK BEKERJA setelah mengambil permintaan dan memasukkannya ke dalam $ string
make-me-

Sudahkah Anda memeriksa apakah permintaan Anda sudah dicetak?
vgoradiya

Saya pikir \Drupal::entityQuery('node')akan lebih baik menggunakan selain pilih.
vgoradiya

Setelah menonton tab Network di alat dev browser saya, saya bisa melihat hasil yang tepat dalam respons, tetapi mereka tidak ditampilkan di UI. Setelah beberapa penggalian, saya menemukan saya memiliki beberapa pengaturan kustom css z-indexpada elemen DOM yang berisi formulir. Nilainya terlalu tinggi dan tumpang tindih dengan hasil autocomplete. Menurunkan kebiasaan saya z-indexmemperbaikinya untuk saya.
tyler.frankenstein

11

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:

$form['node'] = [
  '#type' => 'entity_autocomplete',
  '#target_type' => 'node',
];

Lihat bidang Pelengkapan otomatis khusus untuk informasi lebih lanjut.

Juga, jangan pernah melakukan query database terhadap tabel node / entitas. Gunakan \ Drupal :: entityQuery () untuk itu.


Hai Berdir, Bagaimana cara mendapatkan data dari taxanomy dalam "city" kasus saya menggunakan kode di atas karena berfungsi dengan baik untuk node tetapi tidak untuk taxanomy ??
Sachin

5
  1. Buat file routing.yml dan tambahkan kode di bawah ini: admin_example.autocomplete:

:

  path: '/admin_example/autocomplete'
  defaults:
    _controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
  requirements:
    _permission: 'access content'
  1. Formulir yang Anda buat di mymodule / src / Form / EditForm.php sudah benar

Anda perlu mengubah kode di controller. Kode di bawah ini:

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);
}

Hai Shreya, saya menggunakan solusi Anda tetapi alih-alih pergi ke bentuknya, ini memberi saya o / p seperti ini: [{"value": "1", "label": "Patel Residency"}, {"value": " 2 "," label ":" Jain Plaza "}, {" value ":" 3 "," label ":" Kanha Resort "}, {" value ":" 38 "," label ":" Hira Residency "} ] Saya ingin mengambil formulir dan lapangan harus berfungsi sebagai pelengkapan otomatis
Sachin

2

Gunakan kode @vgoradiya kemudian di loop foreach coba dengan cara ini:

    foreach ($result as $row)
    {
        $matches[] = ['value' => $row->nid, 'label' => check_plain($row->title)];
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.