我正在研究 TYPO3 版本 8 中的定制扩展。
在我的扩展中,我想在前端以随机顺序显示至少十个左右的结果集中的三个项目。
举个例子(随机只选择三个人,传递到一个视图(
我的第一个问题是查看QueryBuilder并创建自定义查询。查看其他类似的帖子,extbase 的查询构建器似乎没有携带 RAND 函数(有充分的理由(。
使用Fluid和迭代器视图助手来帮助我以随机顺序显示项目会更好吗?或者可以使用QueryBuilder来实现吗?
Extbase Repository Query 没有任何随机函数。至少自 TYPO3 8 LTS 以来的新 Doctrine Querybuilder 可用于获取随机结果:https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html
在此查询构建器上,您可以使用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 模型记录,可以使用 DataMapper。
$dataMapper = GeneralUtility::makeInstance(TYPO3CMSExtbasePersistenceGenericMapperDataMapper::class);
$result = $dataMapper->map(YouYourextModelExample::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}
要访问具有找到索引的 newsItem,您可以添加以下内容:
<f:variable name="newsindex" value="{sec4random % count4random}"/>
<f:variable name="newsItem" value="{news.{newsindex}}"/>
现在 {newsItem} 包含 {news} 数组中的随机单个新闻。