Как добавить к кастомному блоку текст о том что нет результатов поиска для такого-то введенного слова?

Главные вкладки

Аватар пользователя nathan158 nathan158 20 июля 2022 в 2:02

Есть вьюшка которая ищет проиндексированные поля 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;
  }
?>

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 20 июля 2022 в 19:27
1

Я как-то не совсем понял, в чём тут затруднение. Ну добавьте в ::build() условие - типа есть результаты или же нет их и в зависимости от этого меняйте ввод. Например, как-то так:

<?php
    
...
    if (
count($rows)) {
      foreach (
$rows as $key => $count) { 
        
// Тело цикла как сейчас.
        
...
      }
    }
    else {
      
// Сообщение при отсутствии результатов.
      
$build['container'] = [
        
'#type' => 'container',
        
'#markup' => ' Sorry. No results for: ...'// Выводим что нужно.
      
]; 
    }
    ...
?>

Не?

Комментарии

Аватар пользователя nathan158 nathan158 20 июля 2022 в 9:34

Потому-что popup окно результатов состоит из двух частей: слева категории соответствующие результатам поиска, а справа продукты соответствующие результатам поиска. Тоесть разные <div> с разными стилями.
В "No results behavior" главной вьюшкии добавлена другая вьюшка c названием "No products search results view" которая в правой части окна в случае неудачного поиска показывает популярные продукты.

Кроме того после текста

No results for:

нужно посдавлять слово которое было введено в поисковый инпут.
Поэтому вывод этого текста следует реализовать именно в кастомном блоке.

Аватар пользователя OldWarrior OldWarrior 20 июля 2022 в 19:27
1

Я как-то не совсем понял, в чём тут затруднение. Ну добавьте в ::build() условие - типа есть результаты или же нет их и в зависимости от этого меняйте ввод. Например, как-то так:

<?php
    
...
    if (
count($rows)) {
      foreach (
$rows as $key => $count) { 
        
// Тело цикла как сейчас.
        
...
      }
    }
    else {
      
// Сообщение при отсутствии результатов.
      
$build['container'] = [
        
'#type' => 'container',
        
'#markup' => ' Sorry. No results for: ...'// Выводим что нужно.
      
]; 
    }
    ...
?>

Не?