Nếu bạn có thể sống với việc ghi đè tất cả các giới hạn tự động hoàn thành, bạn có thể ghi đè một dịch vụ cốt lõi trong Drupal 8;
Dịch vụ bạn cần ghi đè có ở đây trong core.service.yml:
entity.autocomplete_matcher:
class: Drupal\Core\Entity\EntityAutocompleteMatcher
arguments: ['@plugin.manager.entity_reference_selection']
Trong mô-đun tùy chỉnh của bạn, thêm một lớp thực hiện 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);
}
}
Sau đó sao chép EntityAutocompleteMatcher.php vào mô-đun của bạn tại /src/Entity/EntityAutocompleteMatcherCustom.php
Sau đó cập nhật 10 mã hóa cứng thành 50 hoặc bất kỳ giới hạn nào bạn muốn:
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;
}
}
Rõ ràng việc ghi đè các dịch vụ cốt lõi có một số rủi ro, nhưng thật tuyệt khi bạn có thể làm điều này.
Những rủi ro của việc ghi đè một dịch vụ cốt lõi là gì?
1) Bạn có thể mất lợi ích của các cập nhật khi bạn cập nhật cốt lõi. Nếu có một sửa chữa bảo mật quan trọng trong dịch vụ và bản sao bị thay đổi của bạn có lỗ hổng bảo mật, bạn sẽ không được hưởng lợi từ cộng đồng cập nhật mã đó.
2) Các mô-đun khác mà bạn cài đặt có thể có các phụ thuộc vào dịch vụ ban đầu với bộ tính năng ban đầu. Vì vậy, giả sử có một số mã trong một mô-đun khác sẽ bị hỏng nếu số lượng mục nhập tự động hoàn thành lớn hơn hoặc ít hơn 10, bạn sẽ không biết về nó, cho đến khi nó ảnh hưởng đến bạn.
3) Nó làm cho cơ sở mã hóa của bạn khó bảo trì hơn. Bạn phải nhớ rằng bạn không sử dụng lõi Drupal, mà là phiên bản mở rộng. Các nhà phát triển khác tham gia dự án của bạn sau khi bạn rời đi có thể gặp khó khăn trong việc tìm hiểu lý do tại sao một dịch vụ hoạt động theo cách không chuẩn.
Đây có phải là hack cốt lõi?
Phụ thuộc vào cách bạn nhìn vào nó. Nó không đi vào mô-đun lõi và thay đổi mã. Nó thậm chí không tạo ra một bản vá và áp dụng nó và theo dõi nó với một trình quản lý gói như nhà soạn nhạc. Đây là một tùy chỉnh một lần duy nhất thay đổi hành vi cốt lõi của trang web, tương tự như móc ALTER. Nó độc lập hơn là một hack lõi, bởi vì nó nằm trong mô-đun tùy chỉnh của riêng bạn trên trang web của bạn. Vì vậy, các cập nhật cốt lõi cho dịch vụ gốc sẽ không bị ảnh hưởng, giống như khi bạn vá hoặc hack mã dịch vụ gốc.
Nhưng nó có một số rủi ro tương tự như hack lõi, như đã đề cập ở trên.
Trong câu hỏi ban đầu, vấn đề là các tiêu đề nút không đủ độc đáo. Giải pháp tốt hơn, ngoài việc thay đổi giới hạn trên toàn cầu khi thả xuống sẽ giải quyết được vấn đề duy nhất.
Những gì tôi muốn đề xuất là thêm một trường field_display_title mới và sử dụng trường đó trên trang và nếu bạn cần nó, một trường khác field_teaser_title để hiển thị trên các trang danh sách nơi bạn cần một tiêu đề ngắn hơn. Sau đó, tiêu đề thực tế được kéo vào tham chiếu thực thể chọn thả xuống có thể hữu ích cho các biên tập viên của bạn và là duy nhất, chẳng hạn như "Bài viết của tôi (trang 1)" nếu vấn đề là mỗi trang có cùng tiêu đề. Sau đó, bạn không phải ghi đè một dịch vụ cốt lõi.
Khi bạn gặp phải một vấn đề với Drupal, hãy thử tìm giải pháp yêu cầu số lượng mã tùy chỉnh ít nhất. Điều này làm cho trang web của bạn ổn định hơn, dễ bảo trì hơn và tiết kiệm thời gian của bạn.