Typo3 - 内容 Select:呈现重复项

Typo3 - CONTENT Select: Render dupplicats

我尝试根据给定的类别列出所有 File-Records。 所以我在列出所有具有正确类别和 .

的文件时遇到了问题

现在我找到了问题 described here

简而言之: Typo3 保存已经渲染的记录并且不再渲染它以防止无限循环。但是我需要得到呈现的记录。

我的 Typo3 版本是 7.6.18。

我从这个工作代码开始,它只显示与类别 uid=1 及其子项有关系的所有文件(在我之前的 question-thread 中进一步描述):

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>

}

但是现在,我想按类别更加分组地显示它,例如:

Name Of Cat 1
 - File 1
 - File 2
Name Of Cat 2
- File 3

为此我改进了这样的代码:

lib.documentindex = CONTENT
lib.documentindex {
  wrap = <ul>|</ul>

  table = sys_category
  select {
    pidInList = 1
    recursive = 1000
    selectFields = sys_category.title, sys_category.uid as theuid
    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
    groupBy = sys_category.title
  }

  renderObj = COA
  renderObj.wrap = <li>|</li>
  renderObj.10 = TEXT
  renderObj.10 {
    field = title
    wrap = <h3>|</h3>
  }

  renderObj.20 = CONTENT
  renderObj.20 {

    table = sys_category
    select {
      begin = 0
      pidInList = 1
      recursive = 1000
      selectFields = sys_file.name, sys_file.identifier
      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")
      orderBy = sys_file.name
      andWhere.cObject = TEXT
      andWhere.cObject.dataWrap = sys_category.uid='{field:theuid}'
      //andWhere.cObject.dataWrap = sys_category.uid='4'
      andWhere.cObject.insertData= 1

    }

    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>

  }

}

第一个查询用于显示至少有一个文件关联的类别的标题,第二个select用于显示关联的文件。

现在的问题是,文件由于第一个 select 而被保存,因此被锁定无法在第二个查询中呈现。

我找不到 typoscript-only 解决方法,但我发现这个问题早已为人所知。现在我的问题是:有人知道这个问题的解决方法吗,只有打字错误?我不想要一个拆分为多个文件的解决方案,因为我是 typo3 的新手,我还没有对我们的 typo3 项目的概述。

编辑 1:

所以我按照 Bernd Wilke πφ 告诉我的那样更改了第二个查询的顺序:

renderObj.20 {

    table = sys_file
    select {
      begin = 0
      pidInList = 1
      recursive = 1000
      selectFields = sys_file.name, sys_file.identifier
      join = sys_file_metadata ON (sys_file_metadata.file = sys_file.uid) JOIN sys_category_record_mm ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign)
      where = (sys_category_record_mm.tablenames = "sys_file_metadata") AND (sys_category_record_mm.fieldname = "categories")
      orderBy = sys_file.name
      andWhere.cObject = TEXT
      andWhere.cObject.dataWrap = sys_category_record_mm.uid_local='{field:theuid}'
      andWhere.cObject.dataWrap = //sys_category_record_mm.uid_local='2' OR sys_category_record_mm.uid_local='4'
      andWhere.cObject.insertData= 1
    }

    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>

  }

据我所知,这取代了不呈现我需要的记录的问题,它根本不呈现我需要的东西。

我要更换吗

sys_category_record_mm.uid_local='{field:theuid}'
//andWhere.cObject.dataWrap = sys_category_record_mm.uid_local='2' OR sys_category_record_mm.uid_local='4'

//sys_category_record_mm.uid_local='{field:theuid}'
  andWhere.cObject.dataWrap = sys_category_record_mm.uid_local='2' OR sys_category_record_mm.uid_local='4'

显示了一些记录,但我又遇到了只有'OR'之后的条件才算的奇怪问题。所以只显示 category.uid=4 的记录。如果我在代码中将其更改为 2,它会显示 category.uid=2 的记录。无论如何,如果它是一个错误或其他什么,我现在不在乎。因为我希望它与 andWhere.cObject.dataWrap = sys_category_record_mm.uid_local='{field:theuid}' 一起使用,但它不支持。

编辑2:

好的,我按预期工作了,但是我做的方式太奇怪了,我不想使用它。

解决方案:

