Feature: #64200 - Allow individual content caching

See forge#64200

Description

The stdWrap.cache. property is now available as first-class function to all content objects. This skips the rendering even for content objects that evaluate stdWrap after rendering (e.g. COA).

Usage:

page = PAGE
page.10 = COA
page.10 {
        cache.key = coaout
        cache.lifetime = 60
        #stdWrap.cache.key = coastdWrap
        #stdWrap.cache.lifetime = 60
        10 = TEXT
        10 {
                cache.key = mycurrenttimestamp
                cache.lifetime = 60
                data = date : U
                strftime = %H:%M:%S
                noTrimWrap = |10: | |
        }
        20 = TEXT
        20 {
                data = date : U
                strftime = %H:%M:%S
                noTrimWrap = |20: | |
        }
}

The commented part is stdWrap.cache. property available since 4.7, that does not stop the rendering of COA including all sub-cObjects.

Additionally, stdWrap support is added to key, lifetime and tags.

Impact

If you've previously used the cache. property in your custom cObject, this will now fail, because cache. is unset to avoid double caching. You are encouraged to rely on the core methods for caching cObjects or rename your property.

stdWrap.cache continues to exists and can be used as before. However the top level stdWrap of certain cObjects (e.g. TEXT cObject) will not evaluate cache. as part of stdWrap, but before starting the rendering of the cObject. In conjunction the storing will happen after the stdWrap processing right before the content is returned.

Top level cache. will not evaluate the hook $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap_cacheStore'] any more.