我尝试创建一个查询来获取所有新闻项目,这些新闻项目至少标记了两个不同的类别,并且必须与AND子句匹配。
如果应该呈现以下代码,我需要此查询来做出决定。例如。如果没有类别A和类别B的新闻项,则不执行任何操作。否则显示tx_news LIST视图。
lib.field_dmnewsplugin.5 = CONTENT
lib.field_dmnewsplugin.5 {
table = tx_news_domain_model_news
select {
pidInList = 124
max = 9
orderBy = uid DESC
leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid)
#andWhere = sys_category_record_mm.uid_local IN (14,16)
#where = sys_category_record_mm.uid_local = 14
andWhere = sys_category_record_mm.uid_local = 14 AND sys_category_record_mm.uid_local = 16
}
renderObj = COA
renderObj {
1 = TEXT
1.value = Aktuelles
1.wrap = <h2>|</h2>
2 = TEXT
2.field = title
2.crop = 50|...|1
2.wrap = <h3>|</h3>
3 = TEXT
3.field = teaser
3.crop = 500|...|1
3.wrap = <p>|</p>
}
}
我的代码是一些测试的结果。使用“andWhere”子句,结果为空。没有任何where子句,我得到所有新闻项的双重条目,因为它们都至少有两个不同的类别。我的目标是为每个新闻项目获得独特的结果,标记为类别A和类别B(并且可能作为其他类别的通用解决方案)。
我需要做什么?
先感谢您,
拉尔夫
尝试将WHERE子句放入JOIN的ON部分,并使用groupBy来获取计数器。
select {
selectFields = count(*) AS counter
leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN (14,16)
pidInList = 124
max = 9
groupBy = uid
orderBy = uid DESC
where = counter > 1
}
在我必须意识到,Jo的解决方案对我不起作用之后,我有了另一个想法:
lib.field_dmnewsplugin = COA
lib.field_dmnewsplugin {
10 = CONTENT
10 {
table = tx_news_domain_model_news
select {
selectFields = title, teaser, count(uid) AS counter
leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN ({14,###maincat###)
pidInList = 124
max = 1
groupBy = uid
orderBy = counter DESC, crdate DESC
#where = counter > 1
markers {
maincat.value = 16
}
}
renderObj = COA
renderObj {
10 = COA
10 {
stdWrap {
if {
value = 1
isGreaterThan.data = field:counter
#equals.data = field:counter
}
required = 1
wrap = <h2>Some Headline</h2>
}
10 = USER
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = News
pluginName = Pi1
vendorName = GeorgRinger
switchableControllerActions {
News {
1 = list
}
}
settings < plugin.tx_news.settings
settings {
cropMaxCharacters = 164 | [...] | 1
categoryConjunction = and
categories = 14,16
excludeAlreadyDisplayedNews = 1
archiveRestriction = active
[...]
问题是,我们不能在where子句中使用别名“counter”,我不知道如何用typoscript解决问题。使用本机SQL可能有更好的方法。
但我能够获得“计数器”的价值来创建“if”规则。另外,我可以通过“counter”对查询进行排序。因此,如果查询返回至少一个“counter”大于1的匹配,我可以决定使用标题呈现COA-Object,就像新闻列表视图一样。
我对这个解决方案很满意。但也许,有人对我有特别的伎俩吗?
谢谢你的帮助,
拉尔夫