См. основной материал для введения.
Контроллер должен вернуть Json набор пар значений value — label. Ранее в модуле мы уже объявили связь для маршрутизации с нашим контроллером в файле custom_blocks.routing.yml.
Теперь реализуем код.
/src/Controller/ProductSearchAutoCompleteController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?php namespace Drupal\custom_blocks\Controller; use Drupal\Core\Controller\ControllerBase; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Drupal\Component\Utility\Xss; use Drupal\Core\Entity\Element\EntityAutocomplete; /** * Defines a route controller for watches autocomplete form elements. */ class ProductSearchAutoCompleteController extends ControllerBase { /** * Handler for autocomplete request. */ public function handleAutocomplete(Request $request) { $results = []; $input = $request->query->get('q'); if (!$input) { return new JsonResponse($results); } $input = Xss::filter($input); // готовимся выбирать сущности вида commerce_product $query = \Drupal::entityQuery('commerce_product') ->accessCheck(false); // нужно добавить условие поиска с OR // для этого используем <em>orConditionGroup</em> $orGroup = $query->orConditionGroup() ->condition('title', $input, 'CONTAINS') // аналоги описаны в виде сущности paragraph, // и нас там интересует поле артикул ->condition('field_analogs.entity.field_artikul', $input, 'CONTAINS'); $ids = $query ->condition('status', 1) ->condition($orGroup) ->sort('title') ->execute(); $products = $ids ? \Drupal::entityTypeManager() ->getStorage('commerce_product')->loadMultiple($ids) : []; // формируем строки выпадающего списка // значений autocomplete foreach ($products as $product) { $results[] = [ 'value' => \Drupal\Core\Url::fromUri('internal:/product/' . $product->id())->toString(), 'label' => $product->getTitle(), ]; } return new JsonResponse($results); } } |