从数据库获取数据并将其传递给TYPO3 11.5中的模板

问题描述 投票:0回答:1

请帮助我。我需要显示搜索次数最多的 4 个单词的列表。我正在向表“index_stat_word”(indexed_search 扩展)发出查询请求。但结果是空的。

我的代码在这里:

  1. ext\my_site_package\Classes\Domain\Repository\MostSearchedRepository.php
<?php

declare(strict_types=1);

namespace Vendor\MySitePackage\Domain\Repository;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Utility\GeneralUtility;

final class MostSearchedRepository
{    
    private ConnectionPool $connectionPool;
    private const TABLE_NAME = 'index_stat_word';

    public function __construct(ConnectionPool $connectionPool)
    {
        $this->connectionPool = $connectionPool;
    }
    
    public function findMostUsedWords(int $limit = 4): array
    {
        $queryBuilder = $this->connectionPool
        ->getQueryBuilderForTable(self::TABLE_NAME);

        $queryBuilder->getRestrictions()
            ->removeAll()
            ->add(GeneralUtility::makeInstance(DeletedRestriction::class));

        $queryBuilder
            ->select('word', 'COUNT(word) AS word_count')
            ->from(self::TABLE_NAME)
            ->groupBy('word')
            ->orderBy('word_count', 'DESC')
            ->setMaxResults($limit);

        $query = $queryBuilder->executeQuery();       
        
        return $query->fetchAllAssociative();
    }
}
  1. ext\my_site_package\Classes\Controller\MostSearchedController.php
<?php

declare(strict_types=1);

namespace Vendor\MySitePackage\Controller;

use Vendor\MySitePackage\Domain\Repository\MostSearchedRepository;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;

class MostSearchedController extends ActionController
{
    protected MostSearchedRepository $mostSearchedRepository;

    public function __construct(MostSearchedRepository $mostSearchedRepository)
    {
        $this->mostSearchedRepository = $mostSearchedRepository;
    }

    /**
     * Action to display most searched words
     *
     * @param ViewInterface $view
     * @return void
     */
    public function showMostSearchedWordsAction(RenderingContextInterface $renderingContext)
    {
        $mostSearchedWords = $this->mostSearchedRepository->findMostUsedWords();

        $renderingContext->getVariableProvider()->add(
            'mostSearchedWords',
            $mostSearchedWords
        );
    }
}
?>
  1. ext\my_site_package\Resources\Private\Partials\IndexedSearch\Form.html
<ul class="popular-words">
   <f:for each="{mostPopularWords}" as="word">
       <li>{word.word} - {word.word_count}</li>
   </f:for>
</ul>

谢谢您的回答。

typo3 typo3-11.x
1个回答
0
投票

你的动作看起来很奇怪。试试这个:

public function showMostSearchedWordsAction(): ResponseInterface
{
    $this->view->assign(
        'mostSearchWords',
        $this->mostSearchedRepository->findMostUsedWords()
    );
    return $this->htmlResponse();
}
© www.soinside.com 2019 - 2024. All rights reserved.