Подсветка результатов поиска при использовании Laravel Scout - PullRequest
0 голосов
/ 28 июня 2018

В моем приложении я использую Laravel Scout с TNTSearch Driver , чтобы создать панель поиска в навигации по моему сайту, которая связана с методом поиска.

Метод поиска выполняет поиск по множеству различных моделей и возвращает найденное в представление.

Вот метод:

/**
 * Perform a search given what the user entered into the search box.
 * Uses Laravel Scout to do initial search but because the use of WHERE is limited,
 * we use a filter function instead, on each collection.
 *
 * @param Request $request
 * @return void
 */
public function search(Request $request)
{
    // The search string entered
    $search = $request->get('q');

    // Laravel Scout search() method
    $users = User::search($search)->get();
    $articles = Article::search($search)->get();
    $events = Event::search($search)->get();
    $files = FileMetaData::search($search)->get();

    // The date and time as of right now
    $today = Carbon::now();

    /**
     * Below are the filters in place for each model search
     * 1. News articles must be open
     * 2. \Events are split into open and closed
     */
    $articles = $articles->filter(function ($articles) {
        return $articles->published === 'published';
    });

    $upcomingEvents = $events->filter(function ($events) use ($today) {
        return $events->startDate->gt($today);
    });

    $pastEvents = $events->filter(function ($events) use ($today) {
        return $events->startDate->lt($today);
    });

    $userCount = count($users);
    $articleCount = count($articles);
    $eventCount = count($events);
    $upcomingEventCount = count($upcomingEvents);
    $pastEventCount = count($pastEvents);
    $fileCount = count($files);

    return view('pages.search.index', compact('search', 'users', 'articles', 'upcomingEvents', 'pastEvents', 'userCount', 'articleCount', 'upcomingEventCount', 'pastEventCount', 'files', 'fileCount'));
}

Как видите, я использую функцию Scout search() для поиска в каждой модели, а затем накладываю некоторые дополнительные ограничения на результаты, прежде чем возвращать их в мое представление.

Сам вид

enter image description here

Мне бы хотелось, чтобы выделенный текст сверху также подсвечивал, где это уместно, сами результаты поиска, но я не могу найти ничего в документации об использовании класса TNT Highlighter с Laravel.

Просматривая форумы Laracasts, я нашел это: https://laracasts.com/discuss/channels/laravel/algolia-highlighting-in-laravel-53?page=1

Достопримечательности

<?php

use TeamTNT\TNTSearch\TNTSearch;

$articles = Article::search($searchString)->get();
$tnt = new TNTSearch;

$articles = $articles->map(function($article) use ($searchString, $tnt) {
    $article->title = $tnt->highlight($title, $searchString, 'em'),
});

В моем случае мне нужен этот фрагмент для каждого набора результатов?

Обновление:

$articles = Article::search($search)->get();

/**
     * Declaire where highlighting should occur for each collection
     */

    // Articles
    $articles = $articles->map(function($article) use ($search, $tnt){
        $article->title = $tnt->highlight($article->title, $search, b, [
            'simple' => false,
            'wholeWord' => false, 
            'tagOptions' => [
                'class' => 'search-term',
                'title' => 'test'
            ]
        ]);

        return $article;
    });

1 Ответ

0 голосов
/ 29 июня 2018

Я не знаком с подсветкой TNT, но если вы хотите попробовать свой собственный подход, вы можете использовать что-то вроде этого:

/**
* @$str = The string to highlight
* @$search_term = The term we are looking for in $str
**/
function highlightString($str, $search_term) {
    if (empty($search_term))
        return $str;

    $pos = strpos(strtolower($str), strtolower($search_term));

    if ($pos !== false) {
        $replaced = substr($str, 0, $pos);
        $replaced .= '<em>' . substr($str, $pos, strlen($search_term)) . '</em>';
        $replaced .= substr($str, $pos + strlen($search_term));
    } else {
        $replaced = $str;
    }

    return $replaced;
}

Только не забудьте стилизовать тег <em>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...