TYPO3: Плагин внешнего интерфейса Фильтр / Поиск - PullRequest
4 голосов
/ 09 марта 2019

У меня проблема, я не могу найти документацию или решение.

Я создал расширение TYPO3 со списком и подробным представлением, все работает отлично. Теперь я хочу добавить несколько полей ввода над представлением списка, чтобы посетители сайта могли фильтровать представление списка.

Как это сделать? Я уверен, что мне нужно добавить форму жидкости над списком и обработать это в контроллере?

На данный момент мой контроллер и репо выглядит так:

Контроллер:

/**
 * EventController
 */
class EventController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{

    /**
     * eventRepository
     * 
     * @var \Alroma\DsEventcalendar\Domain\Repository\EventRepository
     * @inject
     */
    protected $eventRepository = null;

    /**
     * action list
     * 
     * @return void
     */
    public function listAction()
    {   
        $events = $this->eventRepository->findAll();
        $this->view->assign('events', $events);
    }

    /**
     * action show
     * 
     * @param \Alroma\DsEventcalendar\Domain\Model\Event $event
     * @return void
     */
    public function showAction(\Alroma\DsEventcalendar\Domain\Model\Event $event)
    {
        $this->view->assign('event', $event);
    }

    /**
     * action frontpage
     * 
     * @return void
     */
    public function frontpageAction()
    {
        $events = $this->eventRepository->findAll();
        $this->view->assign('events', $events);
    }
}

Repo:

class EventRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{

    // Order by BE sorting
    protected $defaultOrderings = [
    'highlight' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING,
    'start' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
];
}

Чтобы быть более конкретным: Я хочу, чтобы у пользователя было поле, он может ввести какое-то ключевое слово, и я хочу найти его в моей «текстовой» колонке базы данных моего расширения. Если в каком-либо тексте найдено ключевое слово, показывается только подходящая статья. То же самое для параметра даты.

Ответы [ 2 ]

3 голосов
/ 09 марта 2019

Самый простой способ фильтрации на стороне сервера:

  • создать форму с вводом для строки запроса для поиска
  • Получить аргумент в вашем контроллере
  • Отфильтруйте запрос в БД по $ query-> like

Некоторые примеры кода:

Форма с вводом для аргумента "строка запроса"

<f:form action="list">
  <f:form.textfield name="querystring" value="" />
</f:form>

Получите аргумент в вашем действии:

if ($this->request->hasArgument('querystring')) {
  $querystring = $this->request->getArgument('querystring');
  $events = $this->repository->findAll($querystring);
}

Отфильтруйте запрос к БД в своем хранилище (расширьте свой метод findAll или напишите новый метод):

public function findAll($querystring = '') {
    $query = $this->createQuery();
    if ($querystring) {
        $query->matching(
            $query->like('property_to_search_in', '%'.$querystring.'%')
        );
    }
    return $query->execute();
}
0 голосов
/ 09 марта 2019

Если это не слишком много контента, я бы предпочел выводить поисковые теги (data- атрибуты) для всего контента и использовать javascript для фильтрации.В противном случае вам потребуется перезагрузить страницу только для отображения подмножества контента, уже загруженного для клиента.Также не будет гладко.

...