TYPO3:前端插件过滤/搜索

5

我有一个问题,找不到任何文件或解决方案。

我创建了一个带有列表和详细视图的TYPO3扩展程序,一切正常。现在我想在列表视图上方添加一些输入字段,以便让站点访问者过滤列表视图。

要怎么做?我确定需要在列表视图上方添加一个Fluid表单,并在控制器中处理?

目前我的控制器和Repo如下:

控制器:

/**
 * 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);
    }
}

代码库:

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个回答

5

最基本的方法是使用服务器端过滤:

  • 创建一个包含用于搜索查询字符串的输入的表单
  • 在您的控制器中获取参数
  • 通过 $query->like 过滤您的数据库查询

一些代码示例:

带有参数“querystring”的输入表单

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

获取你的action中的参数:

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();
}

你让我的一天美好起来了!这正是我一直在寻找的。现在我可以添加多个过滤器和其他东西,只需要知道如何操作一次。非常感谢!! - Denis49

0
如果内容不太多的话,我宁愿为所有内容输出搜索标签(data-属性),然后使用JavaScript进行过滤。否则,您需要重新加载页面才能显示已经加载给客户端的内容子集。另外,这样不会感觉很流畅。

这是我最初考虑的,但是由于有很多对象,并且在控制器中使用流式分页和过滤器,只需要加载必要的内容。 - Denis49

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接