elementareteilchen/etcachetsobjects

TypoScript API 允许缓存像菜单这样的昂贵 TypoScript 对象

安装: 893

依赖关系: 0

建议者: 0

安全性: 0

星标: 1

关注者: 5

分支: 0

开放问题: 0

类型:typo3-cms-extension

v8.1.1 2024-07-31 11:38 UTC

This package is auto-updated.

Last update: 2024-08-31 13:32:05 UTC


README

理念

在较大的页面上,通常会有很多页和级别的较大菜单(如响应式菜单或飞出菜单)。这些菜单的渲染相当耗费资源,并且通常在每个渲染的页面上都进行。如果您不需要标记活动或当前页面,或者通过 JavaScript 在浏览器端进行此操作,那么这些菜单可能在整个/多个页面上是相同的。非常适合进行缓存!

目前我们只用于菜单,其他 TypoScript 对象应该也可以工作,但可能需要改进缓存失效。

调试提示:我们仅在无前端用户登录时激活缓存。每个 BE 用户都会获得她自己的独立缓存。

使用示例 1:缓存(部分)在不同页面上相同的菜单

lib.menu.sector = HMENU
lib.menu.sector {
    [...]
}
// only use caching if no fe_user is logged in, else just stay with original TS
lib.menu.sector_cached < lib.menu.sector
[loginUser('*') == false]
    lib.menu.sector_cached >
    lib.menu.sector_cached = USER
    lib.menu.sector_cached {
        userFunc = ElementareTeilchen\Etcachetsobjects\TypoScriptCache->databaseBackend
        conf < lib.menu.sector
        cacheTime = 0 // "0" means unlimited liftime, cleared via backend saving hook on page changes
        //here we can set parameter needed for creating different cache entries
        additionalUniqueCacheParameters = COA
        additionalUniqueCacheParameters {
            10 = TEXT
            10.value = 0
            10.override.data = siteLanguage:languageId

            20 = TEXT
            20.value = {$theme.pages.sectorstart_id}
        }
    }
[global]

使用示例 2:缓存(部分)在不同页面上相同的菜单,但在较深级别上应该再次不同

当您有一个非常大和深的页面树时,您会用到这个示例。在某个级别上,您不再希望有飞出菜单,但只想显示当前页面的子页面。

lib.menu.sector = HMENU
lib.menu.sector {
    [...]
}
[loginUser('*') == false]
    lib.menu.sector_cached >
    lib.menu.sector_cached = USER
    lib.menu.sector_cached {
        userFunc = ElementareTeilchen\Etcachetsobjects\TypoScriptCache->databaseBackend
        conf < lib.menu.sector
        cacheTime = 0 // "0" means unlimited liftime, cleared via backend saving hook on page changes
        //here we can set parameter needed for creating different cache entries
        additionalUniqueCacheParameters = COA
        additionalUniqueCacheParameters {
            10 = TEXT
            10.value = 0
            10.override.data = GP:L

            20 = TEXT
            20.value = {$theme.pages.sectorstart_id}

            // special handling because of level 5/6
            // if on level 4 and page has subpages or if on level 5 and deeper we have individual menus
            30 = USER
            30.userFunc = ElementareTeilchen\Etcachetsobjects\MenuVariantCheck->levelGroupIdentifier
            30.sectorstartId = {$theme.pages.sectorstart_id}
            30.individualMenusComingAtLevel = 4
        }

        // no ContentObject like COA, TEXT needed, we just want the configuration value
        additionalTags {
            10 = sector_{$theme.pages.sectorstart_id}
            #20 =
        }
    }
[global]

使用示例 3:缓存在同一个页面上多次使用的昂贵库对象

lib.pageRootlineCategoryId = CONTENT
lib.pageRootlineCategoryId {
    [...]
}

lib.pageRootlineCategoryId_cached = USER
lib.pageRootlineCategoryId_cached {
    userFunc = ElementareTeilchen\Etcachetsobjects\TypoScriptCache->transientBackend
    conf < lib.pageRootlineCategoryId
}

// then just replace _lib.pageRootlineCategoryId_ with _lib.pageRootlineCategoryId_cached_ whereever you use it.

缓存失效

在扩展管理器中,您可以定义所需的失效变体。

页面TS设置

仅清除配置的缓存标签。

指定在编辑页面时应刷新哪些缓存标签。使用页面 TSconfig 进行配置。当缓存菜单/库时,请使用您设置的缓存标签。

在 TypoScript 中添加额外的缓存标签(可以通过后端保存钩子清除)

当配置您的缓存菜单/库时,您可以添加额外的缓存标签。例如

lib.menu.sector_cached {
    userFunc = ElementareTeilchen\Etcachetsobjects\TypoScriptCache->databaseBackend
    conf < lib.menu.sector

    ...

    // no ContentObject like COA, TEXT needed, we just want the configuration value
    additionalTags {
        10 = sector_{$theme.pages.sectorstart_id}
        20 = cacheTag1
        30 = cacheTag2
    }
}

配置要清除的缓存标签

示例 TSconfig 设置

tx_etcachetsobjects.clearByTags = cacheTag1, cacheTag2

基于站点

清除包含编辑页面记录的整个站点的缓存。

从所有页面

当编辑页面记录时,清除所有缓存。