यदि आप सभी स्वत: पूर्ण सीमाओं को ओवरराइड करने के साथ रह सकते हैं, तो आप Drupal 8 में एक कोर सेवा को ओवरराइड कर सकते हैं ;
जिस सेवा को आपको ओवरराइड करने की आवश्यकता है वह यहाँ core.services.yml में है:
entity.autocomplete_matcher:
class: Drupal\Core\Entity\EntityAutocompleteMatcher
arguments: ['@plugin.manager.entity_reference_selection']
अपने कस्टम मॉड्यूल में, एक वर्ग जोड़ें जो ServiceModifierInterface को लागू करता है
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);
}
}
फिर EntityAutocompleteMatcher.php को अपने मॉड्यूल में /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) यह आपके कोडबेस को बनाए रखने के लिए कठिन बनाता है। आपको यह याद रखना होगा कि आप कोर ड्रुपल का उपयोग नहीं कर रहे हैं, बल्कि एक विस्तारित संस्करण है। अन्य डेवलपर्स जो आपके जाने के बाद आपकी परियोजना में शामिल होते हैं, उन्हें यह पता लगाने में मुश्किल समय हो सकता है कि कोई सेवा गैर-मानक तरीके से व्यवहार क्यों कर रही है।
क्या यह हैकिंग कोर है?
निर्भर करता है कि आप इसे कैसे देखते हैं। यह कोर मॉड्यूल और बदलते कोड में नहीं जा रहा है। यह एक पैच भी नहीं बना रहा है और इसे लागू कर रहा है और संगीतकार जैसे पैकेज मैनेजर के साथ इसे ट्रैक कर रहा है। यह एक एकल-बंद अनुकूलन से अधिक है जो एक साइट के मूल व्यवहार को बदल देता है, जो एक ALTER हुक के समान है। यह अधिक आत्म-निहित है कि एक कोर हैक, क्योंकि यह आपकी साइट पर अपने स्वयं के कस्टम मॉड्यूल के भीतर है। तो मूल सेवा के लिए कोर अपडेट प्रभावित नहीं होगा, उसी तरह जैसे कि आपने मूल सेवा कोड को पैच या हैक किया था।
लेकिन इसमें हैकिंग कोर के समान कुछ जोखिम हैं, जैसा कि ऊपर बताया गया है।
मूल प्रश्न में, मुद्दा यह था कि नोड टाइटल्स अद्वितीय नहीं हैं। ड्रॉप डाउन पर विश्व स्तर पर सीमा को बदलने के अलावा, बेहतर समाधान, विशिष्टता समस्या का समाधान होगा।
मेरा सुझाव है कि एक नया फ़ील्ड field_display_title जोड़ना और पृष्ठ पर उस का उपयोग करना है, और यदि आपको सूची पृष्ठों पर प्रदर्शन के लिए किसी अन्य फ़ील्ड field_teaser_title की आवश्यकता है, जहां आपको एक छोटे शीर्षक की आवश्यकता है। तब वास्तविक शीर्षक जो इकाई संदर्भ में चयनित हो जाता है ड्रॉपडाउन आपके संपादकों के लिए उपयोगी हो सकता है और अद्वितीय हो सकता है, जैसे कि "मेरा आलेख (पृष्ठ 1)" यदि समस्या प्रत्येक पृष्ठ का समान शीर्षक है। फिर आपको एक कोर सेवा को ओवरराइड नहीं करना है।
जब आप ड्रुपल के साथ कोई समस्या लेते हैं, तो उस समाधान को खोजने का प्रयास करें जिसके लिए कम से कम कस्टम कोड की आवश्यकता होती है। यह आपकी साइट को और अधिक स्थिर, आसान बनाए रखता है और आपको समय बचाता है।