<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Releases &#8211; Aimeos</title>
	<atom:link href="https://aimeos.org/tips/category/releases/feed/" rel="self" type="application/rss+xml" />
	<link>https://aimeos.org/tips</link>
	<description>ultra fast PHP e-commerce framework</description>
	<lastBuildDate>Wed, 09 Apr 2025 13:28:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.7.8</generator>

<image>
	<url>https://aimeos.org/tips/wp-content/uploads/2019/09/Aimeos_e_200-100x104.png</url>
	<title>Releases &#8211; Aimeos</title>
	<link>https://aimeos.org/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Aimeos 2025.04 &#8211; First stable release in 2025</title>
		<link>https://aimeos.org/tips/aimeos-2025-04-first-stable-release-in-2025/</link>
					<comments>https://aimeos.org/tips/aimeos-2025-04-first-stable-release-in-2025/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 13:28:48 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=1049</guid>

					<description><![CDATA[With 2025.04, the first stable release of the Aimeos e-commerce framework for 2025 is available now. It&#8217;s a new major release with some breaking changes, rewritten code and includes: Full translations of frontend and backend in over 30 languages Removed<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2025-04-first-stable-release-in-2025/">Read more <span class="screen-reader-text">Aimeos 2025.04 &#8211; First stable release in 2025</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>With 2025.04, the first stable release of the Aimeos e-commerce framework for 2025 is available now. It&#8217;s a new major release with some breaking changes, rewritten code and includes:</p>



<ul><li>Full translations of frontend and backend in over 30 languages</li><li>Removed jQuery completely</li><li>Feature complete GraphQL API</li><li>Merged all types into single table</li><li>Moved stored baskets to own domain</li></ul>



<h2>Translations in over 30 languages</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags.png"><img src="https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags.png" alt="" class="wp-image-1050" width="256" height="256" srcset="https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags.png 1024w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-768x768.png 768w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-200x200.png 200w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-450x450.png 450w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-600x600.png 600w, https://aimeos.org/tips/wp-content/uploads/2025/04/globe-flags-900x900.png 900w" sizes="(max-width: 256px) 100vw, 256px" /></a></figure></div>



<p>The Aimeos 2025.04 release takes global accessibility to the next level with translations now available in over <strong>30 languages</strong>, ensuring users across the world can seamlessly manage their e-commerce platforms as well as buying products or services.</p>



<p>This includes widely spoken languages such as <strong>Chinese, French, German, Spanish, Russian, and Arabic</strong>, as well as regionally significant ones like <strong>Hungarian, Portuguese (Brazilian and European), Romanian, Turkish, Bulgarian, Dutch, Italian, Slovak, Slovenian, Polish, Ukrainian, Estonian, Finnish, Japanese, Greek, and Indonesian</strong>. Additionally, support has been extended to <strong>Nordic and Baltic languages</strong> including <strong>Danish, Swedish, Norwegian Bokmål, Latvian, and Lithuanian</strong>, along with <strong>Czech and Korean</strong>, making Aimeos one of the most internationally inclusive e-commerce solutions to date.</p>



<h2>No more jQuery code in the backend</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed.png"><img src="https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed.png" alt="" class="wp-image-1051" width="256" height="256" srcset="https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed.png 1024w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-768x768.png 768w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-200x200.png 200w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-450x450.png 450w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-600x600.png 600w, https://aimeos.org/tips/wp-content/uploads/2025/04/jquery-removed-900x900.png 900w" sizes="(max-width: 256px) 100vw, 256px" /></a></figure></div>



<p>Now, <strong>jQuery has been completely removed</strong> from the code base, marking a significant milestone in modernizing the platform. On the <strong>frontend</strong>, this transition began earlier with the adoption of the lightweight and efficient <strong>cash-dom</strong> library, providing a seamless jQuery-like API without the overhead.</p>



<p>Now, the <strong>backend</strong> has also been fully refactored to use <strong>VueJS 3</strong> and <strong>vanilla JavaScript</strong>, ensuring faster performance, better maintainability, and full compatibility with modern development practices. Even complex UI elements like <strong>tree components</strong> have been reimplemented without jQuery, offering a cleaner and more responsive admin experience.</p>



<h2>GraphQL API &#8211; feature complete</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png"><img src="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png" alt="" class="wp-image-402" width="200" height="200" srcset="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png 400w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-200x200.png 200w" sizes="(max-width: 200px) 100vw, 200px" /></a></figure></div>



<p>With the new release, the <strong>GraphQL admin API is now fully feature complete</strong>, offering a modern, efficient, and consistent interface for managing all backend data. The latest update adds support for <strong>searching category and site trees</strong>, further enhancing flexibility and usability for developers.</p>



<p>As a result, the legacy <strong>JSON admin API has been removed by default</strong> to streamline the platform, but for those who need additional time to transition, the corresponding package can still be <strong>installed in addition</strong>. This marks a major step forward in making Aimeos more scalable, future-proof, and aligned with industry standards.</p>



<h2>Single domain for types</h2>



<p>All <strong>type tables </strong>across data domains have been<strong> unified into a single table</strong> under the new <strong>&#8220;type&#8221; domain</strong>, significantly reducing the amount of code and enabling centralized management of type entries. This structural simplification enhances maintainability and consistency across the system.</p>



<p>As part of this change, the former <code><em>domain</em></code> property of type items has been replaced by the actual data domain to which the types belong. To maintain separation where necessary — such as distinguishing between different <strong>product list types</strong> in product detail sub-panels — <strong>additional configuration</strong> is now required, offering both flexibility and clearer context-specific behavior.</p>



<h2>Moved baskets to own data domain</h2>



<p>Stored baskets have been moved from the order domain to a <strong>dedicated &#8220;basket&#8221; domain</strong>, bringing significant improvements in both <strong>performance and scalability</strong>. By decoupling baskets from orders, they can now be stored in a <strong>separate database instance</strong>, reducing resource contention and enabling more efficient scaling — especially in high-traffic environments. This architectural change ensures smoother handling of active user sessions without impacting order processing, making the system more robust and responsive.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2025-04-first-stable-release-in-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2024.10 LTS</title>
		<link>https://aimeos.org/tips/aimeos-2024-10-lts/</link>
					<comments>https://aimeos.org/tips/aimeos-2024-10-lts/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 30 Oct 2024 08:54:34 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=1031</guid>

					<description><![CDATA[The 2024.10 release for Laravel and TYPO3 with long term support offers some exciting new features and a lot of internal improvements to make live of developers easier than ever before. The highlights of this release are: AI-based image generation<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2024-10-lts/">Read more <span class="screen-reader-text">Aimeos 2024.10 LTS</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The 2024.10 release for Laravel and TYPO3 with long term support offers some exciting new features and a lot of internal improvements to make live of developers easier than ever before. The highlights of this release are:</p>



<ul><li>AI-based image generation and background removal</li><li>Extended JSON:API and GraphQL API</li><li>Laravel Octane support</li><li>TYPO3 v13 support</li><li>Simplified managers</li><li>Improved frontend and backend</li></ul>



<span id="more-1031"></span>



<h2>AI-based image generation and background removal</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation.png"><img src="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation.png" alt="" class="wp-image-1032" width="250" height="150" srcset="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation.png 1000w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-product-image-generation-900x540.png 900w" sizes="(max-width: 250px) 100vw, 250px" /></a></figure></div>



<p>This release introduces an AI-based image generation feature to create images for categories and CMS articles automatically based on the prompt provided by the editor. This can generate appealing visuals for e.g. cover images quickly without the need of a designer when used correctly. The feature is based on the OpenAI Dall-e 3 API and requires a paid OpenAI account.</p>



<p>Also, Aimeos now includes an automatic background removal feature for newly uploaded (product) images. Before, removing backgrounds was a labor intensive task for designers using expensive Adobe suites but now, it&#8217;s done in a matter of seconds and works with humans and products in the front. It uses the RemoveBG API and also requires a paid account for high resolution images.</p>



<h2>Extended JSON:API and GraphQL API</h2>



<p>After the last release has improved the API documentation, the current version extended the JSON REST and GraphQL APIs.</p>



<p>The JSON:API includes the possibility to fetch type items for attributes, products, services and stocks on request. You only need to add <code>attribute.type</code>, <code>product.type</code>, <code>service.type</code> or <code>stock.type</code> to the &#8220;include&#8221; parameter of the relevant JSON REST URLs, e.g. <code>&amp;include=attribute.type</code> for attribute endpoint requests. This will return the type item(s) for the attributes in the <code>included</code> section of the response and contains e.g. the translation of types for each language.</p>



<p>The GraphQL API has been extended be able to return and update all order related information. Now it&#8217;s possible to manage orders completely by the GraphQL API instead of just retrieving basic information from orders.</p>



<h2>Laravel Octane support</h2>



<div class="wp-block-image"><figure class="alignleft size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png"><img width="126" height="130" src="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png" alt="" class="wp-image-863" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png 126w, https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6-100x103.png 100w" sizes="(max-width: 126px) 100vw, 126px" /></a></figure></div>



<p>Aimeos is already known for its ultra fast response times and the support for Laravel Octane in combination with Swoole or Roadrunner takes this to a new level! The Laravel and Aimeos application is always kept in memory and only the scoped services and the request object are passed to the application on each browser request. Thus, the whole bootstrapping of Laravel is only done on start-up.</p>



<p>Performance tests have shown that when using a Laravel Octane based setup, you can get response times down to 20ms very easily and it can triple the number of concurrent request on your existing hardware.</p>



<h2>TYPO3 v13 support</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png" alt="" class="wp-image-864" width="128" height="128" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png 128w, https://aimeos.org/tips/wp-content/uploads/2021/10/typo3-100x100.png 100w" sizes="(max-width: 128px) 100vw, 128px" /></a></figure></div>



<p>The Aimeos TYPO3 extensions supports TYPO3 v13.4+ now, the latest LTS release of the TYPO3 CMS. It&#8217;s available as composer package, TER extension and as TYPO3 distribution. If you plan to use one or more payment providers, using the composer based package or distribution should be preferred.</p>



<p>As the relevant changes in TYPO v13 are supported by v12 LTS too, the new version of the Aimeos TYPO3 extension is still backward compatible to TYPO3 v12.4.x. That allows you to upgrade to the latest Aimeos release without the need to upgrade the TYPO3 CMS installation too.</p>



<h2>Simplified managers</h2>



<p>A lot of work has been done to simplify the managers in the Aimeos core. Before, creating a new manager using lists of referenced items and properties required writing a lot of code. Now, the code for retrieving and fetching those dependent items is part of decorator classes which can be wrapped around every manager just by configuration. For example, the decorator configuration for the product manager is now:</p>



<pre class="wp-block-preformatted">'mshop' =&gt; [
    'product' =&gt; [
        'manager' =&gt; [
            'decorators' =&gt; [
                'global' =&gt; [
                    'Lists' =&gt; 'Lists',
                    'Property' =&gt; 'Property',
                    'Type' =&gt; 'Type',
                    'Site' =&gt; 'Site',
                ],
            ],
        ]
    ]
]</pre>



<p>These settings wrap the &#8220;Lists&#8221;, &#8220;Property&#8221;, &#8220;Type&#8221; and &#8220;Site&#8221; decorators around the product manager to fetch and retrieve the connected items. For managers which has addresses attached, there&#8217;s also an &#8220;Address&#8221; decorator available. Almost all managers of the Aimeos core have been rewritten to use the decorators and we were able to remove several thousand lines of code.</p>



<h2>Improved backend and frontend</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api.png"><img src="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api.png" alt="" class="wp-image-1038" width="250" height="150" srcset="https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api.png 1000w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/10/admin-settings-api-900x540.png 900w" sizes="(max-width: 250px) 100vw, 250px" /></a></figure></div>



<p>To simplify configuration of AI-based services for each site, a new sub-panel has been added to the &#8220;Settings&#8221; panel. There, site administrators can add the API keys and other relevant configuration settings for the DeepL, OpenAI and RemoveBG APIs. Configuration for other APIs can be added easily by implementing a new sub-part for the settings/api sub-panel and a custom template for the necessary fields.</p>



<p>Also, the product sub-panel in the catalog and supplier panels have been rewritten to support document based storage like ElasticSearch now. During that change, the filtering for items has been removed because it was based on the database queries of the lists managers, which are not available in a document-oriented storage.</p>



<p>The frontend got some minor improvements and a new feature for removing all items in the basket at once, so users are not required to delete every line separately any more.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2024-10-lts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2024.07 release</title>
		<link>https://aimeos.org/tips/aimeos-2024-07-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2024-07-release/#comments</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 24 Jul 2024 09:35:17 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=1024</guid>

					<description><![CDATA[The 2024.07 release completes the GraphQL API and adds some nice features to Aimeos. In addition, we&#8217;ve invested a lot of time to improve the documentation of the GraphQL and JSON APIs: GraphQL file uploads and new index query Extended<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2024-07-release/">Read more <span class="screen-reader-text">Aimeos 2024.07 release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg" alt="" class="wp-image-887" width="1200" height="630" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>



<p>The 2024.07 release completes the GraphQL API and adds some nice features to Aimeos. In addition, we&#8217;ve invested a lot of time to improve the documentation of the GraphQL and JSON APIs:</p>



<ul><li>GraphQL file uploads and new index query</li><li>Extended GraphQL and JSON:API documentation</li><li>Custom address types</li><li>Full time support in subscriptions</li><li>Multiple mailer support in Laravel</li></ul>



<span id="more-1024"></span>



<h2>GraphQL API improvements</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png"><img src="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png" alt="" class="wp-image-402" width="200" height="200" srcset="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png 400w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-200x200.png 200w" sizes="(max-width: 200px) 100vw, 200px" /></a></figure></div>



<p>The GraphQL admin API will replace the existing JSON admin API completely beginning in 2025. The JS code of the Aimeos admin backend is rewritten step by step to use the GraphQL API only and thus, the GraphQL admin API has been further improved and is now almost feature complete.</p>



<p>The latest additions contain a new GraphQL index query that allows aggregating products matched by filters for counting or of aggregation. Also, The API supports uploading media files now &#8211; a feature, that&#8217;s not available in the the old JsonAdm API.</p>



<p>Until 2025, the remaining code that uses the JsonAdm API will be rewritten and the JsonAdm API will be finally removed.</p>



<h2>API documentation</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql.png"><img src="https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-1024x671.png" alt="" class="wp-image-1025" width="256" height="168" srcset="https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-1024x671.png 1024w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-300x197.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-768x504.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-100x66.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-150x98.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-200x131.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-450x295.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-600x393.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql-900x590.png 900w, https://aimeos.org/tips/wp-content/uploads/2024/07/aimeos.org_docs_latest_admin_graphql.png 1220w" sizes="(max-width: 256px) 100vw, 256px" /></a></figure></div>



<p>We&#8217;ve put a lot of effort in improving the API documentation for the GraphQL and JSON REST API.</p>



<p>Especially, the examples have been improved and they include vanilla Javascript code for the JSON API and JQAdm code the GraphQL admin API now. This enables developers of any skill level to get code for working requests quickly. Furthermore, existing examples have been improved to show how related items can be fetched too and how they are returned.</p>



<p>All new queries and mutations available in 2024.07 has been documented too in the <a href="https://aimeos.org/docs/latest/admin/graphql/">GraphQL admin API</a> and <a href="https://aimeos.org/docs/latest/frontend/jsonapi/">JSON REST API</a> documentation.</p>



<h2>Custom addess types</h2>



<p>Up to now, it was possible to add addresses to customers and suppliers but they had a fixed meaning. For customers, the addresses are treated as delivery addresses while for suppliers, the addresses are locations for stores or with a similar meaning.</p>



<p>Now, the customer and supplier address tables contains a new &#8220;type&#8221; column that can contain any string to distinguish the different addresses stored there. This is especially useful in heavily customized setups which includes non-standard use cases, e.g. for complex B2B applications and marketplaces.</p>



<h2>Time support in subscriptions</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription.png"><img src="https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription.png" alt="" class="wp-image-1026" width="250" height="150" srcset="https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription.png 1000w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/07/admin-product-subscription-900x540.png 900w" sizes="(max-width: 250px) 100vw, 250px" /></a></figure></div>



<p>The Aimeos backend supported entering hours for subscriptions already in the past but the rest of the code wasn&#8217;t fully prepared to copy with subscriptions that should be only available for one or more hours.</p>



<p>Now, this feature is completely available in the whole code base including renewal of subscriptions after one hour if configured in the product subscription settings.</p>



<h2>Multiple mailer support</h2>



<p>In case you need to use different mail servers for sending e-mails depending on their purpose, Aimeos does support them now &#8211; at least if you are using Laravel. The <em>mail()</em> method of the Aimeos context object accepts the name of the mailer configuration now and returns the mailer object which uses the corresponding configuration. Existing code isn&#8217;t affected because the new parameter is optional and the default mailer is returned as before if no parameter is passed.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2024-07-release/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2024.04 release</title>
		<link>https://aimeos.org/tips/aimeos-2024-04-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2024-04-release/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 24 Apr 2024 06:31:41 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=1015</guid>

					<description><![CDATA[The first stable release of the Aimeos ecommerce framwork for Laravel and TYPO3 in 2024 offers a whole bunch of updates compared to previous versions and is prepared for the upcoming accessibility requirements in the EU. The most important features<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2024-04-release/">Read more <span class="screen-reader-text">Aimeos 2024.04 release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The first stable release of the Aimeos ecommerce framwork for Laravel and TYPO3 in 2024 offers a whole bunch of updates compared to previous versions and is prepared for the upcoming accessibility requirements in the EU. The most important features and changes are:</p>



<ul><li>Full Laravel 11 support</li><li>WCAG AAA compatible template</li><li>Top-level URLs for products/categories/pages</li><li>Product CSV upload in backend and imports per site</li><li>VueJS 3 in admin backend with locally bundled JS libs</li><li>Improved GraphQL admin API</li><li>Simplifications for developers</li></ul>



<span id="more-1015"></span>



<h2>Full Laravel 11 support</h2>



<div class="wp-block-image"><figure class="alignright size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png"><img width="126" height="130" src="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png" alt="" class="wp-image-863" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png 126w, https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6-100x103.png 100w" sizes="(max-width: 126px) 100vw, 126px" /></a></figure></div>



<p>The Aimeos Laravel package has support for Laravel 11 since its release a month ago. The number of breaking changes in Laravel 11 had been low so adapting the package was possible immediately.</p>



<p>Now, with the Aimeos 2024.04 release, the Aimeos shop distribution as well as the Aimeos headless distribution are based on Laravel 11 too. The most important change in Laravel 11 is the simplified ./app/ directory but the old structure is still supported. Only the AuthServiceProvider class isn&#8217;t used any more.</p>



<h2>WCAG AAA compatible template</h2>



<div class="wp-block-image"><figure class="alignleft size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2024/04/wcag22AAA.svg"><img width="368" height="130" src="https://aimeos.org/tips/wp-content/uploads/2024/04/wcag22AAA.svg" alt="" class="wp-image-1016"/></a></figure></div>



<p>Starting in 2025, almost all companies in the EU need to have accessible web sites which can be used by handicapped persons too. The W3C Web Content Accessibility Guidelines provides useful help to comply to the required accessibility standards.</p>



<p>The default Aimeos theme as well as the <a rel="noreferrer noopener" href="https://aimeos.com/extensions#c759" target="_blank">Berlin theme for marketplaces</a> is now prepared for WCAG 2.2 AAA. Most of the required changes related to controls, buttons and other active elements which needs to be big enough for easy usage.</p>



<h2>Top-level URLs for categories/products/pages</h2>



<p>The Aimeos Laravel package and the Aimeos shop distribution based on Laravel support now URL segments without sub-paths. Than means, you can have URLs like /<code>sneakers</code>, <code>/nice-blue-top-sneaker</code> and <code>/contact</code> as URLs for categories, products and CMS content pages.</p>



<p>All those top-level URLs are handled by the ResolveController, which checks if a category, product or CMS page with that URL segment exists. This feature isn&#8217;t enabled by default because it requires additional database queries to check what type of entity is assigned to that URL segment. The README of the <a rel="noreferrer noopener" href="https://github.com/aimeos/#multi-routing" target="_blank">Aimeos shop distribution</a> contains a section how to enable the multi-routing feature.</p>



<h2>Product CSV upload in backend and imports per site</h2>



<div class="wp-block-image"><figure class="alignright size-medium"><a href="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload.png"><img width="300" height="150" src="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-300x150.png" alt="" class="wp-image-1018" srcset="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-300x150.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-1024x512.png 1024w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-768x384.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-1536x768.png 1536w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-100x50.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-150x75.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-200x100.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-450x225.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-600x300.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload-900x450.png 900w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-product-csvupload.png 1600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>Product CSV upload</figcaption></figure></div>



<p>One of the major changes in Aimeos 2024.x compared to previous versions is that CSV and XML files can now be imported per site in multi-site environments. Therefore, the files must be stored in sub-directories of the product, catalog, supplier, etc. directories named after the code of the site to import the files for within the fs-import file system.</p>



<p>That change allowed to implement uploading CSV files in the product list panel. Then, these files are stored in the appropriate directory of the fs-import file system and are processed by the product CSV job controller that needs to be executed regularly by a cron job because of time and memory constraints in HTTP requests.</p>



<h2>VueJS 3 in admin backend with locally bundled JS libs</h2>



<div class="wp-block-image"><figure class="alignleft size-medium"><a href="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard.png"><img width="300" height="240" src="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-300x240.png" alt="" class="wp-image-1019" srcset="https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-300x240.png 300w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-1024x819.png 1024w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-768x614.png 768w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-1536x1229.png 1536w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-100x80.png 100w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-150x120.png 150w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-200x160.png 200w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-450x360.png 450w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-600x480.png 600w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard-900x720.png 900w, https://aimeos.org/tips/wp-content/uploads/2024/04/admin-dashboard.png 2000w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>Aimeos admin dashboard</figcaption></figure></div>



<p>The Aimeos admin backend has been rewritten and uses VueJS 3.x for the dynamic features now. You will only notice the upgrade of the VueJS library if you have overwritten parts of the admin backend with custom templates. The code for initializing the VueJS apps must be different now as well as inline templates are not supported any more.</p>



<p>Instead of using the JS files from a content delivery network, they are now bundled by NPM and included from the local file system. This reduces the dependency from external CDNs, supports environment without internet connections and the bundled files are also smaller which improves the loading time.</p>



<h2>Improved GraphQL admin API</h2>



<div class="wp-block-image"><figure class="alignright size-thumbnail"><a href="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png"><img width="150" height="150" src="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-150x150.png" alt="" class="wp-image-402" srcset="https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql-200x200.png 200w, https://aimeos.org/tips/wp-content/uploads/2019/09/grapgql.png 400w" sizes="(max-width: 150px) 100vw, 150px" /></a></figure></div>



<p>The Aimeos GraphQL API is now almost feature complete. It can handle the necessary requests to fetch and manage all resources including the aggregations required for the dashboard. Compared to previous versions, the API supports getting the total number of items too. Only file uploads for the media resources are missing and will be added in the next version.</p>



<p>Beginning of 2025, the existing JSON admin API will be deprecated and removed in later versions so you should use the <a rel="noreferrer noopener" href="https://aimeos.org/docs/latest/admin/graphql/" target="_blank">GraphQL API in the backend</a> from now on. The <a rel="noreferrer noopener" href="https://aimeos.org/docs/latest/frontend/jsonapi/" target="_blank">JSON API for the frontend</a> won&#8217;t be affected in any way and is the only supported option for fetching data for building your own frontend.</p>



<h2>Simplifications for developers</h2>



<p>We always work hard to make things as simple as possible for developers using Aimeos for their own projects. Creating new managers required to write a lot of code in the past but now, it has become very simple. The article about <a rel="noreferrer noopener" href="https://aimeos.org/docs/latest/models/create-managers/" target="_blank">implementing new managers</a> describes the few steps with examples that are required to create the necessary migration and the manager class which defines the properties.</p>



<p>In the HTML frontend, the address sections in the checkout process and the account profile page have been unified and use a common address partial now. Thus, they can be configured using the same settings now but that required renaming the existing configuration options.</p>



<p>To simplify the structure, the controller/common and controller/jobs code in the ai-controller-jobs extension has been merged and the controller/common code from the aimeos-core package has been moved to the media and order managers where they belong to.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2024-04-release/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2023.10 LTS release</title>
		<link>https://aimeos.org/tips/aimeos-2023-10-lts-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2023-10-lts-release/#comments</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 25 Oct 2023 08:23:40 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=1005</guid>

					<description><![CDATA[The 2023.10 version of the Aimeos e-commerce framework for Laravel and TYPO3 is available now! Especially developers will love the 2023 version because it contains a lot of simplifications and fully supports scaleable cloud setups like Kubernetes natively. The most<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2023-10-lts-release/">Read more <span class="screen-reader-text">Aimeos 2023.10 LTS release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The 2023.10 version of the Aimeos e-commerce framework for Laravel and TYPO3 is available now! Especially developers will love the 2023 version because it contains a lot of simplifications and fully supports scaleable cloud setups like Kubernetes natively. The most important updates in 2023 are:</p>



<ul><li>Laravel 10 distributions</li><li>TYPO3 12 support</li><li>Kubernetes/Serverless support</li><li>Create managers easily</li><li>Merged order and order base</li><li>Stored basket panel</li><li>DB-based translations for type names</li><li>VueJS and GraphQL in backend</li></ul>



<span id="more-1005"></span>



<h2>Laravel 10 distributions</h2>



<div class="wp-block-image"><figure class="alignright size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png"><img width="126" height="130" src="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png" alt="" class="wp-image-863" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png 126w, https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6-100x103.png 100w" sizes="(max-width: 126px) 100vw, 126px" /></a></figure></div>



<p>Since the Laravel 10 release in February 2023, Aimeos fully supports the latest Laravel version and since 2023.04, the Aimeos headless and full stack distribution are based on Laravel 10. You can bootstrap your own Aimeos application in less than five minutes using those distributions and get a fully working Laravel 10 application. This also includes pre-configured authentication setup for both, the full stack and the headless distribution.</p>



<h2>TYPO3 12 support</h2>



<div class="wp-block-image"><figure class="alignleft size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png"><img width="128" height="128" src="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png" alt="" class="wp-image-864" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png 128w, https://aimeos.org/tips/wp-content/uploads/2021/10/typo3-100x100.png 100w" sizes="(max-width: 128px) 100vw, 128px" /></a></figure></div>



<p>Also, Aimeos 2023.x fully supports TYPO3 12.4 since it&#8217;s release in April. Many changes has happened in v12 compared to v11, especially a lot of deprecated code has been removed. This made it very hard to make Aimeos 2023.x available for TYPO3 v11 too so we&#8217;ve decided to support v12 only in that release. Therefore, if you need a feature from Aimeos 2023.x or want to upgrade after two years of free support, you must upgrade to the latest TYPO3 v12 too.</p>



<h2>Kubernetes/Serverless support</h2>



<p>We are proud to announce that Aimeos 2023+ is the first cloud-native e-commerce solution for Laravel. Everything including file imports can be distributed across any cloud environment like Kubernetes, AWS, Google Cloud, Azure or so called serverless environments now. Aimeos for Laravel is cloud-ready since the beginning and images/CSS/JS files can be stored in S3 or similar cloud storage services but files were read only from a local file system. This this year, you can store files for importing products, categories, users, etc. from any remote server regardless if they are in CSV or XML format.</p>



<p>We also moved our complete server infrastructure from traditional hosting to a private Kubernetes cloud beginning this year including the web sites, demo setups and private package repository.</p>



<h2>Create managers easily</h2>



<p>Extending existing managers is extremely simply but writing new managers for own data domains or extending existing data domains required a lot of boilerplate code in the past. Since 2023.10, creating new managers is as easy as extending managers now.</p>



<p>First of all, create a setup task for the database migration as before:</p>



<pre class="wp-block-code"><code>namespace Aimeos\Upscheme\Task;

class Test extends Base
{
    public function up()
    {
        $this-&gt;info( 'Creating test schema', 'v' );

        $this-&gt;db( 'db-test' )-&gt;table( $name, function( $table ) {
            $table-&gt;engine = 'InnoDB';

             $table-&gt;id()-&gt;primary( 'pk_mstes_id' );
             $table-&gt;string( 'siteid' );
             $table-&gt;string( 'label' )-&gt;default( '' );
             $table-&gt;int( 'position' )-&gt;default( 0 );
             $table-&gt;smallint( 'status' )-&gt;default( 1 );
             $table-&gt;meta();
         } );
    }
}</code></pre>



<p>Then, create the manager for the new domain named &#8220;test&#8221;:</p>



<pre class="wp-block-code"><code>namespace Aimeos\MShop\Test\Manager;

class Standard
    extends \Aimeos\MShop\Common\Manager\Base
    implements \Aimeos\MShop\Common\Manager\Iface
{
    public function getSaveAttributes() : array
    {
        return $this-&gt;createAttributes( &#91;
            'label' =&gt; &#91;
            ],
            'status' =&gt; &#91;
                'type' =&gt; 'int',
            ],
            'position' =&gt; &#91;
                'type' =&gt; 'int',
                'label' =&gt; 'Position for sorting'
            ],
        ] );
    }
}</code></pre>



<p>That&#8217;s all! You can work with your new manager like with any other manager from the Aimeos core:</p>



<pre class="wp-block-code"><code>$manager = \Aimeos\MShop::create( $this-&gt;context(), 'test' )

$item = $manager-&gt;create()
    -&gt;set( 'label', 'test label' )
    -&gt;set( 'position', 2 )
    -&gt;set( 'status', 1 );

$item = $manager-&gt;save( $item );

$label = $item-&gt;label;
// or using get() with default value
$label = $item-&gt;get( 'label', 'default value' );</code></pre>



<p>For more information, there&#8217;s an article about <a href="https://aimeos.org/docs/latest/models/create-managers/">creating new managers</a> in the Aimeos documentation.</p>



<h2>Merged order and order base</h2>



<p>The biggest architectural change since the beginning is simplifying the order data domain by merging the order and order base tables/managers/items. The initial idea behind was that we can have several invoice/refund entries for each stored order base item (=basket) but that turned out to not work well over the years and complicated handling orders a lot. Thus, the data is all stored in the order record now.</p>



<p>That leads to some consequences, especially for the JSON:API as this change isn&#8217;t backward compatible! An application using the JSON:API doesn&#8217;t need to use the order endpoint any more to create an order item because the basket endpoint did that already. Furthermore, the property names in the basket changed and &#8220;.base&#8221; has to be removed.</p>



<p>The JSON:API has been backward compatible for six years (2017-2022) and we want to keep v2 stable for the next 5-10 years now.</p>



<h2>Stored basket panel</h2>



<div class="wp-block-image"><figure class="alignright size-medium"><a href="https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket.png"><img width="300" height="180" src="https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-300x180.png" alt="" class="wp-image-1009" srcset="https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-1024x614.png 1024w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-1536x922.png 1536w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket-900x540.png 900w, https://aimeos.org/tips/wp-content/uploads/2023/10/saved-basket.png 2000w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure></div>



<p>Customer baskets are stored in the database during some time and now, the admin backend contains a new &#8220;Sales &gt; Baskets&#8221; Panel in the admin backend. Administrators and editors can check saved and abandoned baskets of the customers and it&#8217;s also possible to send emails to 3rd party applications for reminding customers about their abandoned carts.</p>



<h2>DB-based translations for type names</h2>



<div class="wp-block-image"><figure class="alignleft size-medium"><a href="https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations.png"><img width="300" height="180" src="https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-300x180.png" alt="" class="wp-image-1011" srcset="https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-1024x614.png 1024w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-1536x922.png 1536w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations-900x540.png 900w, https://aimeos.org/tips/wp-content/uploads/2023/10/type-translations.png 2000w" sizes="(max-width: 300px) 100vw, 300px" /></a></figure></div>



<p>Before, translations for attribute types were only possible by translating them statically the Gettext translation files or in the Aimeos configuration. Thus, only developers were able to update these translations and it was difficult to update translations if they have been delivered by ERP systems.</p>



<p>Now, type translations are saved in the database along with the types and can be edited in the admin backend and updated easily by ERP systems. This is available for all types, not only attribute types.</p>



<h2>VueJS and GraphQL in backend</h2>



<p>Several panels have been rewritten in the admin backend to use VueJS components now. This lead to better code quality and is another step forward to remove all jQuery-related code in the next versions. Also, VueJS components for which no VueJS 3 version is available has been replaced by better supported ones, namely the combo box select components which have been replaced by Vue Multiselect now. Finally, this will make the upgrade to VueJS 3 possible in the next versions.</p>



<p>Furthermore, requests to the JSON admin API has been replaced by requests to the new GraphQL API where possible. We will continue to extend the GraphQL API and replace existing JSON admin API requests until we completely phased out the JSON admin API. In 2024.x, the JSON admin API will be also marked as deprecated. The frontend JSON:API will never be replaced and will be the only way for frontends to interact with Aimeos servers as GraphQL is not suited well for read-heavy applications like e-commerce apps.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2023-10-lts-release/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2022.10 LTS release</title>
		<link>https://aimeos.org/tips/aimeos-2022-10-lts-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2022-10-lts-release/#comments</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Thu, 27 Oct 2022 07:42:15 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=966</guid>

					<description><![CDATA[The Aimeos 2022.10 version with long term support is now available for Laravel and TYPO3. It contains a lot of improvements for customers, editors, developers and marketplace owners. The most important improvements included in this release are: GraphQL admin API<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2022-10-lts-release/">Read more <span class="screen-reader-text">Aimeos 2022.10 LTS release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The Aimeos 2022.10 version with long term support is now available for Laravel and TYPO3. It contains a lot of improvements for customers, editors, developers and marketplace owners. The most important improvements included in this release are:</p>



<ul><li>GraphQL admin API</li><li>Headless Laravel distribution</li><li>Direct editing of marketplace items</li><li>Dynamic supplier filter</li><li>Customers can save baskets</li><li>Invoice numbers per site</li><li>Optimized performance</li><li>SEO and 404 improvements</li></ul>



<span id="more-966"></span>



<h2>GraphQL admin API</h2>



<p>The biggest improvement in the 2022.10 LTS realease is the GraphQL API for administration, which enables developers to manage products and other data stored in Aimeos much easier compared to the JSON REST Admin API. Especially updating several related resources can be done in one API call now instead of requiring ten or more calls. The GraphQL API is also much more aligned to document based storage like ElasticSearch.</p>



<p>A GraphQL mutation to store a new product and return its ID looks like:</p>



<pre class="wp-block-code"><code>mutation {
  saveProduct(input: {
    code: "test-graphql",
    lists: {
      media: &#91;{
        type: "test"
        item: {
          type: "download",
          url: "https://local/test.jpg",
          preview: "https://local/test-small.jpg"
          property: &#91;{
            type: "copyright",
            value: "Aimeos"
          }]
        }
      }],
      text: &#91;{
        type: "name",
        item: {
          type: "name",
          languageid: "de",
          content: "Some text"
        }
      }]
    },
    property: &#91;{
      type: "prodcode",
      value: "abcd-1234"
    }]
  }) {
    id
  }
}</code></pre>



