Есть вьюшка которая ищет проиндексированные поля entity по контекстным фильтрам. Добавил кастомный блок к вьюшке вот таким образом:
{{ drupal_block('result_entity_product_categories', {arguments}) }}
Данный блок отображает категории что соответствуют введенному слову в поиске. Если введено то для чего нет результатов поиска, например bbbbb, нужно отображать вот такое:
Sorry
No results for: "bbbbb"
But here are some of our most popular products
Код метода build() кастомного блока:
<?php
public function build() {
$configuration = $this->getConfiguration();
$term = $configuration['arguments']['0'] ?: '';
if (empty(
$term)) {
return '';
}
$index = $this->entityTypeManager->getStorage('search_api_index')->load('entity_product_index');
$parse_mode = $this->parseModeManager->createInstance('terms');
$parse_mode->setConjunction('AND');
$search_query = $index->query();
$search_query->setParseMode($parse_mode)
->keys($term);
$search_result = $search_query->execute();
$rows = [];
foreach ($search_result->getResultItems() as $item) {
if (($node = $item->getOriginalObject()->getEntity()) && ($node instanceof NodeInterface)) {
$categoryKey = $node->get('field_entity_product_category')->getString();
if ($categoryKey) {
++$rows[$categoryKey];
}
}
}
$build['container'] = [
'#type' => 'container',
'#attributes' => [
'class' => ['category-counter-wrapper'],
],
];
foreach (
$rows as $key => $count) {
if (
$node = $this->entityTypeManager->getStorage('node')->load($key)) {
$build['container'][$key] = [
'#type' => 'container',
'#attributes' => [
'class' => ['item'],
],
'label' => [
'#type' => 'container',
'#markup' => $node->getTitle(),
'#attributes' => [
'class' => ['label'],
],
],
'count' => [
'#type' => 'container',
'#markup' => $count,
'#attributes' => [
'class' => ['count'],
],
],
'link' => [
'#type' => 'link',
'#url' => Url::fromUserInput($node->get('field_custom_url')->getString(), ['query' => ['text' => $term]]),
'#attributes' => [
'class' => ['link'],
],
],
];
}
}
return
$build;
}
?>
Комментарии
А чем не устраивает встроенная функциональность Views "No results behavior"?
Потому-что popup окно результатов состоит из двух частей: слева категории соответствующие результатам поиска, а справа продукты соответствующие результатам поиска. Тоесть разные
<div>
с разными стилями.В "No results behavior" главной вьюшкии добавлена другая вьюшка c названием "No products search results view" которая в правой части окна в случае неудачного поиска показывает популярные продукты.
Кроме того после текста
нужно посдавлять слово которое было введено в поисковый инпут.
Поэтому вывод этого текста следует реализовать именно в кастомном блоке.
Я как-то не совсем понял, в чём тут затруднение. Ну добавьте в
::build()
условие - типа есть результаты или же нет их и в зависимости от этого меняйте ввод. Например, как-то так:<?php
...
if (count($rows)) {
foreach ($rows as $key => $count) {
// Тело цикла как сейчас.
...
}
}
else {
// Сообщение при отсутствии результатов.
$build['container'] = [
'#type' => 'container',
'#markup' => ' Sorry. No results for: ...', // Выводим что нужно.
];
}
...
?>
Не?