TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:31 +02:00
commit 3e43c11539
407 changed files with 51272 additions and 0 deletions
@@ -0,0 +1,62 @@
<f:layout name="Cards"/>
<f:section name="headline">
<h1>Environment</h1>
</f:section>
<f:section name="cards">
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Environment Overview', subtitle: 'Environment', icon: 'EXT:install/Resources/Public/Icons/modules/install-show-environment.svg'}" />
<div class="card-body">
<p class="card-text">Review details of the host environment, including web server, PHP version, selected database, and the application context.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/environment/system-information.js">Show System Information&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Environment Status', subtitle: 'PHP', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-environment.svg'}" />
<div class="card-body">
<p class="card-text">Analyze host environment for conditions that could prevent TYPO3 from operating correctly.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/environment-check.js">Check Environment&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Directory Status', subtitle: 'Permissions', icon: 'EXT:install/Resources/Public/Icons/modules/install-check-directory.svg'}" />
<div class="card-body">
<p class="card-text">Analyze folder structure to verify file and directory permissions and detect missing items.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/folder-structure.js">Check Directory Status&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'PHP Info', subtitle: 'PHP', icon: 'EXT:install/Resources/Public/Icons/modules/install-php-info.svg'}" />
<div class="card-body">
<p class="card-text">View detailed information about the PHP installation, including version details and enabled extensions.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/php-info.js">View PHP Info&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Test Mail Setup', subtitle: 'Mail', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-mail.svg'}" />
<div class="card-body">
<p class="card-text">Test your mail configuration by sending out a dummy email via TYPO3.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-modal-size="small" data-import="@typo3/install/module/environment/mail-test.js">Test Mail Setup&hellip;</button>
</div>
</div>
<div class="card card-size-small">
<f:render partial="Card/Header" arguments="{ title: 'Image Processing', subtitle: 'Image Processing', icon: 'EXT:install/Resources/Public/Icons/modules/install-test-image.svg'}" />
<div class="card-body">
<p class="card-text">Create test images and compare them with reference images to verify that image processing works correctly in your environment.</p>
</div>
<div class="card-footer">
<button type="button" class="btn btn-default" data-import="@typo3/install/module/environment/image-processing.js">Test Images&hellip;</button>
</div>
</div>
</f:section>
@@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="t3js-environmentCheck-output"></div>
</html>
@@ -0,0 +1,20 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>Root Directory: <strong>{publicPath}</strong></p>
<div class="t3js-folderStructure-output mt-4" style="display:none"></div>
<div class="t3js-folderStructure-errors mt-4" style="display:none">
<h3>These files or folders have errors and may be fixed automatically:</h3>
<div class="t3js-folderStructure-errors-list"></div>
</div>
<h3 class="mt-4">Default File and Directory permissions</h3>
<div class="t3js-folderStructure-permissions"></div>
<div class="t3js-folderStructure-ok mt-4" style="display:none">
<h3>These structures don't need to be fixed:</h3>
<div class="t3js-folderStructure-ok-list"></div>
</div>
</html>
@@ -0,0 +1,380 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<h2>True type font tests</h2>
<f:be.infobox title="FreeType2 hint" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>If the two images below do not look the same, please check your FreeType 2 module.</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingTrueType"></div>
<h2>Convert image formats to jpg</h2>
<p>
This verifies that your ImageMagick / GraphicsMagick installation is able to read the default
formats <code>jpg</code>, <code>gif</code>, <code>png</code>, <code>tif</code>, <code>pdf</code> and
<code>ai</code>, <code>webp</code> and <code>avif</code>.
The tool <code>identify</code> is used to read the pixel dimensions of non-web formats and 'convert' is used to
read the image and convert it to <code>jpg</code>.
</p>
<f:be.infobox title="Dark images" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
In case the images appear remarkably darker than the reference images,
try to set<br/> <code>$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_colorspace'] = 'sRGB';</code>.
</p>
</f:be.infobox>
<h3>Read jpg</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadJpg"></div>
<h3>Read gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadGif"></div>
<h3>Read png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadPng"></div>
<h3>Read webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadWebp"></div>
<h3>Read avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadAvif"></div>
<h3>Read tif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadTif"></div>
<h3>Read pdf</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadPdf"></div>
<h3>Read ai</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingReadAi"></div>
<h2>Writing gif, png, webp, avif</h2>
<p>
This verifies that ImageMagick / GraphicsMagick is able to write GIF, PNG, WEBP and AVIF files.
</p>
<h3>Write gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteGif"></div>
<h3>Write png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWritePng"></div>
<h3>Write webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteWebp"></div>
<h3>Write avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingWriteAvif"></div>
<h2>Scaling images</h2>
<p>
This shows how ImageMagick / GraphicsMagick reacts when scaling transparent GIF and PNG files.
</p>
<h3>gif to gif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGifToGif"></div>
<h3>png to png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToPng"></div>
<h3>gif to jpg</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGifToJpg"></div>
<h3>transparent svg to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingSvgToWebp"></div>
<h3>transparent svg to png</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingSvgToPng"></div>
<h2>Special image formats</h2>
<p>
This shows how ImageMagick /GraphicsMagicks reacts when converting to image formats like WEBP and AVIF.
</p>
<h3>jpg to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingJpgToWebp"></div>
<h3>jpg to avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingJpgToAvif"></div>
<h3>png to webp</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToWebp"></div>
<h3>png to avif</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingPngToAvif"></div>
<h2>Combining images</h2>
<p>
This verifies that the ImageMagick / GraphicsMagick tools, <code>combine</code>, <code>composite</code>, are able to
combine two images through a grayscale mask.
</p>
<h3>Combine using a GIF mask with only black and white</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingCombineGifMask"></div>
<h3>Combine using a JPG mask with graylevels</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingCombineJpgMask"></div>
<h2>GDlib</h2>
<p>
This verifies that the GDLib installation works properly.
</p>
<h3>Create simple image</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibSimple"></div>
<h3>Create image with box from file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFile"></div>
<h3>Create webp image with box from webp file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFileToWebp"></div>
<h3>Create avif image with box from file</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibFromFileToAvif"></div>
<h3>Render text with TrueType font</h3>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibRenderText"></div>
<h3>Render text with TrueType font using 'niceText' option</h3>
<f:be.infobox title="Note on 'niceText'" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
'niceText' is a concept that tries to improve the antialiasing of the rendered type by actually
rendering the textstring in double size on a black/white mask, downscaling the mask and masking
the text onto the image through this mask. This involves ImageMagick / GraphicsMagick 'combine'/'composite' and 'convert'.
</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibNiceText"></div>
<h3>Render 'niceText' with a shadow under</h3>
<f:be.infobox title="Note on 'shadow'" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}">
<p>
This test makes sense only if the above test had a correct output. But if so, you may not see
a soft drop-shadow from the third text string as you should. In that case you are most likely using
ImageMagick 5 and should set the flag <code>$GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_effects']</code>.
</p>
</f:be.infobox>
<div class="t3js-imageProcessing-twinContainer" data-test="imageProcessingGdlibNiceTextShadow"></div>
<div class="panel-group mb-0" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseConfiguration"
aria-controls="collapseConfiguration"
aria-expanded="false"
id="headingConfiguration"
>
<div class="panel-title">
<strong>Current configuration</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseConfiguration" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingConfiguration">
<div class="table-fit">
<table class="table table-striped">
<tr>
<td>{imageProcessingProcessor} enabled:</td>
<td>{f:if(condition:imageProcessingEnabled, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>ImageMagick or GraphicsMagick:</td>
<td>{imageProcessingProcessor}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} path:</td>
<td>{imageProcessingPath}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} version:</td>
<td>{imageProcessingVersion}</td>
</tr>
<tr>
<td>{imageProcessingProcessor} effects enabled:</td>
<td>{imageProcessingEffects} <span>(Blurring/Sharpening with {imageProcessingProcessor})</span></td>
</tr>
<tr>
<td>GDLib enabled:</td>
<td>{f:if(condition:imageProcessingGdlibEnabled, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>GDLib using PNG:</td>
<td>{f:if(condition:imageProcessingGdlibPng, then:'Yes', else:'No')}</td>
</tr>
<tr>
<td>File Formats:</td>
<td>{imageProcessingFileFormats}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseVerify"
aria-controls="collapseVerify"
aria-expanded="false"
id="headingVerify"
>
<div class="panel-title">
<strong>Verify test results</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseVerify" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingVerify">
<div class="panel-body">
<h3>Verify test results</h3>
<p>
This page performs image processing and displays the result. It's a thorough check
that everything you've configured is working correctly.
</p>
<p>
It's quite simple to verify your installation; Just look down the page, the images
in pairs should look like each other. If some images are not alike, something is
wrong. You may also notice warnings and errors if this tool found signs of any problems.
</p>
<p>
The image to the left is the reference image (how it should be) and to the right
the image made by your server.
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseAbout"
aria-controls="collapseAbout"
aria-expanded="false"
id="headingAbout"
>
<div class="panel-title">
<strong>About image handling</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseAbout" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingAbout">
<div class="panel-body">
<p>
TYPO3 is known for its ability to process images on the server.
</p>
<p>
In the backend interface (TBE) thumbnails are automatically generated
as well as icons, menu items and pane tabs (by GDLib).
In the frontend all kinds of graphical elements are processed. Typically, images are
scaled down to fit the pages (by ImageMagick/GraphicsMagick) and menu items, graphical headers and
such are generated automatically (by GDLib + ImageMagick/GraphicsMagick). In addition, TYPO3 is able
to handle many file formats (thanks to ImageMagick/GraphicsMagick), for example TIF, BMP, PCX, TGA,
AI and PDF in addition to the standard web formats; JPG, GIF, PNG. Additional image formats like WEBP
and AVIF are available depending on installed codecs on the system.
</p>
<p>
In order to do this, TYPO3 uses two sets of tools:
</p>
<strong>
ImageMagick / GraphicsMagick:
</strong>
<p>
For conversion of non-web formats to web formats, combining images with alpha-masks,
performing image-effects like blurring and sharpening.
</p>
<p>
ImageMagick is a collection of external programs on the server called by the exec()
function in PHP. TYPO3 uses three of these, namely 'convert' (converting file formats,
scaling, effects), 'combine'/'composite' (combining images with masks) and 'identify'
(returns image information). GraphicsMagick is an alternative to ImageMagick and can
be enabled by setting [GFX][processor] to 'GraphicsMagick'. This is recommended and enabled
by default. Because ImageMagick and GraphicsMagick are external programs, a requirement
must be met: The programs must be installed on the server and working. ImageMagick is
available for both Windows and Unix. The current version is 6+. ImageMagick homepage is
at <a href="https://www.imagemagick.org/">https://www.imagemagick.org/</a>
</p>
<strong>GDLib:</strong>
<p>
For drawing boxes and rendering text on images with TrueType fonts. Also used for
icons, menuitems and generally the TypoScript GIFBUILDER object is based on GDlib,
but extensively utilizing ImageMagick to process intermediate results.
</p>
<p>
GDLib is accessed through internal functions in PHP, you'll need a version of PHP
with GDLib compiled in. Also in order to use TrueType fonts with GDLib you'll
need FreeType compiled in as well.
</p>
</div>
</div>
</div>
<div class="panel panel-default">
<h2 class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
type="button"
class="panel-button collapsed"
data-bs-toggle="collapse"
data-bs-parent="#accordion"
data-bs-target="#collapseTestImages"
aria-controls="collapseTestImages"
aria-expanded="false"
id="headingTestImages"
>
<div class="panel-title">
<strong>About test images</strong>
</div>
<span class="caret"></span>
</button>
</div>
</h2>
<div id="collapseTestImages" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTestImages">
<div class="panel-body">
<p>
Test-Image by Rotkaeppchen68 (in de.wikipedia) [<a href="http://www.gnu.org/copyleft/fdl.html">GFDL</a> or
<a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>],
<a href="https://commons.wikimedia.org/wiki/File%3AFuBK-Testbild.png">via Wikimedia Commons</a>
</p>
</div>
</div>
</div>
</div>
<template id="t3js-imageProcessing-twinImage-template">
<div class="t3-install-displaytwinimageimages t3js-imageProcessing-images" hidden>
<div class="row">
<div class="col-12 col-md-6">
<h3>Reference</h3>
<div class="bg-transparent-emulation">
<img class="reference"/>
</div>
</div>
<div class="col-12 col-md-6">
<h3>Your system</h3>
<div class="bg-transparent-emulation">
<img class="result"/>
</div>
</div>
</div>
</div>
<div class="t3-install-displaytwinimagetextarea t3js-imageProcessing-command" hidden>
<pre class="language-bash"><code class="language-bash t3js-imageProcessing-command-text"></code></pre>
</div>
</template>
</html>
@@ -0,0 +1,45 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<p>
Check the basic mail functionality by entering your email address here and clicking the button.
You should then receive a test email from "{mailTestSenderAddress}".
</p>
<p>
If no email is received, your setup might be broken. Check the following:
</p>
<ul>
<li>
If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to mail or sendmail, TYPO3 tries to use
the operating systems' sendmail application. There might be no such program installed.
</li>
<li>
If <code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']</code> is set to smtp, check if the data given in
<code>$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_smtp_*']</code> is valid. Wrong data here results in faulty
requests to the mail server. You can find the resulting messages in the mail server log.
</li>
</ul>
<p>
Not receiving the test email could also be a consequence of it being intercepted by a spam filter or due to the
sending domain's email security settings, such as SPF record, which may prevent successful delivery.
</p>
<div class="t3js-module-content" data-mail-test-token="{mailTestToken}">
<div class="t3js-mailTest-output"></div>
<f:if condition="{isSendPossible}">
<form id="t3js-mailTest-form" spellcheck="false">
<div class="form-group">
<label class="form-label" for="t3-install-checkmail">Email address:</label>
<input
id="t3-install-checkmail"
type="email"
class="t3-install-form-input-text form-control t3js-mailTest-email"
required
/>
</div>
</form>
</f:if>
</div>
</html>
@@ -0,0 +1,7 @@
<html xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" data-namespace-typo3-fluid="true">
<div id="phpinfo">
<i:phpInfo/>
</div>
</html>
@@ -0,0 +1,62 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" data-namespace-typo3-fluid="true">
<table class="table table-striped table-bordered">
<tr>
<td>Operating system:</td>
<td><strong>{systemInformationOperatingSystem}</strong></td>
</tr>
<tr>
<td>PHP version:</td>
<td>
<strong>{phpVersion}</strong>
</td>
</tr>
<tr>
<td>PHP CGI detected:</td>
<td><strong>{f:if(condition:systemInformationCgiDetected, then:'Yes', else:'No')}</strong></td>
</tr>
<f:if condition="{systemInformationDatabaseConnections -> f:count()} > 1">
<tr>
<td>Number of database connections:</td>
<td><strong>{systemInformationDatabaseConnections -> f:count()}</strong></td>
</tr>
</f:if>
<f:for each="{systemInformationDatabaseConnections}" as="connection">
<tr>
<td>Database connection <strong>'{connection.connectionName}'</strong></td>
<td>
<ul>
<li><strong>Database name:</strong> {connection.databaseName}</li>
<li><strong>Username:</strong> {connection.username}</li>
<li><strong>Host:</strong> {connection.host}</li>
<f:if condition="{connection.port}">
<f:then>
<li><strong>Port:</strong> {connection.port}</li>
</f:then>
<f:else>
<li>
<strong>Socket:</strong>
{f:if(condition:connection.socket, then: '{connection.socket}', else:'<em>PHP default</em>')}
</li>
</f:else>
</f:if>
<li>
<strong>Version:</strong> {connection.version}
</li>
<li><strong>Tables:</strong> {connection.numberOfTables}</li>
<f:if condition="{connection.numberOfMappedTables}">
<f:then>
<li><strong>Mapped tables:</strong> {connection.numberOfMappedTables}</li>
</f:then>
</f:if>
</ul>
</td>
</tr>
</f:for>
<tr>
<td>Application Context:</td>
<td><strong class="text-{systemInformationApplicationContext.status}">{systemInformationApplicationContext.context}</strong></td>
</tr>
</table>
</html>