我有一个关于许多TYPO3扩展的问题,即使用来自后端flexform插件设置的Uid对查询结果进行排序。我尝试创建一个查询,以使结果Uid按与Plugin设置的flexform相同的顺序排列。就像我选择数据.uid为5、7和3一样,我的查询结果会按照这个顺序给我这些Uid。
例如:
站点信息:
- PHP 7.0 - TYPO3 8.7 - mariadb:10.1 - Debian服务器
此功能从控制器中调用。
在这里调用了一个名为"orderByField"的函数,它设置了所有排序方式。
TYPO3使用``来转义uid,例如:
如果我们在uid=3周围没有使用这些“`”符号进行调用,则会出现以下情况。
例如:
站点信息:
- PHP 7.0 - TYPO3 8.7 - mariadb:10.1 - Debian服务器
此功能从控制器中调用。
$partners = $this->partnerRepository->findByUids($this->settings['showMainSponsor']);
在$this->settings['showMainSponsor']中的值为"3, 4, 1"。
这些是TYPO3插件设置中所选区域的Uid。
存储库函数"findByUids"如下所示。
public function findByUids($uids){
if(!isset($uids) || empty($uids)){
return NULL;
}
$uidListString = $uids;
if(!is_array($uids)){
$uidListString = explode(',', $uids);
}
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
//here i set the orderings
$orderings = $this->orderByField('uid', $uidListString);
$query->setOrderings($orderings);
$query->matching(
$query->logicalAnd(
$query->in('uid', $uidListString)
)
);
return $query->execute();
}
在这里调用了一个名为"orderByField"的函数,它设置了所有排序方式。
/**
* @param string $field
* @param array $values
*
* @return array
*/
protected function orderByField($field, $values) {
$orderings = array();
foreach ($values as $value) {
$orderings["$field={$value}"] = \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING;
}
return $orderings;
}
这种通过Flexform给定的uid列表对查询结果进行排序的方法适用于TYPO3 6.2和7.6。现在我尝试将此扩展附加到TYPO3 8.6项目中,但此方法不再起作用。我尝试调试它并查看查询。我发现了破坏此查询的原因。不起作用的查询如下:
SELECT `tx_partner_domain_model_partner`.* FROM `tx_partner_domain_model_partner` `tx_partner_domain_model_partner` WHERE (`tx_partner_domain_model_partner`.`uid` IN (3, 4, 1)) AND (`tx_partner_domain_model_partner`.`sys_language_uid` IN (0, -1)) AND ((`tx_partner_domain_model_partner`.`deleted` = 0) AND (`tx_partner_domain_model_partner`.`t3ver_state` <= 0) AND (`tx_partner_domain_model_partner`.`pid` <> -1) AND (`tx_partner_domain_model_partner`.`hidden` = 0) AND (`tx_partner_domain_model_partner`.`starttime` <= 1506603780) AND ((`tx_partner_domain_model_partner`.`endtime` = 0) OR (`tx_partner_domain_model_partner`.`endtime` > 1506603780))) ORDER BY `tx_partner_domain_model_partner`.`uid=3` DESC, `tx_partner_domain_model_partner`.`uid=4` DESC, `tx_partner_domain_model_partner`.`uid=1` DESC
我在我的数据库管理系统上尝试了这个操作,但失败了。原因是最后三个语句。
`tx_partner_domain_model_partner`.`uid=3` DESC, `tx_partner_domain_model_partner`.`uid=4` DESC, `tx_partner_domain_model_partner`.`uid=1` DESC
TYPO3使用``来转义uid,例如:
`tx_partner_domain_model_partner`.`uid=4` DESC
如果我们在uid=3周围没有使用这些“`”符号进行调用,则会出现以下情况。
`tx_partner_domain_model_partner`.uid=3 DESC, `tx_partner_domain_model_partner`.uid=4 DESC, `tx_brapartner_domain_model_partner`.uid=1 DESC
它运行良好。也许安全原因是TYPO3在其最新版本上执行此操作的原因,但我找不到其他好的解决方案来处理这种基本情况。目前,我使用foreach遍历每个uid,并通过findByUid进行查询,但这似乎不是一种“最佳实践”的方式。是否有更干净的方式来获取数据库中的数据?或者这可能是一个错误吗?
希望有人能帮助我。
最好的问候
Fanor