লিঙ্ক উইজেট স্বয়ংক্রিয়ভাবে সম্পূর্ণ 10 টিরও বেশি আইটেম কীভাবে প্রদর্শন করবেন?


10

এটি লিংক মডিউল সম্পর্কে একটি প্রশ্ন। যেহেতু লিংক মডিউলটি দিয়ে আপনি বাহ্যিক বা অভ্যন্তরীণ লিঙ্ক উভয় প্রবেশ করতে পারেন, আমরা দৃ .়ভাবে এটির উপর নির্ভর করি।

দুর্ভাগ্যক্রমে এর স্বতঃপূর্ণ ক্ষেত্র থেকে প্রদর্শিত আইটেমের সংখ্যা 10 এর মধ্যে সীমাবদ্ধ We আমাদের কাছে প্রায় অভিন্ন শিরোনাম সহ প্রচুর নোড রয়েছে এবং তাই এটি আসে যে আমরা যে নোডটি অনুসন্ধান করছি সেগুলি স্বয়ংক্রিয়ভাবে সম্পূর্ণ ক্ষেত্রে প্রদর্শিত হবে না যখন সেখানে রয়েছে 10 টিরও বেশি মিলের শিরোনাম।

সীমাটি হার্ডকোডযুক্ত core/lib/Drupal/Core/Entity/EntityAutocompleteMatcher.php। একটি কাস্টম মডিউল থেকে এই সামান্য সংখ্যা বাড়ানোর জন্য কি কোনও দুর্দান্ত উপায় আছে? আমার কি বাড়াতে হবে class EntityAutocompleteMatcher? আমার এক্সটেনশনটি কোথায় রাখব এবং কীভাবে লিঙ্ক উইজেটের মধ্যে থেকে এটি কার্যকর করা হবে তা নিশ্চিত করতে হবে?

উত্তর:



10

আপনি যদি স্বতঃপূর্ব সীমাবদ্ধতার সমস্ত ওভাররাইড করে বেঁচে থাকতে পারেন তবে আপনি ড্রপাল 8 এ একটি মূল পরিষেবা ওভাররাইড করতে পারেন ;

আপনার যে পরিষেবাটি ওভাররাইড করতে হবে তা এখানে ਕੋਰ.সার্ভিসেস.আইএমএলে রয়েছে:

  entity.autocomplete_matcher:
    class: Drupal\Core\Entity\EntityAutocompleteMatcher
    arguments: ['@plugin.manager.entity_reference_selection']

আপনার কাস্টম মডিউলে, একটি শ্রেণি যুক্ত করুন যা সার্ভিসমিডিফায়ার ইন্টারফেস প্রয়োগ করে

namespace Drupal\mymodule;

use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\DependencyInjection\ServiceModifierInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;

class MyModuleServiceProvider implements ServiceModifierInterface {

  /**
   * Modifies existing service definitions.
   *
   * @param ContainerBuilder $container
   *   The ContainerBuilder whose service definitions can be altered.
   */
  public function alter(ContainerBuilder $container) {

    for ($id = 'entity.autocomplete_matcher'; $container->hasAlias($id); $id = (string) $container->getAlias($id));
    $definition = $container->getDefinition($id);
    $definition->setClass('Drupal\mymodule\Entity\EntityAutocompleteMatcherCustom');
    $container->setDefinition($id, $definition);
  }

}

তারপরে আপনার মডিউলে /src/Entity/EntityAutocompleteMatcherCustom.php এ সত্ত্বাআউটোকম্পলিউম্যাটচার.এফপি অনুলিপি করুন

তারপরে হার্ডকডযুক্ত 10 থেকে 50 তে আপডেট করুন বা আপনি যে সীমাটি চান তা আপডেট করুন:

namespace Drupal\mymodule\Entity;

use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Tags;
use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface;
use Drupal\Core\Entity\EntityAutocompleteMatcher;

/**
 * Matcher class to get autocompletion results for entity reference.
 */
class EntityAutocompleteMatcherCustom extends EntityAutocompleteMatcher {

