Thêm tự động hoàn thành cho trường văn bản


10

Tôi đã cố gắng thực hiện tự động hoàn thành trong trường văn bản cho drupal 8 trong mô-đun tùy chỉnh của mình

tất cả những gì tôi muốn là tìm nạp và hiển thị tiêu đề có khả năng tôi đã nhập thông qua tự động hoàn thành để khai báo chức năng tự động hoàn thành trong một lớp trong DefaultContoder.php trong thư mục thư mục -> mymodule / src / Controller / DefaultContoder.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);
    }
}

sau đó tạo một EditForm.php trong thư mục thư mục -> 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;
    }
}

cũng đã tạo mymodule.routing.yml

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

vẫn tự động hoàn thành chức năng không được thực hiện? Bất cứ ai có thể chỉ cho tôi những gì tôi đang thiếu ??


bạn cũng cần truyền tham số drupal.org/node/2070985
Shreya Shetty

1
@ShreyaShetty Không tôi không cần tham số vì trong d7 tôi đã sử dụng '#autocomplete_path' => 'mymodule / autocomplete', vì vậy, trong d8 tôi đã sử dụng '#autocomplete_route_name' => 'mymodule.autocomplete' tôi cũng không cần ....
làm cho tôi sống vào

Câu trả lời:


10

Lớp của bạn cần một số sửa đổi, bạn cần kiểm tra yêu cầu và đưa nó vào chuỗi $.

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

nó vẫn KHÔNG LÀM VIỆC sau khi tìm nạp một yêu cầu và đặt nó vào chuỗi $
làm cho tôi sống vào

bạn đã kiểm tra yêu cầu của bạn đã được in chưa?
vgoradiya

Tôi nghĩ rằng \Drupal::entityQuery('node')sẽ tốt hơn để sử dụng ngoài lựa chọn.
vgoradiya

Sau khi xem tab Mạng trong các công cụ phát triển của trình duyệt, tôi có thể thấy kết quả phù hợp trong phản hồi, nhưng chúng không được hiển thị trong Giao diện người dùng. Sau khi đào, tôi thấy tôi có một số css tùy chỉnh thiết lập một z-indexphần tử DOM có chứa biểu mẫu. Giá trị quá cao và chồng lấp kết quả tự động hoàn thành. Hạ tùy chỉnh của tôi z-indexcố định nó cho tôi.
tyler.frankenstein

11

Nếu bạn muốn chọn một thực thể, thì có một cách dễ dàng hơn để làm điều đó. Drupal 8 có loại trường entity_autocomplete tiêu chuẩn, chỉ cần xác định thành phần biểu mẫu của bạn như thế này:

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

Xem trường Tự động hoàn thành tùy chỉnh để biết thêm thông tin.

Ngoài ra, không bao giờ thực hiện các truy vấn cơ sở dữ liệu đối với các bảng nút / thực thể. Sử dụng \ Drupal :: entityQuery () cho điều đó.


Xin chào Berdir, Làm thế nào để lấy dữ liệu từ phân loại trong trường hợp "thành phố" của tôi bằng cách sử dụng mã ở trên vì nó hoạt động hoàn toàn tốt cho nút nhưng không phải cho phân loại ??
Sachin

5
  1. Tạo một tệp định tuyến.yml và thêm mã dưới đây: admin_example.autocomplete:

:

  path: '/admin_example/autocomplete'
  defaults:
    _controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
  requirements:
    _permission: 'access content'
  1. Biểu mẫu mà bạn đã xây dựng trong mymodule / src / Form / EditForm.php là chính xác

Bạn cần thay đổi mã trong bộ điều khiển. Đoạn mã dưới đây:

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

Xin chào Shreya, tôi đã sử dụng giải pháp của bạn nhưng thay vì đi đến biểu mẫu, nó sẽ cho tôi o / p như thế này: [{"value": "1", "nhãn": "Patel Residency"}, {"value": " 2 "," nhãn ":" Jain Plaza "}, {" value ":" 3 "," nhãn ":" Kanha Resort "}, {" value ":" 38 "," nhãn ":" Hira cư trú "} ]. Tôi muốn nó để lấy biểu mẫu và trường sẽ hoạt động như tự động hoàn tất
Sachin

2

Sử dụng mã @vgoradiya sau đó trên vòng lặp foreach thử theo cách này:

    foreach ($result as $row)
    {
        $matches[] = ['value' => $row->nid, 'label' => check_plain($row->title)];
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.