पाठ-क्षेत्र के लिए स्वतः पूर्ण जोड़ना


10

मैंने अपने कस्टम मॉड्यूल में ड्रुपल 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.rout.yml भी बनाया

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

अभी भी स्वत: पूर्ण कार्यक्षमता लागू नहीं हो रही है? क्या कोई मुझे बता सकता है कि मैं क्या याद कर रहा हूँ ??


आपको पैरामीटर भी पास करने की आवश्यकता है drupal.org/node/2070985
श्रेया शेट्टी

1
@ShreyaShetty नहीं मुझे d7 में मापदंडों की आवश्यकता नहीं है क्योंकि मैंने '#autocomplete_path' => 'mymodule / स्वतः पूर्ण' का उपयोग किया होगा, इसलिए d8 में मैंने '#autocomplete_route_name' => 'mymodule.autocomplete' का उपयोग किया है, इसलिए मैंने कभी भी पैरामीटर का उपयोग नहीं किया है न ही मुझे एक की जरूरत है ....
मेक-मी-ज़िंदा

जवाबों:


10

आपकी कक्षा को कुछ संशोधन की आवश्यकता है जिसे आपको अनुरोध की जांच करने और $ स्ट्रिंग में डालने की आवश्यकता है।

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

यह अभी भी एक अनुरोध लाने और $ स्ट्रिंग में रखने के बाद काम नहीं करता है
मेक-मी-ज़िंदा

क्या आपने चेक किया कि आपका अनुरोध प्रिंट था?
वोरगोडिया

मुझे लगता है कि \Drupal::entityQuery('node')चयन के अलावा उपयोग करना बेहतर होगा।
भगोरिया

मेरे ब्राउज़र के उपकरण में नेटवर्क टैब देखने के बाद, मैं प्रतिक्रिया में उचित परिणाम देख सकता था, लेकिन उन्हें UI में नहीं दिखाया जा रहा था। कुछ खोदने के बाद, मैंने पाया कि मेरे पास z-indexDOM तत्व पर कुछ कस्टम css सेटिंग है, जिसमें फ़ॉर्म शामिल था। मान बहुत अधिक था और स्वत: पूर्ण परिणामों को ओवरलैप कर रहा था। मेरे रिवाज को कम करके मेरे z-indexलिए इसे तय किया।
tyler.frankenstein

11

यदि आप एक इकाई का चयन करना चाहते हैं, तो ऐसा करने का एक आसान तरीका है। Drupal 8 में एक मानक एंटिटी_ऑटोकॉमल फील्ड प्रकार है, बस अपने फॉर्म एलिमेंट को इस तरह निर्दिष्ट करें:

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

देखें कस्टम स्वत: पूर्ण क्षेत्र में अधिक जानकारी के लिए।

इसके अलावा, नोड / एंटिटी टेबल के खिलाफ डेटाबेस क्वेरी कभी न करें। उसके लिए \ Drupal :: unitQuery () का उपयोग करें।


हाय बर्दिर, मेरे मामले में "शहर" से टैक्सोनॉमी का डेटा कैसे प्राप्त करें उपरोक्त कोड का उपयोग करते हुए क्योंकि यह नोड के लिए पूरी तरह से ठीक काम कर रहा है लेकिन टैक्सनॉमी के लिए नहीं ??
सचिन

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

हाय श्रेया, मैंने आपके समाधान का उपयोग किया, लेकिन फॉर्म में जाने के बजाय यह मुझे इस तरह ओ / पी दे रहा है: [{"मूल्य": "1", "लेबल": "पटेल रेजीडेंसी"}, {"मूल्य": " 2 "," लेबल ":" जैन प्लाजा "}, {" मूल्य ":" 3 "," लेबल ":" कान्हा रिज़ॉर्ट "}, {" मूल्य ":" 38 "," लेबल ":" हीरा रेजीडेंसी "} ]। मैं चाहता हूं कि यह फॉर्म को मिला और क्षेत्र को स्वतः पूर्ण के रूप में काम करना चाहिए
सचिन

2

@Vgoradiya कोड का उपयोग तब फ़ॉरेस्ट लूप पर इस तरह करें:

    foreach ($result as $row)
    {
        $matches[] = ['value' => $row->nid, 'label' => check_plain($row->title)];
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.