【问题标题】:TYPO3 DataProcessing: How to control the order of the output?TYPO3 DataProcessing:如何控制输出的顺序?
【发布时间】:2019-10-18 20:09:43
【问题描述】:

我有一个包含来自掩码自定义内容元素的内容 uid 的列表。编辑器可以从列表中选择一些内容元素。现在我想要来自这些内容元素 uid 的完整数据。所以我尝试了 DatabaseQueryProcessor。

我是第一次尝试使用 DataProcessing。

dataProcessing {
    10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
    10 {
        table = tt_content          
        uidInList.field = tx_mask_sectionmenu_contentitems    
        as = items
    }
}

这几乎可以工作,但是流体输出中的顺序与原始列表的顺序不匹配。如何强制流体输出的顺序与原始列表中的顺序相同?

还是我必须先检查 SplitProcessor? 这个SplitProcessor到此为止,不知道下一个DatabaseQueryProcessor要指定什么?

dataProcessing {

    10 = TYPO3\CMS\Frontend\DataProcessing\SplitProcessor
    10 {
        if.isTrue.field = tx_mask_sectionmenu_contentitems
        delimiter = ,
        fieldName = tx_mask_sectionmenu_contentitems
        removeEmptyEntries = 1
        filterIntegers = 0
        filterUnique = 1
        as = items

        dataProcessing {
          10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
          10 {
            table = tt_content                          
            ???
            as = contentItem
          }
       }
    }        
}

排序字段不是我想要的。我想要编辑器选择的相同排序。

我该如何解决这个问题?

【问题讨论】:

    标签: typo3 typoscript


    【解决方案1】:

    据我所知,SplitProcessor 不像其他 DataProcessor 那样支持任何进一步的 dataProcessing(至少如果没有注意到选项列表中的任何 dataProcessing 像其他人一样):https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Fluidtemplate/DataProcessing/SplitProcessor.html

    这是一种解决方法,也适用于 TYPO3 11:

    https://forge.typo3.org/issues/86151

    简而言之:

    dataProcessing {
        10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
        10 {
            table = tt_content                          
            uidInList.field = tx_mask_sectionmenu_contentitems
            selectFields.dataWrap = *,FIND_IN_SET(uid,'{field:pages}') AS foobar_sort
    orderBy = foobar_sort
    
            as = contentItem
        }
    }
    

    【讨论】:

      【解决方案2】:

      我测试了uidInList.field = tx_mask_sectionmenu_contentitems,但它没有帮助按逗号分隔的 uid 列表的顺序对记录进行排序。

      嵌套方法根本不起作用。我查看了代码,发现只有 DatabaseQueryProcessorLanguageMenuProcessorMenuProcessor 能够使用另一个 MenuProcessor 处理内容。

      【讨论】:

        【解决方案3】:

        根据https://docs.typo3.org/m/typo3/reference-typoscript/master/en-us/ContentObjects/Fluidtemplate/Index.html#dataprocessing

          # All properties from .select can be used directly
          # + stdWrap
          colPos = 1
          pidInList = 13,14
        

        并检查选择属性https://docs.typo3.org/m/typo3/reference-typoscript/master/en-us/Functions/Select.html 给你

          uidInList =
          pidInList =
          recursive =
          orderBy =
          groupBy =
          max =
          begin =
          where =
          languageField =
          includeRecordsWithoutDefaultTranslation =
          selectFields =
          join =
          leftjoin =
          rightjoin =
        

        因此,与其在此处使用嵌套的dataProcessing,不如跳过orderBy 而使用uidInList

          uidInList.field = tx_mask_sectionmenu_contentitems
        

        如果你想保持嵌套的方式,你仍然应该使用uidInList,但略有不同

        dataProcessing {
            10 = TYPO3\CMS\Frontend\DataProcessing\SplitProcessor
            10 {
                if.isTrue.field = tx_mask_sectionmenu_contentitems
                delimiter = ,
                fieldName = tx_mask_sectionmenu_contentitems
                removeEmptyEntries = 1
                filterIntegers = 0
                filterUnique = 1
                as = items
        
                dataProcessing {
                  10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
                  10 {
                    table = tt_content                          
                    uidInList.field = current
                    as = contentItem
                  }
               }
            }        
        }
        

        要获取“当前”的实际字段名称,您可能需要将 <f:debug>{items}</f:debug> 放入 Fluid 模板中。如果current 的实际行为在此上下文中可用,则可能必须改为data = current

        【讨论】:

        • 感谢您的回答!我第一次尝试这个,请参阅我的第一个代码示例。我只是得到内容元素的 uid。当然,我可以使用例如 VHS 在 uid 上循环流体来获取元素的内容。但我想在之前而不是在流体中这样做。如果这不起作用,我可能不得不寻找另一种解决方案,或者尝试更复杂的流体解决方案。
        • 我刚刚添加了完整的 dataProcessing 块 - 如果您只是获取 uid,那么您的设置一定有问题,因为查询处理器应该返回完整的 tt_content 记录
        • 在 TYPO3 的旧时代,一个肮脏的解决方法是 orderBy.dataWrap = FIND_IN_SET({field:myField}) 但我不认为这仍然适用于 Doctrine。
        • 你是对的。第一个代码 sn-p 给了我完整的 tt_content 记录,但没有想要的“排序”顺序。这就是为什么我认为之间的拆分处理器会有所帮助:-)。我已经尝试了很多,我不记得是什么:-)。
        • 我遇到的问题与 Lukas 用 TYPO3 9.5 和 uidInList 方法描述的问题完全相同。字段中的顺序是正确的。但是输出顺序错误,而不是在 be 中选择。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 2021-11-11
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        相关资源
        最近更新 更多