Backend의 flexform Plugin 설정에서 가져온 Uid로 쿼리 결과를 정렬하는 데 많은 TYPO3 확장에 문제가 있습니다. 나는 플렉스 폼이 플러그인 설정에서와 같은 순서로 결과 uid를주는 쿼리를 작성하려고한다. 내가 data.uid 5 7과 3을 선택하면 쿼리 결과가 나에게이 순서대로 표시됩니다.TYPO3 8.7 Flexform uid와의 쿼리 정렬
Siteinfo : 예를 들어
- PHP는 7.0
- 는 TYPO3 8.7
- mariadb : 10.1
- 데비안 서버는
이 기능은 컨트롤러에서 호출됩니다. $ this- 설정>
$partners = $this->partnerRepository->findByUids($this->settings['showMainSponsor']);
는 [ '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 목록으로 queryresult 주문의 이러한 방법은 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
내 DBMS에서이 작업을 시도했지만 실패했습니다. 이유는 마지막 3 문장입니다.
`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가 = 3 ...을 arround
`tx_partner_domain_model_partner`.uid=3 DESC, `tx_partner_domain_model_partner`.uid=4 DESC, `tx_brapartner_domain_model_partner`.uid=1 DESC
그것을 잘 작동
`tx_partner_domain_model_partner`.`uid=4` DESC
처럼``와 UID를 탈출 . 어쩌면 왜 TYPO3가 최신 버전에서이 작업을 수행하는지에 대한 보안상의 이유가 있지만이 기본적인 경우에는 다른 좋은 해결책을 찾지 못할 것입니다. 순간에 나는 findByUid에 의해 자신의 모든 uid를 쿼리하는 foreach를 얻었지만 이것은 "모범 사례"방법처럼 생각하지 않습니다. db에서 데이터를 가져 오는이 경우 더 깨끗한 방법이 있습니까? 아니면 이것이 버그일까요?
누군가가 나를 도울 수 있기를 바랍니다.
안부
Fanor
그는 이미 자신의 질문에이 솔루션을 언급. – Wolfgang
예, 맞습니다. 접근법이 나와 어떻게 생겨 났는지에 대한 질문 이었기 때문에 제자가 여기에서만 고용했기 때문일 것입니다. – episch