我尝试从表sys_files中选择与类别或子类别链接的所有文件。
在我的示例中,文件的主要类别具有ID 1,并且其上有一些子类别。
我首先创建了SQL代码,直接在数据库上试用:
SELECT sys_file.name, sys_file.identifier, sys_category.title
FROM sys_category
RIGHT JOIN sys_file_metadata ON (sys_file_metadata.categories =
sys_category.uid)
JOIN sys_file ON (sys_file.uid = sys_file_metadata.file)
WHERE (sys_category.parent = 1) OR (sys_category.uid = 1)
order By sys_category.title
这可以正常工作。
现在,我尝试在typoscript中做类似的事情,这看起来像:
lib.documentindex = CONTENT
lib.documentindex {
wrap = <ul>|</ul>
table = sys_category
select {
selectFields = sys_file.name, sys_file.identifier, sys_category.title
rightjoin = sys_file_metadata ON (sys_file_metadata.categories = sys_category.uid) join sys_file ON (sys_file.uid = sys_file_metadata.file)
where = sys_category.uid = 1 OR sys_category.parent = 1
orderBy = sys_category.title
}
renderObj = COA
renderObj.wrap = <li>|</li>
renderObj.10 = TEXT
renderObj.10 {
field = identifier
wrap = <a href="|">
}
renderObj.20 = TEXT
renderObj.20.field = name
renderObj.30 = TEXT
renderObj.30.value = </a>
}
这不行。但真的很奇怪,它中途运作。 所以,如果我写下这样的地方:
where = sys_category.uid = 1 OR sys_category.parent = 1
显示所有具有父级为1的类别的文件。 但它不会显示id为1的类别的文件。
我现在写的就像
where = sys_category.parent = 1 OR sys_category.uid = 1
它反过来工作,它显示id为1的类别的文件。但是父ID不为1的文件。
在select(找到here)的官方文档中,它只是告诉where-option:
WHERE子句,不带“WHERE”字样。
但这不是全部。我尝试了很多东西,我尝试的一切都不像真正的SQL代码。我不知道这个错误的东西是不是有问题,或者我只是完全错了。
答案 0 :(得分:1)
我认为您的查询错误(即使是纯SQL)
类别永远不会(?)立即引用,但始终使用sys_category_record_mm
中的mm记录
因此,您的加入需要是另一个加入sys_category
并sys_file
通过这些mm记录(以及sys_file_metadata
记录)的加入:
SELECT sys_file.name, sys_file.identifier, sys_category.title
FROM sys_category
JOIN sys_category_record_mm
ON sys_category_record_mm.uid_local = sys_category.uid
JOIN sys_file_metadata
ON sys_file_metadata.uid = sys_category_record_mm.uid_foreign
JOIN sys_file
ON sys_file_metadata.file = sys_file.uid
WHERE sys_category_record_mm.tablenames = "sys_file_metadata"
AND sys_category_record_mm.fieldname = "categories"
AND ((sys_category.parent = 1) OR (sys_category.uid = 1))
ORDER By sys_category.title
请注意:分类记录中有类别字段,但这些字段只包含引用的计数器(由mm记录给出)。它不是一个类别的uid 如果您经常使用uid = 1的类别,可能会产生误导。
以下是实现此查询的typoscript:
编辑:包含TypoScript(由FuFu提供) 这个typoscript-select对我有用,但我不得不将类别从根目录移到第一页。
lib.documentindex = CONTENT
lib.documentindex {
wrap = <ul>|</ul>
table = sys_category
select {
pidInList = 1
recursive = 1000
selectFields = sys_file.name, sys_file.identifier, sys_category.title
join = sys_category_record_mm ON (sys_category_record_mm.uid_local = sys_category.uid) JOIN sys_file_metadata ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign) JOIN sys_file ON (sys_file_metadata.file = sys_file.uid)
where = (sys_category_record_mm.tablenames = "sys_file_metadata") AND (sys_category_record_mm.fieldname = "categories") AND ((sys_category.parent = 1) OR (sys_category.uid = 1))
orderBy = sys_category.title
}
renderObj = COA
renderObj.wrap = <li>|</li>
renderObj.10 = TEXT
renderObj.10 {
field = identifier
wrap = <a href="|">
}
renderObj.20 = TEXT
renderObj.20.field = name
renderObj.30 = TEXT
renderObj.30.value = </a>
}
作为
答案 1 :(得分:0)
您是否尝试使用DataProcessing?您可以组合两个DatabaseQueryProcessors来获得所需的内容。请参阅:https://docs.typo3.org/typo3cms/TyposcriptReference/7.6/ContentObjects/Fluidtemplate/Index.html#dataprocessing