TYPO3:如何在预告列表中获取页面的SYS分类?

时间:2019-02-06 11:45:36

标签: typo3 typoscript typo3-9.x

我建立了一个库来放出页面的所有子页面作为预告片。到目前为止有效。在此预告片中,我还想介绍子页面的sys-category。为此,我使用(并修改了)一个打字稿,在这里可以找到: Show category names of current page in TYPO3 8

但这不起作用-有人可以给我提示吗?

这是我的代码:

lib.newsteaser {

    20 = CONTENT
    20 {
        table = tt_content
        select {
            # Seiten-ID des Parent
            pidInList = 17
            recursive = 1
            orderBy = tx_mask_cnt_news_item_date
            where = hidden=0 AND CType='mask_cnt_news_item'
            limit = 4
        }

        wrap = <section><div class="container-fluid"><div class="row no-gutters news-teaserbox">|</div></div></section>

        renderObj = COA
        renderObj {

            wrap = |</div>

            10 = FILES
            10 {
                if.isTrue.field = tx_mask_cnt_news_item_teaser_bg

                references {
                    table = tt_content
                    # Seiten-ID
                    uid.dataWrap = {field:uid}
                    fieldName = tx_mask_cnt_news_item_teaser_bg
                }

                renderObj = TEXT
                renderObj.data = file:current:publicUrl
                renderObj.wrap = <div class="col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12 news-tb-item" style="background-image: url('/|');">
            }

            15 = TEXT
            15 {
                if.isFalse.field = tx_mask_cnt_news_item_teaser_bg
                value = <div class="col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12 news-tb-item">
            }

            20 = TEXT
            20 {
               wrap = <div class="news-tb-item-head">|</div>
                field = header
            }

            25 = CONTENT
            25 {
                wrap = <div class="categories">|</div>

                table = sys_category
                select {
                    # ID der Seite, auf der die Kategorien angelegt sind
                    pidInList = 0
                    join = sys_category_record_mm ON (sys_category_record_mm.uid_local=sys_category.uid)
                    where = sys_category_record_mm.tablenames='tt_content' AND sys_category_record_mm.uid_foreign = ###recorduid###
                    markers {
                        recorduid.field = uid
                    }
                }

                renderObj = TEXT
                renderObj.field = title
                renderObj.wrap = <li class="category {field:title}">|</li>
                renderObj.insertData = 1
            }

            30 = TEXT
            30 {
                wrap = <div class="news-tb-item-sub">|</div>
                field = subheader
            }

            40 = FILES
            40 {

                references {
                    table = tt_content
                    # Seiten-ID
                    uid.dataWrap= {field:uid}
                    fieldName = image
                }
                renderObj = IMAGE
                renderObj {
                    file.import.data = file:current:uid
                    file.crop.data = file:current:crop
                    file.treatIdAsReference = 1
                    altText.data = file:current:title
                    params =
                    wrap = |
                }

            }

            50 = TEXT
            50 {
                field = bodytext
            }

            60 = TEXT
            60 {
                value = Weiter
                lang.en = Read
                wrap = <div class="morelink-wrapper">|</div>

                typolink {
                    parameter.field =  pid
                    ATagParams =  class="morelink"
                }
            }

        }

    }

}

1 个答案:

答案 0 :(得分:1)

子页面?
您在tt_content上建立选择,因此拥有第17页的所有CE。
也许你是说

lib.newsteaser.20.table = pages

如果选择页面:

您的标记定义访问当前页面(TSFE)的页面记录,但是您需要页面记录的uid,它是您当前的上下文(renderObj)。

因此正确的标记定义应为:

pageuid.field = uid

否则(选择tt_content)

您需要使用与当前记录tt_content的关系:

   where = sys_category_record_mm.tablenames='tt_content' AND sys_category_record_mm.uid_foreign = ###recorduid###
   markers.recorduid.field = uid

,或者您从子页面中选择tt_content (我不知道如何从子页面中获取记录,因为您没有选择子页面,并且类别存储到了页面中)

   where = sys_category_record_mm.tablenames='pages' AND sys_category_record_mm.uid_foreign = ###pageuid###
   markers.pageuid.field = pid

tt_content记录的页面存储在字段pid


TYPO3如何存储数据?

TYPO3将其数据存储在不同的表中。主表是pages,用于构建网站的页面。这些页面以树状结构组织。并非所有页面都代表各个前端页面。 TYPO3中的每个记录都“存储”到一页(分配给pages记录)中。存在一个特殊的“页面”,它不是真实页面,也没有pages记录。它是页面树的根,可以用带有uid 0的页面来标识。uid代表“唯一标识符”,并且是每个数据记录中的一个字段。用于标识分配给记录的页面的每个数据记录都有一个字段pid(页面ID)。
同样,pages记录也有一个字段pid,它给出了树的结构。每个页面都有一个父页面,根页面的(pseudo-)page 0作为父页面。 在pages记录中存储了很多信息,但是通常没有内容。 (您可以在pages记录中存储背景图像,视觉效果或特殊的预览图像以及SEO信息,例如描述或摘要)
对于内容,存在一个表tt_content。您可以在此处存储文本,(对图片的引用)或控制例如其他记录的呈现。

对于页面预告片,您可以实现两种:
1.有关预告片的所有信息都存储在pages记录中
2.您使用页面的内容,这意味着:获取该页面中tt_content条记录的信息

使用预告片的一种典型情况是新闻列表:显示标题和摘要或带有图像的介绍,图像与全文链接到详细信息视图。


您的代码使人想起了这种情况,并且与预告片所代表的页面菜单无关。

我将以这种方式用错字来构建:
构建菜单对象(可能是special = directory
对于每个菜单项,请使用before对象替换默认链接,您可以在其中使用 current pages记录的其他字段来构建一个包含预览图像,页面标题,页面摘要。

lib.teaserMenu = HMENU
lib.teasermenu {
    special = directory
    special.value = 123

    1 = TMENU
    1 {
      // remove normal link
      doNotShowLink = 1

      // build it by myself:
      before.cObject = COA
      before.cObject {
        stdWrap.wrap = <div class="teaser">|</div>
        stdWrap.typolink.field = uid

        10 = FILES
        10 {
          :
        }

        20 = TEXT
        20.field = title
        20.wrap = <h3>|</h3>

        30 = TEXT
        30.field = abstract
        30.wrap = <p>|</p>

        :
      }
   }