Metin alanı için otomatik tamamlama ekleme


10

Özel modülümde drupal 8 için metin alanına otomatik tamamlama uygulamaya çalıştım

tüm istediğim almak ve otomatik tamamlama ile yazılan olası başlığı görüntülemek oldu, bu yüzden klasör dizininde DefaultController.php bir sınıf içinde bir ortak işlev autocomplete ilan -> 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);
    }
}

daha sonra klasör dizininde bir EditForm.php oluşturdu -> 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;
    }
}

Ayrıca mymodule.routing.yml oluşturdu

  mymodule.autocomplete:
  path: '/mymodule/autocomplete'
  defaults:
    _controller: '\Drupal\mymodule\Controller\DefaultController::autocomplete'
  requirements:
    _permission: 'access content'

hala otomatik tamamlama işlevi uygulanmıyor? Biri bana neyi eksik olduğumu gösterebilir mi?


parametreleri de geçmeniz gerekiyor. drupal.org/node/2070985
Shreya Shetty

1
@ShreyaShetty Hayır d7'de '#autocomplete_path' => 'mymodule / autocomplete' kullanacağım için parametrelere ihtiyacım yok, bu yüzden d8'de '#autocomplete_route_name' => 'mymodule.autocomplete' kullandım, bu yüzden hiç parametre kullanmadım ne de .... ben tek gerekiyor
makyaj me-diri

Yanıtlar:


10

Sınıfınızın, isteği kontrol etmeniz ve $ string'e koymanız gereken bazı değişikliklere ihtiyacı var.

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

Hala bir istek getiriliyor ve $ dizeye yerleştirdikten sonra işe yaramadı
makyaj me-diri

isteğinizin yazdırıldığını kontrol ettiniz mi?
vgoradiya

Bence \Drupal::entityQuery('node')seçim dışında kullanmak tercih edilir.
vgoradiya

Tarayıcımın geliştirici araçlarındaki Ağ sekmesini izledikten sonra, yanıtta doğru sonuçları görebiliyordum, ancak kullanıcı arayüzünde gösterilmiyorlardı. Bazı kazma sonra z-index, form içeren bir DOM öğesinde bazı özel css ayarı buldum bulundu . Değer çok yüksekti ve otomatik tamamlama sonuçlarıyla çakışıyordu. Özelliğimi düşürmek benim z-indexiçin düzeltti.
tyler.frankenstein

11

Bir varlık seçmek istiyorsanız, bunu yapmanın daha kolay bir yolu vardır. Drupal 8'in standart bir entity_autocomplete alan türü vardır, form öğenizi şu şekilde belirtmeniz yeterlidir:

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

Daha fazla bilgi için Özel otomatik tamamlama alanına bakın .

Ayrıca, hiçbir zaman düğüm / varlık tablolarına karşı veritabanı sorguları yapmayın. Bunun için \ Drupal :: entityQuery () kullanın.


Merhaba Berdir, Nasıl benim durumumda "şehir" taksanomiden veri almak için yukarıdaki kodu kullanarak mükemmel bir düğüm için çalışıyor ama taksan için değil ??
Sachin

5
  1. Bir routing.yml dosyası oluşturun ve aşağıdaki kodu ekleyin: admin_example.autocomplete:

:

  path: '/admin_example/autocomplete'
  defaults:
    _controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
  requirements:
    _permission: 'access content'
  1. Mymodule / src / Form / EditForm.php dosyasında oluşturduğunuz form doğrudur

Denetleyicideki kodu değiştirmeniz gerekir. Kod aşağıdadır:

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

Merhaba Shreya, çözümünüzü kullandım ama forma gitmek yerine bana şu şekilde veriyor: [{"value": "1", "label": "Patel Residency"}, {"value": " 2 "," etiket ":" Jain Plaza "}, {" değer ":" 3 "," etiket ":" Kanha Resort "}, {" değer ":" 38 "," etiket ":" Hira Residency "} ]. Formu doldurmasını istiyorum ve alan otomatik tamamlama olarak çalışmalı
Sachin

2

@Vgoradiya kodunu kullanın ve foreach döngüsünde şu şekilde deneyin:

    foreach ($result as $row)
    {
        $matches[] = ['value' => $row->nid, 'label' => check_plain($row->title)];
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.