elementareteilchen / etcachetsobjects
TypoScript API 允许缓存像菜单这样的昂贵 TypoScript 对象
v8.1.1
2024-07-31 11:38 UTC
Requires
- php: ^8.1
- typo3/cms-core: ^11.5 || ^12.4
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
基于站点
清除包含编辑页面记录的整个站点的缓存。
从所有页面
当编辑页面记录时,清除所有缓存。