<h2>Headless Laravel distribution</h2>



<p>The Aimeos headless distribution based on Laravel 9 is now stable and available with long term support too. It&#8217;s tailored for developers who want to build the complete frontend in Javascript using ReactJS, VueJS or any other Javascript framework. For authentication, JSON Web Tokens are used in the headless distribution and the world-class Aimeos JSON REST API offers access to the complete frontend functionality of Aimeos. </p>



<p>Get the <a href="https://github.com/aimeos/aimeos-headless">Aimeos headless distribution</a></p>



<h2>Edit marketplace items directly</h2>



<div class="wp-block-columns">
<div class="wp-block-column">
<p>In the past, editors have to switch to the site where the texts, images, attributes or other related items had been created before they could update or delete those items. Now, editors can modify or delete every item created in a sub-site of the current one directly, which is extremely handy in marketplace setups to fix items of vendors quickly!</p>



<p>For all those aggregated items (and also for inherited ones) where no space for additional information is available, the Aimeos backend displays the meta data like site, editor and creation/modification time when hovering over the item now. Therefore, you can see immediately from which site the item is coming from as well as who created/modified it and when.</p>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta.png"><img width="1000" height="600" src="https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta.png" alt="" class="wp-image-970" srcset="https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta.png 1000w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2022/10/admin-meta-900x540.png 900w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>
</div>
</div>



