পাঠ্য ক্ষেত্রের জন্য স্বতঃপূরণ যুক্ত করা হচ্ছে


10

আমি আমার কাস্টম মডিউলে ড্রুপাল 8 এর জন্য পাঠ্য ক্ষেত্রে একটি স্ব-অসম্পূর্ণ প্রয়োগ করার চেষ্টা করেছি

আমি যা চেয়েছিলাম তা হ'ল স্বয়ংক্রিয়রূপের মাধ্যমে টাইপ করা সম্ভাব্য শিরোনামটি প্রদর্শন করা এবং ফোল্ডার ডিরেক্টরিতে ডিফল্টকন্ট্রোলআরএফপি-র ক্লাসের মধ্যে একটি সার্বজনীন ফাংশন স্বতঃসম্পূর্ণ ঘোষণা করা -> মাইমডিউল / এসসিআর / কন্ট্রোলার / ডিফল্টকন্ট্রোলআরপিপি

<?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 তৈরি করেছেন -> মাইমডিউল / এসসিআর / ফর্ম / সম্পাদনাফর্ম.এফপি

<?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
শ্রেয়া শেঠি

1
@ শ্রেয়াশেটি না, আমার প্যারামিটারের দরকার নেই যেহেতু ডি 7-তে আমি '# অটোকম্পলিট_পথ' => 'মাইমডিউল / স্বতঃসীমা' ব্যবহার করতাম, তাই ডি 8-এ আমি '# অটোকম্পলিট_আউট_নেম' => 'মাইমডিউল.আউটোকম্পলিট' ব্যবহার করি না, তাই আমি কখনও প্যারামিটার ব্যবহার করি না না
আমার

উত্তর:


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

এটি এখনও কোনও অনুরোধ আনার পরে এটিকে $ স্ট্রিংয়ে রাখার পরে কাজ করেনি
me-

আপনি কি আপনার অনুরোধ মুদ্রণ ছিল পরীক্ষা করেছেন?
vgoradiya

আমি মনে করি \Drupal::entityQuery('node')সিলেক্ট বাদে ব্যবহার করা ভাল be
vgoradiya

আমার ব্রাউজারের ডেভ সরঞ্জামগুলিতে নেটওয়ার্ক ট্যাবটি দেখার পরে, আমি প্রতিক্রিয়ার যথাযথ ফলাফল দেখতে পেলাম, তবে সেগুলি ইউআইতে দেখানো হচ্ছে না। কিছু খনন করার পরে, আমি দেখতে পেলাম যে আমার কাছে একটি কাস্টম সিএসএস z-indexএকটি ডিওএম উপাদানটিতে একটি ফর্মটি রয়েছে যা সেট রয়েছে। মানটি খুব বেশি ছিল এবং স্ব-পরিপূর্ণ ফলাফলগুলি ওভারল্যাপ করছিল। আমার রীতিনীতি হ্রাস করা আমার z-indexজন্য এটি স্থির করে।
tyler.frankenstein

11

আপনি যদি কোনও সত্ত্বা নির্বাচন করতে চান, তবে এটি করার একটি উপায় সহজ উপায়। ড্রুপাল 8 এর একটি স্ট্যান্ডার্ড সত্তা_আউটোকম্পলিট ফিল্ড টাইপ রয়েছে, কেবল আপনার ফর্ম উপাদানটি নির্দিষ্ট করুন:

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

দেখুন কাস্টম স্বয়ংসম্পূর্ণ ক্ষেত্র আরও তথ্যের জন্য।

এছাড়াও, নোড / সত্তার টেবিলগুলির বিরুদ্ধে কখনই ডাটাবেস অনুসন্ধান করবেন না। তার জন্য \ দ্রুপাল :: এনটিকিউয়ারি () ব্যবহার করুন।


হাই বার্ডির, উপরের কোডটি ব্যবহার করে আমার ক্ষেত্রে "সিটি" ট্যাক্সনমি থেকে ডেটা পাবেন কীভাবে এটি নোডের জন্য পুরোপুরি সূক্ষ্মভাবে কাজ করছে তবে ট্যাক্সনোমির জন্য নয় ??
শচীন

5
  1. একটি রাউটিং.আইএমএল ফাইল তৈরি করুন এবং নীচের কোডটি যুক্ত করুন: অ্যাডমিন_সাম্পল.আউটোকম্পল:

:

  path: '/admin_example/autocomplete'
  defaults:
    _controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
  requirements:
    _permission: 'access content'
  1. আপনি যে ফর্মটি মাইমডিউল / এসসিআর / ফর্ম / এডিটফর্ম.এফপি তৈরি করেছেন তা সঠিক

আপনার নিয়ামক কোড পরিবর্তন করতে হবে। কোড নীচে:

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", "লেবেল": "প্যাটেল রেসিডেন্সি"}, value "মান": " 2 "," লেবেল ":" জেন প্লাজা "}, value" মান ":" 3 "," লেবেল ":" কানহা রিসর্ট "}, {" মান ":" 38 "," লেবেল ":" হিরা আবাস "} ]। আমি চাই যে এটি ফর্মের সাথে মিলিত হোক এবং মাঠটি
শচিন

2

@Vgoradiya কোড ব্যবহার করুন তারপরে ফরচ লুপ এ চেষ্টা করে দেখুন:

    foreach ($result as $row)
    {
        $matches[] = ['value' => $row->nid, 'label' => check_plain($row->title)];
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.