renderObj.20 {

    table = sys_file
    select {
      begin = 0
      pidInList = 1
      recursive = 1000
      selectFields = sys_file.name, sys_file.identifier
      join = sys_file_metadata ON (sys_file_metadata.file = sys_file.uid) JOIN sys_category_record_mm ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign)
      where = (sys_category_record_mm.tablenames = "sys_file_metadata") AND (sys_category_record_mm.fieldname = "categories")
      orderBy = sys_file.name
      andWhere.cObject = TEXT
      andWhere.cObject.dataWrap = 0 OR sys_category_record_mm.uid_local='{field:theuid}'
      //andWhere.cObject.dataWrap = sys_category_record_mm.uid_local='2' OR sys_category_record_mm.uid_local='4'
      andWhere.cObject.insertData= 1
    }

所以,我了解到:在 Typo3 中,只有 OR-operator 站在条件之前,条件才有意义。好吧,只是一个错别字?

OK,没看懂,不过解决了。我想知道为什么它会这样工作。但我可能不应该再问自己有关 typo3 的问题了。

解决方案:

In Typo3 conditions only matter if an OR-operator is standing before it?!

lib.documentindex = CONTENT
lib.documentindex {
  wrap = <ul>|</ul>

  table = sys_category
  select {
    pidInList = 1
    recursive = 1000
    selectFields = sys_category.title, sys_category.uid as theuid
    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)
    )
    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
    groupBy = sys_category.title
  }

  // context = sys_category
  renderObj = COA
  renderObj {
    wrap = <li>|</li>
    10 = TEXT
    10 {
      field = title
      wrap = <h3>|</h3>
    }

    20 = CONTENT
    20 {
      table = sys_file
      select {
        begin = 0
        pidInList = 1
        recursive = 1000
        selectFields = sys_file.name, sys_file.identifier
        join (
               sys_file_metadata 
                 ON (sys_file_metadata.file = sys_file.uid) 
          JOIN sys_category_record_mm 
                 ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign)
        )
        where (
          (sys_category_record_mm.tablenames = "sys_file_metadata") AND
          (sys_category_record_mm.fieldname = "categories")
        )
        orderBy = sys_file.name
        andWhere.cObject = TEXT
        andWhere.cObject {
          dataWrap = 0 OR sys_category_record_mm.uid_local='{field:theuid}'
          insertData= 1
        }
      }

      // context: sys_file
      renderObj = TEXT
      renderObj {
        wrap = <li>|</li>
        field = name
        typolink.parameter.field = identifier
      }
    }
  }
}

andWhere 不应以字段名称开头,而应以 AND、OR 或其他官方 SQL 语句开头。所以你应该更换行

andWhere.cObject.dataWrap = 0 OR sys_category_record_mm.uid_local='{field:theuid}'

andWhere.cObject.dataWrap = AND sys_category_record_mm.uid_local='{field:theuid}'

也许那时感觉不那么奇怪了。 ;-)

所以这里我们使用完全编辑的解决方案:

lib.documentindex = CONTENT
lib.documentindex {
  wrap = <ul>|</ul>    
  table = sys_category
  select {
    pidInList = 1
    recursive = 1000
    selectFields = sys_category.title, sys_category.uid as theuid
    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)
    )
    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
    groupBy = sys_category.title
  }

  // context = sys_category
  renderObj = COA
  renderObj {
    wrap = <li>|</li>
    10 = TEXT
    10 {
      dataWrap = <h3>{field:title}</h3>
    }

    20 = CONTENT
    20 {
      table = sys_file
      select {
        pidInList = 1
        recursive = 1000
        selectFields = sys_file.name, sys_file.identifier
        join (
               sys_file_metadata 
                 ON (sys_file_metadata.file = sys_file.uid) 
          JOIN sys_category_record_mm 
                 ON (sys_file_metadata.uid = sys_category_record_mm.uid_foreign)
        )
        where (
          (sys_category_record_mm.tablenames = "sys_file_metadata") AND
          (sys_category_record_mm.fieldname = "categories")
        )
        orderBy = sys_file.name
        andWhere.dataWrap = AND sys_category_record_mm.uid_local='{field:theuid}'
        }
      }

      // context: sys_file
      renderObj = TEXT
      renderObj {
        wrap = <li>|</li>
        field = name
        typolink.parameter.field = identifier
      }
    }
  }
}