<h2>Dynamic supplier filter</h2>



<div class="wp-block-columns">
<div class="wp-block-column" style="flex-basis:33.33%">
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter.png"><img width="1000" height="1000" src="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter.png" alt="" class="wp-image-979" srcset="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter.png 1000w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-300x300.png 300w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-150x150.png 150w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-768x768.png 768w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-100x100.png 100w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-200x200.png 200w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-450x450.png 450w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-600x600.png 600w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-supplier-filter-900x900.png 900w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></figure>
</div>



<div class="wp-block-column" style="flex-basis:66.66%">
<p>For those who have hundreds, thousands or more suppliers/manufacturers/brands in their Aimeos installation, the new supplier filter offers searching for those items dynamically. Thus, it&#8217;s not necessary to preload a limited set of items.</p>



<p>The filter enable customers to search for any supplier based on their name and it also finds sub-strings in supplier names. The most often used suppliers are still listed first when opening the filter and found items are added at the top.</p>
</div>
</div>



<h2>Customers can save baskets</h2>



<div class="wp-block-columns">
<div class="wp-block-column">
<p>Customers can save their baskets now, which is especially useful for B2B clients who have selected the products they need for their customers and store the baskets until they get the final OK. Each basket can have a name describing the content.</p>



<p>Then, the stored baskets are listed in the profile section of the account just like for the order history. Customers can select one of the stored baskets and put all products inside into the current basket with a single click and continuing to the checkout.</p>
</div>



