UX/UI Improvements
- Added support for choosing the default backend locale and timezone in
php artisan winter:install
. - Controller scaffolding now uses the default backend localization keys for the default titles in the FormBehavior config instead of hardcoded English strings
- The
unique
validation rule can now be used without any additional information, previously it required the table name to be specified in the form ofunique:table_name
. This also means thatunique
validation rules will respect the current model's$table
property.
API Changes
- Added support for modifying the RichEditor's allowed attributes list through the EditorSettings in the backend
- Added support for saving deferred bindings with pivot data.
- Added
Backend::makeCarbon($dateTime)
helper for setting the backend timezone on date values. - Added support for Dependency Injection in console commands.
- Added support for
php artisan winter:util purge orphans
command that removes anysystem_files
records that do not have matching files stored on the filesystem. - Added support for
registerValidationRules
in thePlugin.php
plugin registration file to register custom validation rules. - Added support for specifying
min
,max
, andstep
values on thenumber
andnumberrange
List Filter scope types. - Added support for pre and post processing of YAML being parsed which should pave the way for supporting YAML v4
- Added support for array views to the MailFake class
- Added support for HTTP HEAD requests from the
Http
utility. - Added boolean
$ok
indicator to theHttp
utility to indicate if the last response was successful (ie. an HTTP 2xx response code was returned) - Added support for automatic cache busting for the assets loaded by the
{% framework %}
Twig tag based on the current version stored in the database. Useartisan winter:version
to set the correct version for your project. - Added support for translator namespace aliases by adding
Lang::registerNamespaceAlias('real.namespace', 'aliased.namespace')
. - Added
Config::registerNamespaceAlias($original, $alias);
to allow aliasing a config namespaces to another config namespace, i.e.Config::registerNamespaceAlias('winter.debugbar', 'debugbar');
would return the config items fromwinter.debugbar
when accessing thedebugbar
config. This is useful for forked packages or when integrating Laravel packages into Winter. - Added
Config::registerPackageFallback($original, $fallback)
to allow the config items to be loaded from the global$fallback
config when present if the$original
global config isn't present. Useful when forking plugins to ensure existing installations with customized configs at the global level continue to work. - Added support for lazy loading class aliases only when needed through the new
Winter\Storm\Support\ClassLoader->addAliases(['Real\Class' => 'Alias\For\Class'])
method. - Added support for aliasing entire namespaces in the class loader via the new
Winter\Storm\Support\ClassLoader->addNamespaceAliases(['Real\Namespace' => 'Aliased\Namespace'])
method. - Added support for getting the original class name of an aliased class when registered through the ClassLoader via the
Winter\Storm\Support\ClassLoader->getAlias($aliasedClass)
method - Added support for plugins specifying that they "replace" other plugins via the
replaces
key in thepluginDetails()
method. See wintercms/winter#41 & wintercms/docs#11 for more details. Methods added toPluginBase
:getReplaces($includeConstraints = false)
,canReplacePlugin($plugin, $version)
,getPluginIdentifier()
,getPluginPath()
, andgetPluginVersion()
.
Bug Fixes
- Fixed issue with Schedule->withoutOverlapping() by bringing the Halcyon MemoryRepository more inline with the parent class.
- Fixed an error thrown when using the "package:discover" command when
app.loadDiscoveredPackages
set to false, as the manifest was reset tonull
as opposed to an empty array. - Fixed issue where tooltips set on the first column of the Lists widget were not working.
- Fixed issue where components that used dependency injection in their constructors would break in the backend.
- The RecordFinder FormWidget will now automatically determine what to use for the key column if the model used is not using the default of
id
. This used to be controlled by the undocumentedkeyFrom
option on the recordfinder, but is now handled behind the scenes automatically. - Reverted "Fixed issue introduced in Laravel 5.7 where eager loading
File
relationships on PostgreSQL would fail with the message "Varchar <> Integer comparison is not allowed"" introduced in 1.1.2 since it was causing issues when strict typing was enabled. - Fixed an issue where
PluginManager->getRegistrationMethodValues()
would attempt to call protected methods on PHP 7.4. - Improved Media Library path validation logic by allowing
//
but not allowing://
to account for poorly constructed paths that are still technically valid. - Fixed issue where sending emails using the Laravel Notification system could cause an exception in the System module when it attempted to extend a view instance while it was expecting a view string reference.
- Fixed issue where a TagList field that is disabled or readOnly would fail to correctly render if the value was an array.
- Added branching support for
winter:version
, different version branches (1.0, 1.1, etc) can now be correctly identified. - Improved handling of dates by the Filter widget, specifically when ignoreTimezone is set on only one of a few date inputs in a given filter, and when using the daterange filter type with certain date values.
- Changed the default value of
database.connections.sqlite.database
tobase_path('storage/database.sqlite')
to better support applications using a mirrored public directory. - Fixed issue where redirects to slow loading pages via AJAX could stop the loading indicator (and thus enable the triggering element) before the redirect actually completed, potentially leading to users triggering multiple requests unintentionally. As a side-effect due to how browsers process file downloads triggered by AJAX, this broke the loading indicator for AJAX redirects that cause the browser to download files instead of leaving the page; see the test plugin for how you can manually fix that functionality within your projects.
- Fixed long standing issue with the pagelinks plugin in the richeditor where inserting a link from the pagelinks popup would insert it at the start of the content instead of where the selected text was, and fixed another issue that would cause any preset text to be overwritten when selecting a link to use from the pagelinks popup.
- Fixed issue where exceptions / errors that were thrown before the
Event
facade was available would always be reported as "Class Event does not exist" instead of the actual problem. - Fixed support for CSS variables within the asset compiler / combiner, this is a step closer towards native Tailwind support within Winter CMS.
- Fixed issue where resizing certain
.gif
images would result inimagecolorsforindex(): Argument #2 ($color) is out of range
. - Fixed issue where resizing
.gif
images with no transparent colour set would result in the white colour being replaced with the default transparent colour. - Fixed issue where passing
null
as the image source to the| resize
filter resulted in an exception being thrown instead of more gracefully silently ignoring the input and returning an emptry string. - Fixed issue where
init.php
wouldn't be loaded by the plugin boot process when running unit tests. - Fixed long standing issue where disabled plugins wouldn't be uninstalled by the
winter:down
command - Fixed issue where routes registered via plugin's
routes.php
file would not have names registered viaRoute::name()
actually registered with the internal route name mapping meaning thatroute($name)
would not be able to resolve to those routes.
Security Improvements
- Improved password reset flow by no longer throwing an error message if the provided email address doesn't exist in the system.
- Tightened up the permission checking logic by requiring strict type matches.
- Removed
xml
from the list of default allowed extensions to upload, can be added back through the configuration if required.
Translation Improvements
- Improved French translation.
- Improved Russian translation.
- Improved Dutch translation.
- Moved Media Manager
rename
andmove
action language keys to the backend module instead of the CMS module.
Community Improvements
- Documented the Lists widget's
perPageOptions
configuration property
Dependencies
- Refactored the
Winter\Storm\Events\Dispatcher
class to extend and override the base Laravel Event Dispatcher rather than just duplicating and implementing the contract for greater compatibility with Laravel. - Switched away from the abandoned
fzaninotto/faker
package to the maintainedfakerphp/faker
package.