  /*
   * {@inheritdoc]
   */
  public function getMatches($target_type, $selection_handler, $selection_settings, $string = '') {

    $matches = array();

    $options = array(
      'target_type' => $target_type,
      'handler' => $selection_handler,
      'handler_settings' => $selection_settings,
    );
    $handler = $this->selectionManager->getInstance($options);

    if (isset($string)) {
      // Get an array of matching entities.
      $match_operator = !empty($selection_settings['match_operator']) ? $selection_settings['match_operator'] : 'CONTAINS';
      // Changing limit from 10 to 50.
      $entity_labels = $handler->getReferenceableEntities($string, $match_operator, 50);

      // Loop through the entities and convert them into autocomplete output.
      foreach ($entity_labels as $values) {
        foreach ($values as $entity_id => $label) {
          $key = "$label ($entity_id)";
          // Strip things like starting/trailing white spaces, line breaks and
          // tags.
          $key = preg_replace('/\s\s+/', ' ', str_replace("\n", '', trim(Html::decodeEntities(strip_tags($key)))));
          // Names containing commas or quotes must be wrapped in quotes.
          $key = Tags::encode($key);
          $matches[] = array('value' => $key, 'label' => $label);
        }
      }
    }

    return $matches;
  }

}

স্পষ্টতই ওভাররাইড মূল পরিষেবাগুলির কিছু ঝুঁকি রয়েছে তবে আপনি এটি করতে পারেন এটি দুর্দান্ত।

মূল পরিষেবাকে ওভাররাইড করার ঝুঁকিগুলি কী কী?

1) আপনি कोर আপডেট করার সময় আপনি আপডেটের সুবিধা হারাতে পারেন। যদি পরিষেবায় একটি গুরুতর সুরক্ষা সংশোধন করা হয়, এবং আপনার পরিবর্তিত অনুলিপিটিতে সুরক্ষা গর্ত রয়েছে, আপনি সেই কোডটি আপডেট করে সম্প্রদায়টি থেকে কোনও উপকার পাবেন না।

2) আপনি ইনস্টল করা অন্যান্য মডিউলগুলির মূল বৈশিষ্ট্যের সেটের সাথে মূল পরিষেবার সাথে নির্ভরতা থাকতে পারে। সুতরাং আসুন বলি যে অন্য মডিউলে এমন কিছু কোড রয়েছে যা ভঙ্গ হয়ে যাবে যদি স্ব-পরিপূরণ এন্ট্রিগুলির সংখ্যা 10 এর চেয়ে বেশি বা কম হয় তবে আপনি এটি সম্পর্কে জানতে পারবেন না যতক্ষণ না এটি আপনাকে প্রভাবিত করে।

3) এটি আপনার কোডবেস বজায় রাখা আরও শক্ত করে তোলে। আপনাকে মনে রাখতে হবে যে আপনি মূল দ্রুপাল ব্যবহার করছেন না, তবে একটি বর্ধিত সংস্করণ। আপনার বিকাশের পরে আপনার প্রকল্পে যোগ দেওয়া অন্যান্য বিকাশকারীদের কোনও পরিষেবা কেন মান-মানহীন আচরণ করছে তা নির্ধারণ করতে বেশ সময় থাকতে পারে time

এই হ্যাকিং কোর?

তুমি কিভাবে এটি দেখ তার উপর নির্ভর করে। এটি মূল মডিউল এবং কোড পরিবর্তন করে না। এটি কোনও প্যাচ তৈরি করে না এবং এটি প্রয়োগ করে এবং সুরকারের মতো প্যাকেজ ম্যানেজারের সাথে এটি ট্র্যাকও করে না। এটি আরও বেশি ওয়ান-অফ কাস্টমাইজেশন যা কোনও সাইটের মূল আচরণকে পরিবর্তিত করে, একটি আল্টর হুকের সাথে সমান। এটি আরও স্বয়ংসম্পূর্ণ যা একটি কোর হ্যাক, কারণ এটি আপনার সাইটে আপনার নিজস্ব কাস্টম মডিউলের মধ্যে। সুতরাং আসল পরিষেবাদির মূল আপডেটগুলি প্রভাবিত হবে না, ঠিক একইভাবে যেমন আপনি মূল পরিষেবা কোডটি প্যাচ করেছেন বা হ্যাক করেছেন।