<div class="wp-block-column">
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save.png"><img width="1024" height="615" src="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-1024x615.png" alt="" class="wp-image-977" srcset="https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-1024x615.png 1024w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-1536x922.png 1536w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save-900x540.png 900w, https://aimeos.org/tips/wp-content/uploads/2022/10/aimeos-basket-save.png 1999w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>
</div>



<h2>Invoice numbers per site</h2>



<p>Especially for marketplaces and SaaS setups, separate sequential invoice numbers for each vendor are important for accounting reasons. In 2022.10, Aimeos adds an invoice ID column to the locale site table and creates a new, unique invoice ID for each order after the payment was successful.</p>



<p>The ID from the order table is still used to identify each order uniquely over all sites and the generated invoice ID is stored in addition in the order table. The invoice ID can also be formatted before being added to the e-mails or the PDFs by using the <em>ordernumber</em> marco:</p>



<pre class="wp-block-code"><code>use \Aimeos\MShop\Order\Item\Standard as Order;

Order::method( 'ordernumber', function( \Aimeos\MShop\Order\Item\Iface $order ) {
    return 'RE-' . date( 'Y' ) . '-' . $order-&gt;getInvoiceNumber();
} );
</code></pre>



<h2>Optimized performance</h2>



<p>Job controllers often iterate over a large result set and using the limit and offset values in <em>slice()</em> of the search filter cause long response times until the database found the requested slice. This can take several seconds if the whole result set is more than 100k rows.</p>



