我正在TYPO3版本8中进行定制扩展。
在我的扩展中,我希望以至少十个左右的结果集中的随机顺序在前端显示三个项目。
作为示例(随机选择三个人并将其传递给视图)
我的第一个问题是查看QueryBuilder并创建自定义查询。看看其他类似帖子,看起来extbase的查询构建器没有RAND函数(有充分的理由)。
看看使用Fluid和iterator viewhelper帮助我以随机顺序显示项目会更好吗?或者可以使用QueryBuilder实现?
Extbase存储库查询没有任何随机函数。至少从TYPO3 8 LTS开始的新的Doctrine Querybuilder可用于获得随机结果:https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html
在此QueryBuilder上,您可以使用addSelectLiteral
将RAND()函数插入到数据库查询中。但您必须确保您的数据库软件支持此功能,因为TYPO3 DB可以连接到任何其他可能不支持RAND()的数据库软件。
用法示例:
$rows = $queryBuilder
->select('*')
->from('tx_yourext_domain_model_example')
->addSelectLiteral('RAND() AS randomnumber')
->orderBy('randomnumber')
->setMaxResults(3)
->execute()
->fetchAll();
要从结果创建一些Extbase Model Records,您可以使用DataMapper。
$dataMapper = GeneralUtility::makeInstance(TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class);
$result = $dataMapper->map(\You\Yourext\Model\Example::class, $rows);
我不认为在TYPO3,Fluid或QueryBuilder中有这样做的方法。我解决它的方式取决于总共有多少条记录。
如果它只是几十个我可能会选择它们并使用PHP shuffle
函数对它们进行随机排序然后显示前3个。
如果可以有数百个或更多的记录,我可能会计数并在0和计数结果之间得到3个随机数。然后,您可以使用setFirstResult
(随机数)和setMaxResults
(1)函数执行3个不同的查询。
我不在TYPO3v9中使用vhs。我使用秒和简单的数学来获得1个随机元素。例如,我从{news}数组中获取迭代器的随机值:
<f:variable name="sec4random" value="{f:format.date(date:'0 seconds', format:'s')}"/>
<f:variable name="count4random" value="{f:count(subject: news)}"/>
Random index for iterator: {sec4random % count4random}