From 4f22f4e88840f881badf7f87a8d0d9041e0b4182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ephraim=20H=C3=A4rer?= Date: Sat, 4 May 2024 12:05:19 +0200 Subject: [PATCH] initial release for TYPO3 12.4 --- .ddev/config.yaml | 283 ++++++++++++++++++ .editorconfig | 53 ++++ .gitignore | 4 + .../EventListener/PublicFileUriListener.php | 2 +- Documentation/ChangeLog/Index.rst | 7 + Documentation/Index.rst | 2 +- Documentation/Settings.cfg | 4 +- Resources/Public/Icons/Extension.svg | 9 + composer.json | 115 ++++--- ext_emconf.php | 14 +- ext_icon.png | Bin 11142 -> 0 bytes ext_icon.svg | 54 ---- 12 files changed, 432 insertions(+), 115 deletions(-) create mode 100644 .ddev/config.yaml create mode 100644 .editorconfig create mode 100644 Resources/Public/Icons/Extension.svg delete mode 100644 ext_icon.png delete mode 100644 ext_icon.svg diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 0000000..066e524 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,283 @@ +name: reint-file-timestamp +type: typo3 +docroot: ".Build/public" +php_version: "8.2" +webserver_type: apache-fpm +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: [] +database: + type: mariadb + version: "10.6" +use_dns_when_possible: true +composer_version: "2" +web_environment: [] +corepack_enable: false +default_container_timeout: "240" + +# Key features of DDEV's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress +# See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more +# information on the different project types +# "drupal" covers recent Drupal 8+ + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to DDEV's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb, postgres +# version: # database version, like "10.11" or "8.0" +# MariaDB versions can be 5.5-10.8 and 10.11, MySQL versions can be 5.5-8.0 +# PostgreSQL versions can be 9-16. + +# router_http_port: # Port to be used for http (defaults to global configuration, usually 80) +# router_https_port: # Port for https (defaults to global configuration, usually 443) + +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better, +# as leaving Xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better, +# as leaving Xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the Composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "20" +# change from the default system Node.js version to any other version. +# Numeric version numbers can be complete (i.e. 18.15.0) or +# incomplete (18, 17.2, 16). 'lts' and 'latest' can be used as well along with +# other named releases. +# see https://www.npmjs.com/package/n#specifying-nodejs-versions +# Note that you can continue using 'ddev nvm' or nvm inside the web container +# to change the project's installed node version if you need to. + +# corepack_enable: false +# Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dirs: "custom/upload/dir" +# +# upload_dirs: +# - custom/upload/dir +# - ../private +# +# would set the destination paths for ddev import-files to /custom/upload/dir +# When Mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dirs don't have to be synced into Mutagen. + +# disable_upload_dirs_warning: false +# If true, turns off the normal warning that says +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set" + +# ddev_version_constraint: "" +# Example: +# ddev_version_constraint: ">= 1.22.4" +# This will enforce that the running ddev version is within this constraint. +# See https://github.com/Masterminds/semver#checking-version-constraints for +# supported constraint formats + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of DDEV that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# performance_mode: "global" +# DDEV offers performance optimization strategies to improve the filesystem +# performance depending on your host system. Should be configured globally. +# +# If set, will override the global config. Possible values are: +# - "global": uses the value from the global config. +# - "none": disables performance optimization for this project. +# - "mutagen": enables Mutagen for this project. +# - "nfs": enables NFS for this project. +# +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs +# See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# mailpit_http_port: "8025" +# mailpit_https_port: "8026" +# The Mailpit ports can be changed from the default 8025 and 8026 + +# host_mailpit_port: "8025" +# The mailpit port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h" + +# disable_settings_management: false +# If true, DDEV will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, DDEV will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not the localhost interface only. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that DDEV waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# Fill in all three fields even if you don’t intend to use the https_port! +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start. +# +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - name: myapp +# container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'use_dns_when_possible: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many DDEV commands can be extended to run tasks before or after the +# DDEV command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: +# post-start: +# - exec: composer install -d /var/www/html diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0c5bdfe --- /dev/null +++ b/.editorconfig @@ -0,0 +1,53 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +# JS files +[*.js] +indent_size = 2 + +# JSON files +[*.json] +indent_style = tab + +# package.json +[package.json] +indent_size = 2 + +# ReST files +[*.rst] +indent_size = 3 +max_line_length = 80 + +# SQL files +[*.sql] +indent_style = tab +indent_size = 2 + +# TypoScript files +[*.{typoscript,tsconfig}] +indent_size = 2 + +# YAML files +[{*.yml,*.yaml}] +indent_size = 2 + +# XLF files +[*.xlf] +indent_style = tab + +# .htaccess +[.htaccess] +indent_style = tab + +# Markdown files +[*.md] +max_line_length = 80 diff --git a/.gitignore b/.gitignore index 3c1e69b..e77e0d6 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,7 @@ Temporary Items # PHPStorm .idea .idea/* +vendor +bin +.Build +*.lock diff --git a/Classes/EventListener/PublicFileUriListener.php b/Classes/EventListener/PublicFileUriListener.php index 444a0f1..11c908c 100644 --- a/Classes/EventListener/PublicFileUriListener.php +++ b/Classes/EventListener/PublicFileUriListener.php @@ -6,7 +6,7 @@ * * Copyright notice * - * (c) 2022 Ephraim Härer , RENOLIT SE + * (c) 2022-2024 Ephraim Härer , RENOLIT SE * * All rights reserved * diff --git a/Documentation/ChangeLog/Index.rst b/Documentation/ChangeLog/Index.rst index 372892c..703d5e4 100644 --- a/Documentation/ChangeLog/Index.rst +++ b/Documentation/ChangeLog/Index.rst @@ -12,6 +12,13 @@ ChangeLog ========= +- **03.05.2024** -> 4.0.0 + + - new version for TYPO3 12.4 + - updated documentation + +----------------------------------- + - **01.06.2022** -> 3.0.1 - added PHP 8 compatibility, thanks to jp1987 diff --git a/Documentation/Index.rst b/Documentation/Index.rst index 15877b1..f6b0825 100644 --- a/Documentation/Index.rst +++ b/Documentation/Index.rst @@ -29,7 +29,7 @@ Timestamp in public file uri FAL,file,download,timestamp,caching,parameter,filelist,browser,filecache,Hook,signal,Slot :Copyright: - 2016-2022 + 2016-2024 :Author: Ephraim Härer diff --git a/Documentation/Settings.cfg b/Documentation/Settings.cfg index e85cdea..7479846 100644 --- a/Documentation/Settings.cfg +++ b/Documentation/Settings.cfg @@ -1,7 +1,7 @@ [general] project = Timestamp parameter in public file uri -release = 3.0.1 -version = 3.0 +release = 4.0.0 +version = 4.0 copyright = 2022 [notify] diff --git a/Resources/Public/Icons/Extension.svg b/Resources/Public/Icons/Extension.svg new file mode 100644 index 0000000..8cc15b4 --- /dev/null +++ b/Resources/Public/Icons/Extension.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/composer.json b/composer.json index 01298e5..3db44ed 100644 --- a/composer.json +++ b/composer.json @@ -1,52 +1,69 @@ { - "name": "renolit/reint-file-timestamp", - "description": "Timestamp parameter in public file uri", - "type": "typo3-cms-extension", - "homepage": "https://github.com/Kephson/reint_file_timestamp", - "readme": "README.md", - "license": [ - "GPL-2.0-or-later" - ], - "keywords": [ - "TYPO3", - "downloads", - "publicurl", - "url", - "uri", - "file", - "timestamp", - "caching", - "browser", - "Intranet", - "event", - "listener" - ], - "authors": [ - { - "name": "Ephraim Härer", - "email": "ephraim.haerer@renolit.com", - "homepage": "https://www.renolit.com", - "role": "Developer" - } - ], - "support": { - "email": "ephraim.haerer@renolit.com", - "issues": "https://github.com/Kephson/reint_file_timestamp/issues", - "source": "https://github.com/Kephson/reint_file_timestamp/archive/master.zip" - }, - "require": { - "php": "^7.4 || ^8.0", - "typo3/cms-core": ">=11.5, <12.0" - }, - "autoload": { - "psr-4": { - "RENOLIT\\ReintFileTimestamp\\": "Classes" - } - }, - "extra": { - "typo3/cms": { - "extension-key": "reint_file_timestamp" - } - } + "name": "renolit/reint-file-timestamp", + "description": "Timestamp parameter in public file uri", + "type": "typo3-cms-extension", + "homepage": "https://github.com/Kephson/reint_file_timestamp", + "readme": "README.md", + "license": [ + "GPL-2.0-or-later" + ], + "keywords": [ + "TYPO3", + "downloads", + "publicurl", + "url", + "uri", + "file", + "timestamp", + "caching", + "browser", + "Intranet", + "event", + "listener" + ], + "authors": [ + { + "name": "Ephraim Härer", + "email": "ephraim.haerer@renolit.com", + "homepage": "https://www.renolit.com", + "role": "Developer" + } + ], + "support": { + "email": "ephraim.haerer@renolit.com", + "issues": "https://github.com/Kephson/reint_file_timestamp/issues" + }, + "require": { + "php": "^8.1", + "typo3/cms-core": "^12.4" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42" + }, + "replace": { + "typo3-ter/reint-file-timestamp": "self.version" + }, + "autoload": { + "psr-4": { + "RENOLIT\\ReintFileTimestamp\\": "Classes" + } + }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true, + "typo3/class-alias-loader": true, + "typo3/cms-composer-installers": true + }, + "bin-dir": ".Build/bin", + "sort-packages": true, + "vendor-dir": ".Build/vendor" + }, + "extra": { + "typo3/cms": { + "cms-package-dir": "{$vendor-dir}/typo3/cms", + "extension-key": "reint_file_timestamp", + "web-dir": ".Build/public" + } + } } diff --git a/ext_emconf.php b/ext_emconf.php index 27671f5..3a98db1 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -12,21 +12,19 @@ $EM_CONF[$_EXTKEY] = [ 'title' => 'Timestamp parameter in public file uri', 'description' => 'Adds a parameter with the timestamp of last change to all public file uri to prevent browser from caching the file after update.', - 'version' => '3.0.1', + 'version' => '4.0.0', 'category' => 'misc', 'state' => 'stable', - 'uploadfolder' => false, - 'clearCacheOnLoad' => false, - 'author' => 'Ephraim Härer', - 'author_email' => 'ephraim.haerer@renolit.com', - 'author_company' => 'RENOLIT SE', 'constraints' => [ 'depends' => [ - 'typo3' => '11.5.0-11.5.99', - 'extensionmanager' => '11.5.0-11.5.99', + 'typo3' => '12.4.0-12.4.99', + 'extensionmanager' => '12.4.0-12.4.99', ], 'conflicts' => [], 'suggests' => [], ], + 'author' => 'Ephraim Härer', + 'author_email' => 'ephraim.haerer@renolit.com', + 'author_company' => 'RENOLIT SE', ]; diff --git a/ext_icon.png b/ext_icon.png deleted file mode 100644 index ff59998cf5636dd346375c304b22fe0721c4210d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11142 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 diff --git a/ext_icon.svg b/ext_icon.svg deleted file mode 100644 index 317ae80..0000000 --- a/ext_icon.svg +++ /dev/null @@ -1,54 +0,0 @@ - -image/svg+xml \ No newline at end of file