<p>For optimal performance, Aimeos offers a cursor based <em>iterate()</em> method in each manager now:</p>



<pre class="wp-block-code"><code>$manager = \Aimeos\MShop::create( $this-&gt;context(), 'product' );
$cursor = $manager-&gt;cursor( $manager-&gt;filter()-&gt;add( 'product.instock', '==', 1 ) );

while( $items = $manager-&gt;iterate( $cursor, &#91;'price'] ) ) {
    // process items
}</code></pre>



<p>The new <em>iterate()</em> method is most useful if you need to process a large result set completely.</p>



<p>Furthermore, the column order of all indexes in the Aimeos tables have been optimized to get the best performance for the most often used queries. Especially, MySQL uses more parts of the index now because it will use indexed columns in a combined index only as long as there&#8217;s no LIKE condition involved.</p>



<h2>SEO and 404 improvements</h2>



<p>To get the best results in Google, the schema.org markup in the list and detail views has been improved. It&#8217;s telling the search engine what&#8217;s the name, image, price and description of the product and contains now additional markup for the Google merchant listings. Furthermore, the breadcrumbs from the catalog stage component are now also machine readable for Google.</p>



<p>Before 2022.10, pages with no content or with invalid category/product IDs returned a page without content but no 404 error. This led to many pages without useful content being index by search engines. Now, all category list, product detail and CMS pages which are not available (any more) return a &#8220;404 not found&#8221; error.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2022-10-lts-release/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2022.07 release</title>
		<link>https://aimeos.org/tips/aimeos-2022-07-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2022-07-release/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 27 Jul 2022 19:16:33 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=948</guid>

					<description><![CDATA[The second stable release in 2022 contains new features and some changes/improvements for developers to keep an eye on. This version focuses on improvements for editors and on minimizing code developers have to write when creating new features in Aimeos.<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2022-07-release/">Read more <span class="screen-reader-text">Aimeos 2022.07 release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The second stable release in 2022 contains new features and some changes/improvements for developers to keep an eye on. This version focuses on improvements for editors and on minimizing code developers have to write when creating new features in Aimeos. The most important changes are:</p>



<ul><li>Bulk editing in admin backend</li><li>Customizable theme colors in backend</li><li>Uses Bootstrap icons instead of Fontawesome</li><li>No more need for factories</li><li>Scales images in media manager</li><li>More fractional quantity support</li><li>Improved debugging</li></ul>



<span id="more-948"></span>



<h2>Bulk editing</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1.jpg"><img src="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1.jpg" alt="" class="wp-image-950" width="250" height="150" srcset="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1.jpg 1000w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-300x180.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-768x460.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-100x60.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-150x90.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-200x120.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-450x270.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-600x359.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-bulk-1-900x539.jpg 900w" sizes="(max-width: 250px) 100vw, 250px" /></a></figure></div>



<p>One of the features that can simplify life of editors a lot is editing the values of several items at once. The Aimeos admin interface it&#8217;s now possible to do exactly that, not only for single values like the status, but also for multiple values in parallel with one bulk edit request.</p>



<p>For all panels, at least the basic item values can be changed as long as they must be not unique. You can add your own bulk edit options by extending the list template of the panel and add the additional code to subparts or decorators if required.</p>



<h2>Customizable theme colors</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options.png"><img src="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options.png" alt="" class="wp-image-954" width="250" height="150" srcset="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options.png 1000w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-300x180.png 300w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-768x461.png 768w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-100x60.png 100w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-150x90.png 150w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-200x120.png 200w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-450x270.png 450w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-600x360.png 600w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-theme-options-900x540.png 900w" sizes="(max-width: 250px) 100vw, 250px" /></a></figure></div>



<p>Aimeos uses <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties">CSS variables</a> to define colors and several other important values which are used at several places in the CSS files. This allows you to overwrite these values in your custom CSS file to adapt the frontend design to your needs or to the corporate identity.</p>



<p>In Aimeos 2022.07, you can change those variables not only globally but also per site and theme if you have several themes installed. Thus, each customer/company can select the theme and the appropriate colors themselves for their needs which makes Aimeos a perfect fit for building ecommerce SaaS solutions.</p>



<h2>New Bootstrap icons</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons.jpg"><img src="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-1024x614.jpg" alt="" class="wp-image-958" width="256" height="154" srcset="https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-1024x614.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-300x180.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-768x461.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-1536x922.jpg 1536w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-100x60.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-150x90.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-200x120.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-450x270.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-600x360.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons-900x540.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2022/07/admin-icons.jpg 2000w" sizes="(max-width: 256px) 100vw, 256px" /></a></figure></div>



<p>Up to now, Aimeos have used Fontawesome for all icons in frontend and backend. As new icons in Fontawesome are most often available only in their proprietary icon packages, there was time for choosing a new icon set. In the shop frontend, Fontawesome icons have been replaced in the 2022.04 release and now they are also gone in the admin backend.</p>



<p>Instead, Aimeos is using the <a href="https://icons.getbootstrap.com/">Bootstrap icons</a> now, giving the backend a cleaner, more lightweight look and feel that supports the colored theme available since 2021.</p>



<h2>Removed factories</h2>



<p>Each manager, controller and client required its own factory for creating a new object of that type. This lead to a lot of boilerplate code because the factories had mainly the same code and were just different in the used configuration options and the names of the classes. Beginning with the 2022.07 release, implementing a manager or controller for a new data domain or job as well as clients for the frontend or backend doesn&#8217;t require a supporting factory any more. </p>



<p>All objects are now created by the central factories only that have been available for a long time:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$manager</span> <span class="sy0">=</span> \Aimeos\MShop<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span> <span class="re0">$context</span><span class="sy0">,</span> <span class="st_h">'product'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$cntl</span> <span class="sy0">=</span> \Aimeos\Controller\Frontend<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span> <span class="re0">$context</span><span class="sy0">,</span> <span class="st_h">'catalog'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$cntl</span> <span class="sy0">=</span> \Aimeos\Controller\Jobs<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span> <span class="re0">$context</span><span class="sy0">,</span> <span class="re0">$aimeos</span><span class="sy0">,</span> <span class="st_h">'media/scale'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$client</span> <span class="sy0">=</span> \Aimeos\Client\Html<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span> <span class="re0">$context</span><span class="sy0">,</span> <span class="st_h">'catalog/detail'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$admin</span> <span class="sy0">=</span> \Aimeos\Admin\JQAdm<span class="sy0">::</span><span class="me2">create</span><span class="br0">&#40;</span> <span class="re0">$context</span><span class="sy0">,</span> <span class="st_h">'product'</span> <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>






<h2>Developer experience</h2>



<p>We strive for the best developer experience possible, so working with Aimeos should be as easy as possible. In that light, there are a couple of improvements available in this release.</p>



<p>Instead of using the common media contoller to work with image file, the media manager is now able to do that directly by its new <code>scale()</code> method. It offers the same features as the controller which is going to be cleansed next year.</p>



<p>Ordering fractional product quantities is supported since 2020.04 but now, you can also use fractional quantities for multi-level pricing (also known as block pricing). This gives you fine-grained control over pricing of products that can be bought in quantities of less than one or non-integer quantities.</p>



<p>For debugging purpose, all non-item objects where decorators can be added support a <code>classes()</code> method since this version. Thus, you can easily find out, which class has been used for the inner object and which decorators has been wrapped around, so identifying possible issues is now easier then before.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2022-07-release/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2022.04 release</title>
		<link>https://aimeos.org/tips/aimeos-2022-04-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2022-04-release/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Tue, 03 May 2022 16:35:51 +0000</pubDate>
				<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=926</guid>

					<description><![CDATA[The first stable release of the Aimeos e-commerce framework in 2022 contains a lot of exciting new features and changes compared to the last LTS version. Improving the developer experience further was one of the most important goals for this<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2022-04-release/">Read more <span class="screen-reader-text">Aimeos 2022.04 release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1200" height="630" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>



<p>The first stable release of the Aimeos e-commerce framework in 2022 contains a lot of exciting new features and changes compared to the last LTS version. Improving the developer experience further was one of the most important goals for this release besides more performance. All improvements are available for both, Laravel and TYPO3 and include:</p>



<ul><li>Laravel 9 LTS support</li><li>Integrated distribution based on Laravel 9</li><li>New Aimeos headless distribution built on Laravel 9</li><li>Radically simplified HTML client code base</li><li>Top scores of 100% for Google Lighthouse</li><li>Bootstrap 5 w/o jQuery</li><li>Upscheme migrations</li><li>Higher performance</li></ul>



<span id="more-926"></span>



<h2>Laravel 9</h2>



<div class="wp-block-image"><figure class="alignright size-full is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2022/05/laravel.svg"><img src="https://aimeos.org/tips/wp-content/uploads/2022/05/laravel.svg" alt="" class="wp-image-939" width="250" height="260"/></a></figure></div>



<p>Aimeos is the first full-featured e-commerce framework supporting the new Laravel 9 release with long term support (LTS) since beginning of April 2022. The biggest changes necessary for moving to the new Laravel release have been the migration from Swiftmailer to the Symfony mailer package and to FlySystem v3 for file access. </p>



<p>Together with the <a href="https://github.com/aimeos/aimeos-laravel">Aimeos Laravel 2022.04 package</a> which can be added to every existing Laravel 9 installation, the integrated <a href="https://github.com/aimeos/aimeos">Aimeos distribution</a> is now also based on Laravel 9 LTS. The distribution includes shop and CMS features and you can create a ready to use online shop. Simply execute this on the command line if PHP and the composer package manager are installed:</p>



<pre class="wp-block-code"><code>php composer create-project aimeos/aimeos myshop</code></pre>



<p>In addition, there&#8217;s now a Laravel 9 based <a href="https://github.com/aimeos/aimeos-headless">Aimeos headleass distribution</a> available too. This distribution is especially suited for building your own progressive web application based on ReactJS, VueJS or any other JS frontend framework. It includes the admin backend and the world-class <a href="https://aimeos.org/docs/latest/frontend/jsonapi/">Aimeos JSON REST API</a> but not the traditional HTML frontend. Also, it comes with the pre-configured <a href="https://jwt-auth.readthedocs.io/">JSON web token (JWT) package for Laravel</a> installed for authenticating frontend users.</p>



<h2>Developer experience</h2>



<p>We&#8217;ve put a lot of effort into improving the experience for developers, especially the need to write less boilerplate code when implementing own HTML clients. Thus, the necessary code for adding a new HTML component in the frontend is now reduced to the bare minimum. You only need to write the code you really need now and additional methods are not required any more because there are default implementations available for them.</p>



<p>Additionally, the directory structure has been simplified as much as possible. Methods have been shortend and the most important ones only consists of a single word now. A few examples of renamed methods are:</p>



<ul><li>getContext() -&gt; context()</li><li>getBody() -&gt; body()</li><li>addData() -&gt; data()</li><li>&#8230;</li></ul>



<p>For a full list of breaking changes compared to the 2021.10 LTS version, please have a look into the <a href="https://aimeos.org/docs/latest/changelog/2022.x/">Aimeos changelog </a>in the documentation.</p>



<h2>Google Lighthouse scores</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse.png"><img src="https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-1024x538.png" alt="" class="wp-image-933" width="512" height="269" srcset="https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-1024x538.png 1024w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-300x158.png 300w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-768x403.png 768w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-100x53.png 100w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-150x79.png 150w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-200x105.png 200w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-450x236.png 450w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-600x315.png 600w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse-900x473.png 900w, https://aimeos.org/tips/wp-content/uploads/2022/05/aimeos-lighthouse.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>Aimeos already achieved top scores for desktops in the past but for mobile devices, the performance score reached a maximum value of 70. Several changes have increased the score to almost 100 now.</p>



<p>The most important change was to split up the three main Aimeos CSS and JS files into one CSS/JS file per component. Now, all <a href="https://github.com/aimeos/ai-client-html/tree/master/themes/client/html/default">CSS rules and Javascript code</a> that is used solely by e.g. the catalog detail component has been moved the their own catalog-detail.css and catalog-detail.js file. They are only sent to the browser if the catalog detail component is used at the requested page. Therefore, the browser doesn&#8217;t need to fetch and parse unused CSS/JS code any more which can shorten page loads drastically especially on slow devices/networks.</p>



<p>Furthermore, the used Slick slider contains a lot of JS code which is executed after the document is fully loaded. This increases the &#8220;time to interactive&#8221; until the users can interact with the page but it&#8217;s a crucial value for Google Lighthouse and heavily affects the score. Now, Aimeos uses <a href="https://swiffyslider.com/">SwiffySlider</a>, a slider based on CSS animations with only very little JS code. It&#8217;s feature-rich, supports touch out of the box and has very little negative effect on performance.</p>



<h2>Bootstrap / jQuery</h2>



<p>Bootstrap 5 has been used in the backend since 2021.04 and now, the default frontend theme has switched to Bootstrap 5 too. This allowed us to dump the jQuery library in favor of vanilla Javascript but that turned out to be much more code than before. Here&#8217;s a code example for jQuery and vanilly JS:</p>



<pre class="wp-block-code"><code>// jQuery
$('.class')

// vanilla JS
document.querySelectorAll('.class')</code></pre>



<p>Vanilly JS is rather inconvenient compared to the terse code you can write with jQuery. To get short code without the bloat of jQuery, we now use the <a href="https://github.com/fabiospampinato/cash">Cash DOM library</a> as instead. It offers the same syntax as jQuery for the &#8220;$&#8221; function and the collection methods but doesn&#8217;t contain the compatibility code for old browsers and uses native browser functionality instead. It also requried to use the new JS fetch API offered natively by modern browsers instead of the jQuery get()/post() methods.</p>



<h2>Upscheme migrations</h2>



<p>Since 2022.01, Aimeos uses <a href="https://upscheme.org">Upscheme</a> for migrating the database schema and the data itself. Compared to using Doctrine DBAL directly, this reduced the required lines of code drastically up to 80% and creating/updating a table now looks like:</p>



<pre class="wp-block-code"><code>$this-&gt;db( 'db-message' )-&gt;table( 'message', function( Table $t ) {
        $t-&gt;id();
        $t-&gt;type();
        $t-&gt;string( 'label' );
        $t-&gt;bool( 'status' );
        $t-&gt;meta();
} );</code></pre>



<p>All setup tasks are now located in the <code>setup</code> directory of the Aimeos core and the Aimeos extensions. There&#8217;s already an <a href="https://aimeos.org/tips/aimeos-2022-news/">Upscheme article </a>available which explains how to implement setup tasks in Aimeos 2022.x and later.</p>



<h2>Performance</h2>



<p>To increase performance of Aimeos further, the underlying data structure has been modified. Before, products has been referenced in the <code>mshop_catalog_list</code> table by categories and in the <code>mshop_supplier_list</code> table by suppliers. This required fetching categories and suppliers for products in two separate queries and especially for document-oriented storages like ElasticSearch, it enforced updating the documents two times.</p>



<p>Now, categories and suppliers are attached to products instead of the other way round, so only one additional query per domain is needed to fetch that data for the frontend. It&#8217;s now perfectly in line with document-oriented storages can reduce indexing time drastically.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2022-04-release/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2022 news</title>
		<link>https://aimeos.org/tips/aimeos-2022-news/</link>
					<comments>https://aimeos.org/tips/aimeos-2022-news/#respond</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Thu, 10 Feb 2022 08:46:24 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=896</guid>

					<description><![CDATA[Since 2022.01 beta, the Aimeos core is using Upscheme for updating the database schema and migrating data between new releases. Upscheme is composer package for schema management based on Doctrine DBAL which offers an easy to use API. You can<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2022-news/">Read more <span class="screen-reader-text">Aimeos 2022 news</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1200" height="630" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>



<p>Since 2022.01 beta, the Aimeos core is using <a href="https://upscheme.org">Upscheme</a> for updating the database schema and migrating data between new releases. Upscheme is composer package for schema management based on Doctrine DBAL which offers an easy to use API. You can also <a href="https://upscheme.org/#integrating-upscheme" data-type="URL" data-id="https://upscheme.org/#integrating-upscheme">integrate Upscheme it in your own application</a> easily and this article explains the differences and how you can write migrations with only a few lines of code <img src="https://s.w.org/images/core/emoji/13.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<span id="more-896"></span>



<h2>Why Upscheme</h2>



<p>Whenever you need to upgrade database schemas in more than one installation and your application supports more than one database (even MySQL and MariaDB differ in some details), you need a tool for schema management. And even if you only support one database vendor, it simplifies live because you don&#8217;t have to create messy custom scripts with raw SQL statements.</p>



<p>Aimeos used the Doctrine DBAL API directly up to 2021.10 LTS but DBAL has a very verbose API and requires a lot of code to do simple things. For example, creating/updating a table usually looks similar to these lines:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$dbalManager</span> <span class="sy0">=</span> <span class="re0">$conn</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>createSchemaManager<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$from</span> <span class="sy0">=</span> <span class="re0">$manager</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>createSchema<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$to</span> <span class="sy0">=</span> <span class="re0">$manager</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>createSchema<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span> <span class="re0">$to</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>hasTable<span class="br0">&#40;</span> <span class="st_h">'test'</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="re0">$table</span> <span class="sy0">=</span> <span class="re0">$to</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>getTable<span class="br0">&#40;</span> <span class="st_h">'test'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
	<span class="re0">$table</span> <span class="sy0">=</span> <span class="re0">$to</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>createTable<span class="br0">&#40;</span> <span class="st_h">'test'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addOption<span class="br0">&#40;</span> <span class="st_h">'engine'</span><span class="sy0">,</span> <span class="st_h">'InnoDB'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'id'</span><span class="sy0">,</span> <span class="st_h">'integer'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'autoincrement'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw4">true</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'domain'</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'length'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">32</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span> <span class="re0">$conn</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>getDatabasePlatform<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>getName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="st_h">'mysql'</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'code'</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'length'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">64</span><span class="sy0">,</span> <span class="st_h">'customSchemaOptions'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="br0">&#91;</span><span class="st_h">'charset'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'binary'</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
	<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'code'</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'length'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">64</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'label'</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'length'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">255</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'pos'</span><span class="sy0">,</span> <span class="st_h">'integer'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'default'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">0</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'status'</span><span class="sy0">,</span> <span class="st_h">'smallint'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'mtime'</span><span class="sy0">,</span> <span class="st_h">'datetime'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'ctime'</span><span class="sy0">,</span> <span class="st_h">'datetime'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addColumn<span class="br0">&#40;</span> <span class="st_h">'editor'</span><span class="sy0">,</span> <span class="st_h">'string'</span><span class="sy0">,</span> <span class="br0">&#91;</span><span class="st_h">'length'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="nu0">255</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>setPrimaryKey<span class="br0">&#40;</span> <span class="br0">&#91;</span><span class="st_h">'id'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addUniqueIndex<span class="br0">&#40;</span> <span class="br0">&#91;</span><span class="st_h">'domain'</span><span class="sy0">,</span> <span class="st_h">'code'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$table</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>addIndex<span class="br0">&#40;</span> <span class="br0">&#91;</span><span class="st_h">'status'</span><span class="sy0">,</span> <span class="st_h">'pos'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span> <span class="re0">$from</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>getMigrateToSql<span class="br0">&#40;</span> <span class="re0">$to</span><span class="sy0">,</span> <span class="re0">$conn</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>getDatabasePlatform<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re0">$sql</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="re0">$conn</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>executeStatement<span class="br0">&#40;</span> <span class="re0">$sql</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>






<p>Contrary, Upscheme offers a very terse API which does the same in only a few lines of code:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>db<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>table<span class="br0">&#40;</span> <span class="st_h">'test'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span> <span class="re0">$t</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>engine <span class="sy0">=</span> <span class="st_h">'InnoDB'</span><span class="sy0">;</span>
&nbsp;
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>id<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>string<span class="br0">&#40;</span> <span class="st_h">'domain'</span><span class="sy0">,</span> <span class="nu0">32</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>string<span class="br0">&#40;</span> <span class="st_h">'code'</span><span class="sy0">,</span> <span class="nu0">64</span> <span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>opt<span class="br0">&#40;</span> <span class="st_h">'charset'</span><span class="sy0">,</span> <span class="st_h">'binary'</span><span class="sy0">,</span> <span class="st_h">'mysql'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>string<span class="br0">&#40;</span> <span class="st_h">'label'</span><span class="sy0">,</span> <span class="nu0">255</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>int<span class="br0">&#40;</span> <span class="st_h">'pos'</span> <span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span><span class="kw1">default</span><span class="br0">&#40;</span> <span class="nu0">0</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>smallint<span class="br0">&#40;</span> <span class="st_h">'status'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>meta<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>unique<span class="br0">&#40;</span> <span class="br0">&#91;</span><span class="st_h">'domain'</span><span class="sy0">,</span> <span class="st_h">'code'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>index<span class="br0">&#40;</span> <span class="br0">&#91;</span><span class="st_h">'status'</span><span class="sy0">,</span> <span class="st_h">'pos'</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>






<p>Upscheme also offers much better support for migrating data. Instead of using a &#8220;migration&#8221; table to keep track executed migrations which can get out of sync, Upscheme checks the current state of the schema and applies only necessary changes to update the tables, columns and other schema objects.</p>



<p>If your application allows 3rd party plugins you will love <a href="https://upscheme.org/#dependencies">Upscheme&#8217;s dependency management</a> based on tasks that must run before or after the current one. Thus, extensions can modify existing tables and migrate data without interfering with core tasks.</p>



<h2>Create/update database schema</h2>



<p>Creating and updating a table for example requires:</p>



<ul><li>an Upscheme task</li><li>the table definition</li></ul>



<p>The code below creates an Upscheme task named &#8220;Messages&#8221; by extending from the Upscheme base task and implements the <code>up()</code> method which is executed to perform the schema update:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">namespace</span> Aimeos\Upscheme\Task<span class="sy0">;</span>
<span class="kw2">use</span> Aimeos\Upscheme\Schema\Table<span class="sy0">;</span>
&nbsp;
<span class="kw2">class</span> Messages <span class="kw2">extends</span> Base
<span class="br0">&#123;</span>
    <span class="kw2">public</span> <span class="kw2">function</span> up<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>db<span class="br0">&#40;</span> <span class="st_h">'db-message'</span> <span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>table<span class="br0">&#40;</span> <span class="st_h">'message'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span> Table <span class="re0">$t</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>id<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>type<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>string<span class="br0">&#40;</span> <span class="st_h">'label'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>bool<span class="br0">&#40;</span> <span class="st_h">'status'</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="re0">$t</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>meta<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>






<p>Within the <code>up()</code> method, the database schema for the &#8220;db-message&#8221; database is retrieved (with a fall-back to the standard database if &#8220;db-message&#8221; isn&#8217;t explicitely configured) and the &#8220;message&#8221; table defined. It consists of an &#8220;id&#8221; autoincrement integer column (with primary key), a label and status column as well as &#8220;ctime&#8221;, &#8220;mtime&#8221; and &#8220;editor&#8221; columns automatically added by the <code>meta()</code> function offered by the Aimeos core.</p>



<p>The <a href="https://upscheme.org/#tables">Table section in the Upscheme documentation</a> contains the list of pre-defined methods for creating the most often used column types. Nevertheless, you can always use the <a href="https://upscheme.org/#tablecol">Upscheme <code>col()</code> method</a> to create custom columns too and there&#8217;s also a <a href="https://upscheme.org/#column-modifiers">list of Upscheme column modifiers</a> to customize any column according to your needs.</p>



<p>Whenever you add, change or remove a column in your task, Upscheme will update your table schema automatically without any need to write an additional line of code!</p>



<h2>Migrate data</h2>



<p>Upscheme tasks can also migrate data between new releases and offers simple methods to <a href="https://upscheme.org/#dbinsert">insert</a>, <a href="https://upscheme.org/#dbupdate">update</a> and <a href="https://upscheme.org/#dbdelete">delete</a> records. Also, there are methods available to check for tables, columns and other schema object, to rename them and to drop them if they are not required any more:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>db<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>delete<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="br0">&#91;</span><span class="st_h">'type'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'custom'</span><span class="br0">&#93;</span>
<span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>dropColumn<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="st_h">'type'</span>
<span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>update<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="br0">&#91;</span><span class="st_h">'status'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw4">false</span><span class="br0">&#93;</span><span class="sy0">,</span>
    <span class="br0">&#91;</span><span class="st_h">'status'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw4">true</span><span class="sy0">,</span> <span class="st_h">'mtime'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'Y-m-d H:i:s'</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>renameColumn<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="st_h">'label'</span><span class="sy0">,</span>
    <span class="st_h">'content'</span>
<span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>insert<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="br0">&#91;</span><span class="st_h">'label'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'test message'</span><span class="sy0">,</span> <span class="st_h">'status'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw4">true</span><span class="sy0">,</span> <span class="st_h">'ctime'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'Y-m-d H:i:s'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'mtime'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw3">date</span><span class="br0">&#40;</span><span class="st_h">'Y-m-d H:i:s'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'editor =&amp;gt; '</span>setup<span class="st_h">']
);</span></pre></div></div></div></div></div></div></div>






<p>This statements will delete the messages of type &#8220;custom&#8221;, drop the messages column afterwards, set the status to TRUE of all remaining records which updating the &#8220;mtime&#8221; column, rename the &#8220;label&#8221; column to &#8220;content&#8221; and insert a new test message into the table. All method calls can be concatenated because the Upscheme API offers a fluent interface and there&#8217;s also a <code>select()</code> method to query data:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>db<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>select<span class="br0">&#40;</span>
    <span class="st_h">'message'</span><span class="sy0">,</span>
    <span class="br0">&#91;</span><span class="st_h">'status'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="kw4">false</span><span class="sy0">,</span> <span class="st_h">'type'</span> <span class="sy0">=&amp;</span>gt<span class="sy0">;</span> <span class="st_h">'old'</span><span class="br0">&#93;</span>
<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>






<p>For more complex statement, Upscheme provides the <code>stmt()</code> method which gives you direct access to the Doctrine DBAL API:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$result</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>db<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>stmt<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>select<span class="br0">&#40;</span> <span class="st_h">'id'</span><span class="sy0">,</span> <span class="st_h">'content'</span> <span class="br0">&#41;</span>
    <span class="sy0">-&amp;</span>gt<span class="sy0">;</span>from<span class="br0">&#40;</span> <span class="st_h">'message'</span> <span class="br0">&#41;</span>
    <span class="sy0">-&amp;</span>gt<span class="sy0">;</span>where<span class="br0">&#40;</span> <span class="st_h">'status = 1'</span> <span class="br0">&#41;</span>
    <span class="sy0">-&amp;</span>gt<span class="sy0">;</span>execute<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">while</span><span class="br0">&#40;</span> <span class="re0">$row</span> <span class="sy0">=</span> <span class="re0">$result</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>fetchAssociative<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="re0">$map</span><span class="br0">&#91;</span><span class="re0">$row</span><span class="br0">&#91;</span><span class="st_h">'id'</span><span class="br0">&#93;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="br0">&#91;</span><span class="st_h">'content'</span><span class="br0">&#93;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>






<h2>Summary</h2>



<p>Compared to Doctrine DBAL, Upscheme is very easy to use and also contains some workarounds for pitfalls in DBAL. Creating and updating the database schema is extremely simple and Upscheme saved up to 80% of the code in some setup tasks compared to the previous DBAL code in the Aimeos core.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2022-news/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aimeos 2021.10 LTS release</title>
		<link>https://aimeos.org/tips/aimeos-2021-10-lts-release/</link>
					<comments>https://aimeos.org/tips/aimeos-2021-10-lts-release/#comments</comments>
		
		<dc:creator><![CDATA[aimeos]]></dc:creator>
		<pubDate>Wed, 27 Oct 2021 17:01:41 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Releases]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[TYPO3]]></category>
		<guid isPermaLink="false">https://aimeos.org/tips/?p=858</guid>

					<description><![CDATA[The 2021.10 release of the Aimeos e-commerce framework with long term support is available for Laravel, Symfony and TYPO3. It contains a lot of small features repeatedly requested by developers and users and which improve user experience, usability for editors<span class="ellipsis">&#8230;</span><div class="read-more"><a href="https://aimeos.org/tips/aimeos-2021-10-lts-release/">Read more <span class="screen-reader-text">Aimeos 2021.10 LTS release</span><span class="meta-nav"> &#8250;</span></a></div><!-- end of .read-more -->]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg"><img width="1024" height="538" src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg" alt="" class="wp-image-887" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-1024x538.jpg 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-300x158.jpg 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-768x403.jpg 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-100x53.jpg 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-150x79.jpg 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-200x105.jpg 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-450x236.jpg 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-600x315.jpg 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big-900x473.jpg 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-release-rect-big.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The 2021.10 release of the Aimeos e-commerce framework with long term support is available for Laravel, Symfony and TYPO3. It contains a lot of small features repeatedly requested by developers and users and which improve user experience, usability for editors and security. The most important improvements are:</p>



<ul><li>Laravel 8 distribution and TYPO3 11</li><li>Radius search and maps</li><li>&#8220;Price on request&#8221; feature</li><li>Product video support</li><li>Improved backend usability</li><li>Custom invoice numbers</li><li>Warehouse management</li><li>PDF with SEPA QR-code and images</li><li>Strict CSP and other improvements</li></ul>



<span id="more-858"></span>



<h2>Laravel 8 distribution and TYPO3 11</h2>



<div class="wp-block-image"><figure class="alignright size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png"><img width="126" height="130" src="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png" alt="" class="wp-image-863" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6.png 126w, https://aimeos.org/tips/wp-content/uploads/2021/10/laravel6-100x103.png 100w" sizes="(max-width: 126px) 100vw, 126px" /></a></figure></div>



<p>After Laravel 9 has been postponed to next year, we&#8217;ve decided to update the <a href="https://github.com/aimeos/aimeos" target="_blank" rel="noreferrer noopener">Aimeos standalone shop distribution</a> to Laravel 8 in the meantime. Up to now, the Aimeos distribution was based on Laravel 6 LTS for maximum stability and we will upgrade to Laravel 9 LTS beginning with Aimeos 2022.04+ releases.</p>



<p>Despite of that, the <a href="https://github.com/aimeos/aimeos-laravel" target="_blank" rel="noreferrer noopener">Aimeos Laravel package</a> is available for Laravel 8 since it was released and will be also available for Laravel 9 immediately after its release.</p>



<div class="wp-block-image"><figure class="alignleft size-large"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png"><img width="128" height="128" src="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png" alt="" class="wp-image-864" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/typo3.png 128w, https://aimeos.org/tips/wp-content/uploads/2021/10/typo3-100x100.png 100w" sizes="(max-width: 128px) 100vw, 128px" /></a></figure></div>



<p>The <a href="https://extensions.typo3.org/extension/aimeos" target="_blank" rel="noreferrer noopener">Aimeos TYPO3 extension</a> is the most widely used e-commerce extension for TYPO3 and even surpassed tt_products this year according to the TER download numbers!</p>



<p>The Aimeos 21.10 LTS release contains full support for TYPO3 11 and also the 1-click <a href="https://extensions.typo3.org/extension/aimeos_dist" target="_blank" rel="noreferrer noopener">Aimeos TYPO3 distribution</a> is available for TYPO3 11.5 LTS since its release.</p>



<h2>Radius search and maps</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-1024x512.png" alt="" class="wp-image-860" width="512" height="256" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-1024x512.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-300x150.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-768x384.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-100x50.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-150x75.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-200x100.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-450x225.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-600x300.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map-900x450.png 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-supplier-map.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>The Aimeos admin backend contains world maps in the customer and supplier panels now, so editors can select or update the coordinates the addresses belong to. Then, supplier coordinates are added to the product index to enable users searching product within a given radius.</p>



<p>The maps in the backend are generated by Leaflet.js and OpenStreetMap and can be used by anyone without fees.</p>



<h2>Price on request</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-1024x529.png" alt="" class="wp-image-861" width="512" height="265" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-1024x529.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-300x155.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-768x397.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-100x52.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-150x78.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-200x103.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-450x233.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-600x310.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest-900x465.png 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-price-onrequest.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>One of the most often requested features, especially in the B2B area, is the ability to create a request for the products in the basket without displaying a price. Then, the price is caculated by different factors and printed at the offer sent to the customer.</p>



<p>If editors add prices with empty values to products, the frontend will display &#8220;on request&#8221; now. Customers can add those products to the basket and can complete the order as normal but the products without a price will be treated like having a price of 0.00.</p>



<p>Mixing products with a regular price and products with prices &#8220;on request&#8221; is no problem and the payment at the end of the checkout process will be done for the products with a regular price only.</p>



<h2>Product video support</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-1024x538.png" alt="" class="wp-image-862" width="512" height="269" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-1024x538.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-300x158.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-768x403.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-100x53.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-150x79.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-200x105.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-450x236.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-600x315.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video-900x473.png 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-media-video.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>The release also includes support for product videos in MP4/WebM format. You can upload one or more videos in the product media panel of the admin backend and a preview image is generated automatically based on the video content.</p>



<p>The videos are shown like regular product thumbnails in the catalog detail component of the HTML frontend but if users switch to the video, it starts playing automatically without sound.</p>



<h2>Improved backend usability</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-1024x538.png" alt="" class="wp-image-872" width="512" height="269" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-1024x538.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-300x158.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-768x403.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-100x53.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-150x79.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-200x105.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-450x236.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-600x315.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media-900x473.png 900w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-product-media.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>To ease daily work for editors, all media panels now support uploading multiple files at once when clicking on the &#8220;+&#8221; button and each file will create a new card automatically. Before, only the card was added and you had to upload a file for each card. Also, the new release improves cropping and scaling of uploaded images.</p>



<p>In the text panels, CKEditor 5 is now used for editing and styling the text content. The new version also added new features like table and video support within texts which is now available out of the box.</p>



<h2>Custom invoice numbers</h2>



<p>Many shop owners want to customize the invoice numbers for many reasons but this was hardly possible in the past. Now, developers can register custom functions for generating invoice numbers that are used in the HTML frontend, the e-mails or PDFs, e.g.:</p>





<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">use</span> \Aimeos\MShop\Order\Item\Standard <span class="kw1">as</span> Order<span class="sy0">;</span>
&nbsp;
Order<span class="sy0">::</span><span class="me2">method</span><span class="br0">&#40;</span> <span class="st_h">'ordernumber'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span> \Aimeos\MShop\Order\Item\Iface <span class="re0">$order</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">return</span> <span class="st_h">'RE-'</span> <span class="sy0">.</span> <span class="kw3">date</span><span class="br0">&#40;</span> <span class="st_h">'Y'</span> <span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'-'</span> <span class="sy0">.</span> <span class="re0">$order</span><span class="sy0">-&gt;</span><span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span> <span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>






<h2>Warehouse management</h2>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product.png" alt="" class="wp-image-878" width="512" height="256" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-300x150.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-768x384.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-100x50.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-150x75.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-200x100.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-450x225.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-600x300.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/admin-order-product-900x450.png 900w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>To improve order and warehouse management in Aimeos, there&#8217;s a new payment status for each ordered product. Thus, you can now mark single products as refunded or use any other payment status.</p>



<p>To display the additional information, the product section of the order detail panel has been rewritten. It&#8217;s fully responsive now and easy to use in combination with mobile phones.</p>



<p>For the 2022.x version, you can expect some bigger changes in the Aimeos order domain.</p>



<h2>PDF with SEPA QR-code and images</h2>



<div class="wp-block-image"><figure class="alignleft size-large is-resized"><a href="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background.png"><img src="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background.png" alt="" class="wp-image-882" width="512" height="256" srcset="https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background.png 1024w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-300x150.png 300w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-768x384.png 768w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-100x50.png 100w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-150x75.png 150w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-200x100.png 200w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-450x225.png 450w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-600x300.png 600w, https://aimeos.org/tips/wp-content/uploads/2021/10/aimeos-pdf-qr-background-900x450.png 900w" sizes="(max-width: 512px) 100vw, 512px" /></a></figure></div>



<p>The template for the PDF attached to the payment related e-mails contains a QR-code for European IBAN payments. Mobile users whose bank supports scanning these QR-codes can pay invoices within seconds and 100% error free.</p>



<p>In addition, the template also contains example code how to add a background image to the PDF files. Then, companies can send order confirmations including PDFs that look exactly like their well-designed letter papers.</p>



<h2>Strict CSP and other improvements</h2>



<p>Starting with 2021.10 LTS, a strict <a rel="noreferrer noopener" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP" target="_blank">Content Security Policy</a> has been implemented for the Aimeos backend and for the Laravel frontend. This effectively prevents <a rel="noreferrer noopener" href="https://owasp.org/www-community/attacks/xss/" target="_blank">Cross-Site-Scripting (XSS)</a> where foreign Javascript code is executed in the context of the page loaded by the users&#8217; browser and which is a common source of security incidents.</p>



<p>This also means that inline Javascript in any templates is ignored by browsers now and scripts, CSS, images, videos, etc. are only loaded from well-defined sources. To allow a new URL for any of those objects, you have to overwrite the frontend or backend page template and add the URL there:</p>



<ul><li><a href="https://github.com/aimeos/aimeos-laravel/blob/master/src/views/base.blade.php#L7" target="_blank" rel="noreferrer noopener">Laravel frontend</a></li><li><a rel="noreferrer noopener" href="https://github.com/aimeos/aimeos-laravel/blob/master/src/views/jqadm/index.blade.php#L7" target="_blank">Laravel backend</a></li><li><a rel="noreferrer noopener" href="https://github.com/aimeos/aimeos-typo3/blob/master/Resources/Private/Layouts/Jqadm.html#L7" target="_blank">TYPO3 backend</a></li></ul>



<p>To allow Javascript required by e.g. payment gateways like Stripe, a <a href="https://github.com/aimeoscom/ai-payments/blob/master/lib/custom/src/MShop/Service/Provider/Payment/Stripe.php" target="_blank" rel="noreferrer noopener">&#8220;nonce&#8221;</a> is available to mark JS code within script tags as trusted. Other security improvements include hardening against potential CSRF attacks and SVG images are now sanitized when uploaded, so they doesn&#8217;t contain any Javascript or external URLs.</p>



<p>To improve internationalization, it&#8217;s now possible to translate all error messages with placeholders from the core, even those that are only logged. Furthermore, all log messages has been categorized to filter messages by their source effectively.</p>



<p>Last but not least, the <a href="https://aimeos.org/docs/latest/config/client-html/catalog-detail/#404" target="_blank" rel="noreferrer noopener">catalog detail component</a> can be configured to return a HTTP 404 status instead of displaying an error message that the product could not be found.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://aimeos.org/tips/aimeos-2021-10-lts-release/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