তবে এতে হ্যাকিং কোরের মতো কিছু ঝুঁকি রয়েছে যা উপরে উল্লিখিত রয়েছে।

মূল প্রশ্নে, সমস্যাটি নোড শিরোনাম যথেষ্ট অনন্য নয়। ড্রপ ডাউনগুলিতে বিশ্বব্যাপী সীমা পরিবর্তন করা ছাড়া আরও ভাল সমাধান হ'ল স্বতন্ত্রতা সমস্যাটি সমাধান করা।

আমার পরামর্শটি হ'ল নতুন ক্ষেত্রের ফিল্ড_ডিসপ্লে_ টাইটেল যুক্ত করা এবং সেই পৃষ্ঠাটিতে ব্যবহার করা এবং যদি আপনার প্রয়োজন হয় তবে তালিকা পৃষ্ঠাগুলিতে যেখানে আপনার একটি সংক্ষিপ্ত শিরোনাম প্রয়োজন সেখানে ফিল্ড_টিজার_শ عنوان প্রয়োজন it তারপরে প্রকৃত শিরোনাম যা সত্তা রেফারেন্স নির্বাচন ড্রপডাউনটিতে টানা থাকে তা আপনার সম্পাদকদের জন্য দরকারী এবং অনন্য হতে পারে, যেমন "আমার নিবন্ধ (পৃষ্ঠা 1)" যদি সমস্যা হয় প্রতিটি পৃষ্ঠার একই শিরোনাম থাকে। তারপরে আপনাকে কোনও মূল পরিষেবা ওভাররাইড করতে হবে না।

আপনি যখন দ্রুপালকে নিয়ে কোনও সমস্যার মুখোমুখি হন, কমপক্ষে কাস্টম কোডের প্রয়োজনীয় সমাধানটি সন্ধান করার চেষ্টা করুন। এটি আপনার সাইটকে আরও স্থিতিশীল করে তোলে, বজায় রাখা সহজ এবং আপনার সময় সাশ্রয় করে।


3
মূলত একটি মূল পরিষেবাকে ওভাররাইড করাতে ALTER হুক প্রয়োগ করার মতোই একই প্রভাব রয়েছে। ঝুঁকিগুলি সংঘটিত হয় তবে সেগুলি বেশ সামান্য এবং সঠিক কোড ডকুমেন্টেশনের মাধ্যমে হ্রাস করা যায়।
ya.teck

1
এই জাতীয় সংখ্যক ওভাররাইড, হুকস, প্যাচগুলির কারণে সংখ্যক প্রকল্পের রক্ষণাবেক্ষণযোগ্যতা হ্রাস করতে পারে।
ya.teck

এটি আমার কাছে [পরিষেবা ডেকরেটার ] ( ব্লুওকিনট্রেটিভ . com / blog/ service-decorators- drupal-8 ) এর জন্য নিখুঁত ব্যবহারের ক্ষেত্রে বলে মনে হচ্ছে ।
বউ

7

আমি মনে করি অ্যান্টিটি আউটোক্রেডম্যাচার আপনার সাইটে থাকা সমস্ত স্বয়ত্তর ফর্ম উপাদানগুলিকে প্রভাবিত করবে। যাতে আমি পরিবর্তে একটি নতুন সত্তা নির্বাচন প্লাগইন তৈরি করব কারণ এটি আরও দানাদার পদ্ধতির। প্লাগইন প্রতি ক্ষেত্র সক্ষম করা যেতে পারে। এই জাতীয় প্লাগইনের একটি উদাহরণ এখানে। https://drupal.stackexchange.com/a/220136/433

আপনার ক্ষেত্রে বাস্তবায়ন আরও তুচ্ছ হবে:

ফাইল: মডিউল / উদাহরণ / এসসিআর / প্লাগইন / সত্তা রেফারেন্সেসিলেশন / উদাহরণস্লেশন.পিপি

