เพิ่มการเติมข้อความอัตโนมัติสำหรับฟิลด์ข้อความ


10

ฉันพยายามใช้การเติมข้อความอัตโนมัติใน text-field สำหรับ drupal 8 ในโมดูลที่กำหนดเองของฉัน

ทั้งหมดที่ฉันต้องการคือการดึงข้อมูลและแสดงชื่อที่น่าจะเป็นที่ฉันพิมพ์ผ่านการเติมข้อความอัตโนมัติดังนั้นประกาศว่าการเติมข้อความอัตโนมัติของฟังก์ชั่นสาธารณะภายในชั้นเรียนใน DefaultController.php ในไดเรกทอรีโฟลเดอร์ -> 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);
    }
}

จากนั้นสร้าง EditForm.php ในไดเรกทอรีโฟลเดอร์ -> 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;
    }
}

ยังสร้าง mymodule.routing.yml

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

ฟังก์ชั่นเติมข้อความอัตโนมัติยังไม่ได้รับการติดตั้งใช้งานหรือไม่ ใครช่วยชี้ให้ฉันว่าฉันหายไปได้ไหม?


คุณต้องผ่านพารามิเตอร์ด้วยdrupal.org/node/2070985
Shreya Shetty

1
@ShreyaShetty ไม่ฉันไม่ต้องการพารามิเตอร์ตั้งแต่ใน d7 ฉันจะใช้ '#autocomplete_path' => 'mymodule / autocomplete' ดังนั้นใน d8 ฉันใช้ '#autocomplete_route_name' => 'mymodule.autoclete' ดังนั้นฉันจึงไม่เคยใช้พารามิเตอร์ ฉันไม่ต้องการมัน ....
ทำให้ฉันมีชีวิตอยู่

คำตอบ:


10

ชั้นเรียนของคุณต้องการการดัดแปลงบางอย่างที่คุณต้องตรวจสอบคำขอและใส่ลงใน $ 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);
  }
}

มันยังคงไม่ทำงานหลังจากดึงคำขอและวางลงใน $ string
ทำให้ฉันมีชีวิตอยู่

คุณตรวจสอบว่าคำขอของคุณถูกพิมพ์หรือไม่
vgoradiya

ฉันคิดว่า\Drupal::entityQuery('node')น่าจะใช้งานนอกเหนือจากการเลือก
vgoradiya

หลังจากดูแท็บเครือข่ายในเครื่องมือพัฒนาเบราว์เซอร์ของฉันฉันสามารถเห็นผลลัพธ์ที่เหมาะสมในการตอบสนอง แต่พวกเขาไม่ได้แสดงใน UI หลังจากการขุดผมพบว่าฉันมีการตั้งค่า CSS ที่กำหนดเองz-indexในองค์ประกอบ DOM ซึ่งมีรูปแบบ ค่าสูงเกินไปและทับซ้อนผลลัพธ์ที่เติมให้โดยอัตโนมัติ ลดการกำหนดเองของฉันz-indexแก้ไขให้ฉัน
tyler.frankenstein

11

หากคุณต้องการเลือกเอนทิตีคุณจะมีวิธีที่ง่ายกว่าในการทำเช่นนั้น Drupal 8 มีประเภทฟิลด์ entity_autocomplete มาตรฐานเพียงระบุองค์ประกอบแบบฟอร์มของคุณดังนี้:

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

ดูฟิลด์การเติมข้อความอัตโนมัติที่กำหนดเองสำหรับข้อมูลเพิ่มเติม

นอกจากนี้อย่าทำการสืบค้นฐานข้อมูลกับตารางโหนด / เอนทิตี ใช้ \ Drupal :: entityQuery () สำหรับสิ่งนั้น


สวัสดี Berdir, วิธีการรับข้อมูลจากอนุกรมวิธานในกรณีของฉัน "เมือง" โดยใช้รหัสข้างต้นเพราะมันทำงานได้อย่างสมบูรณ์แบบสำหรับโหนด แต่ไม่ใช่สำหรับอนุกรมวิธาน?
Sachin

5
  1. สร้างไฟล์ routing.yml และเพิ่มรหัสด้านล่าง: 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 ถูกต้อง

คุณต้องเปลี่ยนรหัสในคอนโทรลเลอร์รหัสด้านล่าง:

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

สวัสดี Shreya ฉันใช้โซลูชันของคุณ แต่แทนที่จะไปที่แบบฟอร์มให้ฉัน o / p เช่นนี้: [{"value": "1", "label": "Patel Residency"}, {"value": " 2 "," label ":" Jain Plaza "}, {" value ":" 3 "," label ":" Kanha Resort "}, {" value ":" 38 "," label ":" Hira Residency "} ] ฉันต้องการให้ข้ามไปที่แบบฟอร์มและฟิลด์ควรทำงานอัตโนมัติโดยอัตโนมัติ
Sachin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.