Tüm otomatik tamamlama sınırlarını geçersiz kılarak yaşayabiliyorsanız , Drupal 8'de bir temel hizmeti geçersiz kılabilirsiniz ;
Geçersiz kılmanız gereken hizmet burada core.services.yml dosyasında bulunur:
entity.autocomplete_matcher:
class: Drupal\Core\Entity\EntityAutocompleteMatcher
arguments: ['@plugin.manager.entity_reference_selection']
Özel modülünüze ServiceModifierInterface uygulayan bir sınıf ekleyin
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);
}
}
Ardından EntityAutocompleteMatcher.php dosyasını /src/Entity/EntityAutocompleteMatcherCustom.php adresindeki modülünüze kopyalayın.
Ardından sabit kodlanmış 10'u 50'ye veya istediğiniz herhangi bir sınıra güncelleyin:
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;
}
}
Açıkçası, temel hizmetlerin geçersiz kılınmasının bazı riskleri vardır, ancak bunu yapabilmeniz harika.
Temel bir hizmeti geçersiz kılma riskleri nelerdir?
1) Çekirdeği güncellediğinizde güncellemelerin avantajlarını kaybedebilirsiniz. Hizmette kritik bir güvenlik düzeltmesi varsa ve değiştirilmiş kopyanızın güvenlik açığı varsa, bu kodu güncelleyen topluluktan yararlanamazsınız.
2) Taktığınız diğer modüller, orijinal özellik setiyle orijinal hizmete bağımlı olabilir. Diyelim ki, otomatik tamamlama girişlerinin sayısı 10'dan fazla veya daha azsa, başka bir modülde kırılacak bazı kodlar var, sizi etkileyene kadar bunu bilmeyeceksiniz.
3) Kod tabanınızın bakımını zorlaştırır. Çekirdek Drupal'ı değil, genişletilmiş bir sürümünü kullandığınızı hatırlamanız gerekir. Ayrıldıktan sonra projenize katılan diğer geliştiriciler, bir hizmetin neden standart dışı bir şekilde davrandığını anlamakta zorlanabilirler.
Bu korsanlık çekirdeği mi?
Ona nasıl baktığına bağlı. Çekirdek modüle girmiyor ve kodu değiştirmiyor. Bir yama oluşturmak ve uygulamak ve besteci gibi bir paket yöneticisi ile izlemek bile değildir. Bir ALTER kancasına benzer şekilde, sitelerin temel davranışını değiştiren tek seferlik bir özelleştirmeden daha fazlasıdır. Bir çekirdek kesmek daha bağımsızdır, çünkü sitenizdeki kendi özel modülünüzdedir. Bu nedenle, orijinal hizmet kodunda yapılan temel güncellemeler, orijinal hizmet kodunu yamaladığınız veya hacklediğiniz gibi etkilenmez.
Ancak, yukarıda belirtildiği gibi, korsanlık çekirdeği ile aynı risklerden bazılarına sahiptir.
Orijinal soruda, sorun düğüm başlıkları yeterince benzersiz değildi. Açılır kapanışlarda küresel olarak limiti değiştirmek dışında daha iyi bir çözüm, teklik sorununu çözmek olacaktır.
Ne öneririm yeni bir alan field_display_title eklemek ve bunu sayfada kullanmak ve gerekirse başka bir alan field_teaser_title daha kısa bir başlık gereken liste sayfalarında görüntülemek için. Daha sonra varlık referansı seçme açılır menüsüne çekilen gerçek başlık, düzenleyicileriniz için yararlı olabilir ve her sayfada aynı başlık varsa "Makalem (sayfa 1)" gibi benzersiz olabilir. O zaman bir çekirdek hizmeti geçersiz kılmak zorunda kalmazsınız.
Drupal ile ilgili bir sorunla karşılaştığınızda, en az miktarda özel kod gerektiren çözümü bulmaya çalışın. Bu, sitenizi daha kararlı, bakımı daha kolay hale getirir ve size zaman kazandırır.