namespace Drupal\example\Plugin\EntityReferenceSelection;

use Drupal\node\Plugin\EntityReferenceSelection\NodeSelection;

/**
 * Entity reference selection.
 *
 * @EntityReferenceSelection(
 *   id = "example:node",
 *   label = @Translation("Example node"),
 *   group = "example",
 * )
 */
class ExampleSelection extends NodeSelection {

  /**
   * {@inheritdoc}
   */
  public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
   return parent::getReferenceableEntities($match, $match_operator, 25);
  }

}

ডিফল্ট নির্বাচনের পরিবর্তে নোডস্লেচশন বেস শ্রেণি হিসাবে ব্যবহার করা আপনাকে তাদের স্থিতি অনুসারে রেফারেন্সিং নোডগুলি ফিল্টার করতে দেয়। নোট করুন যে অন্যান্য সত্তার প্রকারগুলি উল্লেখ করা এখনও সমর্থিত নয়

সত্তা রেফারেন্স লিংক উইজেটটি ব্যবহারকারীর ইন্টারফেসের মাধ্যমে নির্বাচন প্লাগইন নির্দিষ্ট করার অনুমতি দেয় না, সুতরাং আপনার এটিকে hook_field_widget_WIDGET_TYPE_form_alter () ব্যবহার করে প্রোগ্রামিকভাবে সেট করতে হবে ।

/**
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().
 */
function example_field_widget_link_default_form_alter(&$element, \Drupal\Core\Form\FormStateInterface $form_state, $context) {
  // Replace default selection handler to increase limit of displayed entities.
  $element['uri']['#selection_handler'] = 'example:node';
}

এটি গুরুত্বপূর্ণ যে প্লাগইন আইডিতে একটি সেমিকোলন রয়েছে।


4

ফলাফলের সংখ্যাটি সংশোধন করার অন্য একটি সহজ উপায় হ'ল ক্যোয়ারির সীমার মান পরিবর্তন করা:

/**
 * Implements hook_query_TAG_alter() for entity reference selection handlers.
 *
 * We like tho show always 30 results instead of the 10 definied in EntityAutocompleteMatcher::getMatches()
 */
function MODULE_query_entity_reference_alter(AlterableInterface $query) {
  $query->range(0, 30);
}

1

@ ওয়েরি, আমি আপনার পরামর্শটি স্রেফ কার্যকর করে এবং অন্য কোনও সমস্যা সমাধানের চেষ্টা করার এক দিনের সবচেয়ে ভাল সময় ব্যয় করে আমি তা করা এড়াতে চাই।

আপনার প্রস্তাবিত ক্যোয়ারী নোডগুলিতে অনুচ্ছেদগুলি লিঙ্ক করার সময় এনট্রি রেফারেন্সকেও প্রভাবিত করে। পরিবর্তনটি যুক্ত করার আগে আমি যে নোডটি নিয়েছিলাম সেটিতে 80+ অনুচ্ছেদের আইটেম ছিল। একবার যুক্ত হয়ে আমি নোড সংরক্ষণ করতে অক্ষম ছিল। পরিবর্তনটি অপসারণ / মন্তব্য করা সমস্যার সমাধান করেছে।

হালনাগাদ

রুট চেকটিতে $ ক্যোয়ারী-> রেঞ্জ () মোড়ানো আমার জন্য সমস্যাটি সমাধান করে উদাহরণস্বরূপ,

function mymodule_query_entity_reference_alter($query) {
  $routeMatch = \Drupal::routeMatch();
  if ($routeMatch->getRouteName() == 'system.entity_autocomplete') {
    $query->range(0, 20);
  }
}

0

এফডব্লিউআইডাব্লু, আপনি কেবলমাত্র "স্বয়ংক্রিয়রূপে" পরিবর্তে "নির্বাচন তালিকা" এ ক্ষেত্রের ফর্ম প্রদর্শন সেট করতে পারেন।

তারপরে, আপনি স্বল্প সুবিধাজনক বিন্যাসে সমস্ত বিকল্প পাবেন, তবে কোনও হ্যাকের প্রয়োজন নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.