temp
is now a reserved volume handle.- Improved the performance of field layout designers. (#11298)
- Fixed a bug where it wasn’t possible to disable all table columns for an element source. (#11291)
- Fixed a bug where the Assets index page wasn’t allowing any bulk actions for assets in the temporary volume. (#11293)
- Fixed a bug where PHP errors thrown while rendering a template weren’t being handled properly. (#11108)
- Added
craft\elements\db\ElementQuery::prepareSubquery()
.
- Element edit pages now disable pointer events on the content container for 300 milliseconds after the “Showing your unsaved changes” notice is displayed. (#11229)
- Users can now create drafts for entries they have permission to view, but not save. (#11249)
- User Group condition rules are no longer available in element conditions when no user groups exist. (#11252)
- Matrix blocks now have
data-type-name
attributes. (#11286)
- Fixed a bug where dynamically-defined image transforms weren’t respecting the
format
param, unless thegenerateTransformsBeforePageLoad
config setting was enabled. - Fixed a bug where Table fields with Min Rows and Max Rows set to
1
were still showing a delete button. (#11211) - Fixed an error that could occur when saving an Assets field that was restricted to a single location, at the root of a volume. (#11212)
- Fixed an error that could occur after a queue job execution had finished. (#11213)
- Fixed an error that could occur when saving an entry with Matrix blocks. (#11155)
- Fixed an error that occurred when saving a GraphQL schema without a scope. (#11240)
- Fixed an error that could occur when editing the public GraphQL schema, if a public token existed in the project config, but not the database. (#11218)
- Fixed some bugs with inconsistent asset indexing on Windows. (#11174), (#11219)
- Fixed a bug where custom fields weren’t available to be included as table attributes. (#11222)
- Fixed a bug where Alternative Text wasn’t available to be included as a table attribute. (#11222)
immediately
- Fixed a JavaScript error that broke Matrix fields with Min Blocks and Max Blocks both set to
1
. (#11233) - Fixed a bug where request context logs could appear when nothing else was logged. (#11141)
- Fixed a bug where stack traces could be erroneously filtered from logs.
- Fixed a bug where removing an element from a relational field within an element editor could cause the editor to create a provisional draft, even if the element type didn’t support drafts. (#11242)
- Fixed a bug where draft editor pages had two identical “Save and continue editing” alternate form actions.
- Fixed a JavaScript warning that occurred when viewing an element edit page, if the user didn’t have permission to edit it.
- Fixed a bug where asset selector modals weren’t fully initializing for Assets fields, if they were targeting the user’s temp folder. (#11254)
- Fixed an error that occurred when saving an entry via a GraphQL mutation. (#11258)
- Fixed a bug where Matrix block types’ layout elements were getting new UUIDs assigned each time the Matrix field was edited. (#11248)
- Fixed a bug where the web-based installation wizard was throwing an exception if a database connection couldn’t be established, and there was no
config/db.php
file. (#11245)
elements/*
actions no longer include custom field values in the response data, improving performance.- Garnish menu buttons are now aware of the
disabled
attribute. (#11128)
- Fixed an error that occurred when searching for elements by a custom field. (#11120)
- Fixed a bug where asset upload failures weren’t being handled properly. (#11156)
- Fixed a bug where warning and error logs were being sent to both
stdout
andstderr
whenCRAFT_STREAM_LOG
was enabled. (#11189) - Fixed an error that occurred when exporting elements with relational fields using the “Expanded” export type. (#11127)
- Fixed a PHP deprecation warning that occurred if the
tablePrefix
database connection setting wasnull
. - Fixed a bug where category groups were being identified as “{name}” in user permission lists. (#11132)
- Fixed a bug where Assets fields’ “Upload files” buttons weren’t wrapping when there wasn’t enough space to show them alongside “Add an asset”. (#11133)
- Fixed a bug where
Craft.getUrl()
was appending empty query strings to URLs when they weren’t needed. (#11159) - Fixed a bug where addresses could validate the wrong set of required fields, if the validation rules were invoked before the country code was set. (#11162)
- Fixed an error that could occur when viewing the Temporary Uploads volume, if the Temp Uploads Location asset setting was set to “In the local temp folder”. (#11192)
- Fixed an error that could occur when deleting a volume, if its filesystem had been deleted.
- Fixed an error that could occur when rendering the thumbnail preview for an asset, if its file was missing. (#11196)
- Fixed a bug where Money field labels’
for
attributes weren’t referencing the correct input ID. (#11016) - Fixed a bug where Money field inputs weren’t getting
aria-describedby
attributes. (#11016) - Fixed an error that occurred when loading an edit screen for an element type that didn’t have a field layout. (#11110)
- Fixed a bug where condition rules that weren’t selectable (per
isSelectable()
) were still visible in the rule dropdown menu. (#11104) - Fixed a bug where element edit pages could reload themselves immediately after saving the element. (#11084)
- Fixed a bug where tabs weren’t interactive after changing an entry’s type, if the new entry type didn’t have a tab of the same name as the previously-selected tab. (#11093)
- Fixed a bug where Twig syntax errors weren’t being handled properly. (#11108)
- The
setup
command now writes the application ID to aCRAFT_APP_ID
environment variable. - The
setup
command now writes the security key to aCRAFT_SECURITY_KEY
environment variable.
- Entries’, categories’, and assets’ edit pages, and all element types via slideouts, now use a unified editing experience. (#10467)
- Categories now support drafts. (#10467)
- Element slideouts now support provisional drafts and autosaving, for element types that support them. (#10467)
- Element indexes can now be filtered by element attributes and custom field values. (#9192, #9450, #9462, #9483)
- Admins can now create custom element sources from the Customize Sources modal. (#8423)
- It’s now possible to disable native element sources from the Customize Sources modal. (#10676)
- Field layout tabs, fields, and UI elements can now be conditionally shown based on properties of the current user and/or element being edited. (#8099, #8154)
- Assets, Entries, and Users fields have new condition settings that can be used to further limit which elements should be relatable, beyond the existing field settings. (#10393)
- Assets, Entries, and Users fields have new “Min Relations” settings, and their former “Limit” settings have been renamed to “Max Relations”. (#8621)
- Added a dedicated “Full Name” field to users. “First Name” and “Last Name” are now parsed out from the full name automatically when a user is saved. (#10405)
- Added the “Inactive” user status, which can be used by users which can’t be signed into. (#8963)
- Added “Credentialed” and “Inactive” user sources.
- Added the “Deactivate…” user action for pending and active users.
- Users can now have an “Addresses” field. (#10507)
- Added the concept of “filesystems”, which handle file operations, either locally or on a remote service like Amazon S3.
- It’s now possible to set sites’ Status settings to environment variables. (#3005)
- Added the Money field type.
- Craft now provides a native “Alternative Text” (
alt
) field for assets. (#10302) - Asset thumbnails in the control panel now have
alt
attributes, for assets with a filled-in Alternative Text value. - Added the
index-assets/cleanup
command. - Added the “Deactivate users by default” user registration setting, which replaces “Suspend users by default”. (#5830)
- Element source settings are now stored in the project config. (#8616)
- Improved element index accessibility. (#10629, #10660)
- Improved Live Preview accessibility for screen readers. (#10688)
- Slideouts, Live Preview, and Matrix blocks are no longer animated for browsers that have requested reduced motion. (#10665)
- Added support for
JSON
columns. (#9089) - It’s now possible to edit images’ focal points from their preview modals. (#8489)
- Added support for Monolog and the PSR-3 logging interface. (#10659)
- Added the
|address
Twig filter. - Added the
|money
Twig filter. - Added the
collect()
Twig function. - Added the
assetUploaders
,authors
, andfullName
user query params. - Added the
primaryOwner
andprimaryOwnerId
Matrix block query params. - Added the
hasAlt
asset query param. - Added the
button
,submitButton
,fs
,fsField
,volume
, andvolumeField
macros to the_includes/forms
control panel template. - Added the
buildId
general config. (#10705) - Added support for setting custom config settings from
config/custom.php
, which are accessible viaCraft::$app->config->custom
. (#10012) - Added the
addresses
,address
, andaddressCount
GraphQL queries. - Added the
hasAlt
argument to asset GraphQL queries. - Added the
alt
field to assets queried via GraphQL. - Added the
fullName
,assetUploaders
, andauthors
arguments to user GraphQL queries. - Added the
addresses
field to user GraphQL queries. - GraphQL schemas now include settings that determine which sites elements can be queried from. (#10610)
- Added the
assets/icon
action. - Added the
assets/update-focal-point
action. - Added the
categories/create
action. - Added the
elements/apply-draft
action. - Added the
elements/create
action. - Added the
elements/delete-draft
action. - Added the
elements/delete-for-site
action. - Added the
elements/delete
action. - Added the
elements/duplicate
action. - Added the
elements/edit
action. - Added the
elements/redirect
action. - Added the
elements/revert
action. - Added the
elements/save-draft
action. - Added the
elements/save
action. - Added the
users/delete-address
action. - Added the
users/save-address
action. - Added the
app/render-element
control panel controller action. - Added the
element-indexes/element-table-html
control panel controller action. - Added
craft\base\ApplicationTrait::getConditions()
. - Added
craft\base\ApplicationTrait::getElementSources()
, which replacesgetElementIndexes()
. - Added
craft\base\ApplicationTrait::getFs()
. - Added
craft\base\ApplicationTrait::getImageTransforms()
, which replacesgetAssetTransforms()
. - Added
craft\base\conditions\BaseCondition
. - Added
craft\base\conditions\BaseConditionRule
. - Added
craft\base\conditions\BaseDateRangeConditionRule
. - Added
craft\base\conditions\BaseElementSelectConditionRule
. - Added
craft\base\conditions\BaseLightswitchConditionRule
. - Added
craft\base\conditions\BaseMultiSelectConditionRule
. - Added
craft\base\conditions\BaseNumberConditionRule
. - Added
craft\base\conditions\BaseSelectConditionRule
. - Added
craft\base\conditions\BaseTextConditionRule
. - Added
craft\base\conditions\ConditionInterface
. - Added
craft\base\conditions\ConditionRuleInterface
. - Added
craft\base\Element::EVENT_AUTHORIZE_CREATE_DRAFTS
. - Added
craft\base\Element::EVENT_AUTHORIZE_DELETE_FOR_SITE
. - Added
craft\base\Element::EVENT_AUTHORIZE_DELETE
. - Added
craft\base\Element::EVENT_AUTHORIZE_DUPLICATE
. - Added
craft\base\Element::EVENT_AUTHORIZE_SAVE
. - Added
craft\base\Element::EVENT_AUTHORIZE_VIEW
. - Added
craft\base\Element::EVENT_DEFINE_ADDITIONAL_BUTTONS
. (#10420) - Added
craft\base\Element::getParentId()
. - Added
craft\base\Element::hasNewParent()
. - Added
craft\base\Element::notesFieldHtml()
. - Added
craft\base\Element::setParentId()
. - Added
craft\base\Element::statusFieldHtml()
. - Added
craft\base\ElementInterface::canCreateDrafts()
. - Added
craft\base\ElementInterface::canDelete()
. - Added
craft\base\ElementInterface::canDeleteForSite()
. - Added
craft\base\ElementInterface::canDuplicate()
. - Added
craft\base\ElementInterface::canSave()
. - Added
craft\base\ElementInterface::canView()
. - Added
craft\base\ElementInterface::createAnother()
. - Added
craft\base\ElementInterface::createCondition()
. - Added
craft\base\ElementInterface::getAdditionalButtons()
. - Added
craft\base\ElementInterface::getPostEditUrl()
. - Added
craft\base\ElementInterface::getThumbAlt()
. - Added
craft\base\ElementInterface::hasRevisions()
. - Added
craft\base\ElementInterface::prepareEditScreen()
. - Added
craft\base\FieldInterface::getElementConditionRuleType()
. - Added
craft\base\FieldInterface::isRequirable()
. - Added
craft\base\FieldLayoutComponent
. - Added
craft\base\Fs
. - Added
craft\base\FsInterface
. - Added
craft\base\FsTrait
. - Added
craft\base\Image::heartbeat()
. - Added
craft\base\Image::setHeartbeatCallback()
. - Added
craft\base\imagetransforms\EagerImageTransformerInterface
. - Added
craft\base\imagetransforms\ImageEditorTransformerInterface
. - Added
craft\base\imagetransforms\ImageTransformerInterface
. - Added
craft\base\LocalFsInterface
. - Added
craft\base\Model::defineBehaviors()
. (#10691) - Added
craft\base\ModelInterface
. - Added
craft\base\NameTrait
. - Added
craft\base\PluginInterface::config()
. (#11039) - Added
craft\behaviors\SessionBehavior::broadcastToJs()
. - Added
craft\behaviors\SessionBehavior::getError()
. - Added
craft\behaviors\SessionBehavior::getNotice()
. - Added
craft\controllers\AddressesController
. - Added
craft\controllers\AssetIndexesController
. - Added
craft\controllers\ConditionsController
. - Added
craft\controllers\ElementIndexesController::$condition
. - Added
craft\controllers\FsController
. - Added
craft\controllers\ImageTransformsController
. - Added
craft\db\Migration::archiveTableIfExists()
. (#10827) - Added
craft\db\Migration::dropAllForeignKeysToTable()
. - Added
craft\db\Migration::dropForeignKeyIfExists()
. - Added
craft\db\Migration::renameTable()
. - Added
craft\db\Query::collect()
, which returns the query results as anIlluminate\Support\Collection
object rather than an array. (#8513) - Added
craft\db\Table::ADDRESSES
. - Added
craft\db\Table::ASSETINDEXINGSESSIONS
. - Added
craft\db\Table::IMAGETRANSFORMINDEX
. - Added
craft\db\Table::IMAGETRANSFORMS
. - Added
craft\db\Table::MATRIXBLOCKS_OWNERS
. - Added
craft\debug\LogTarget
. - Added
craft\debug\MailPanel
. - Added
craft\elements\Address
. - Added
craft\elements\Asset::$alt
. - Added
craft\elements\Asset::EVENT_AFTER_GENERATE_TRANSFORM
. - Added
craft\elements\Asset::EVENT_BEFORE_GENERATE_TRANSFORM
. - Added
craft\elements\Asset::getFs()
. - Added
craft\elements\Asset::setFilename()
. - Added
craft\elements\conditions\addresses\AddressCondition
. - Added
craft\elements\conditions\addresses\CountryConditionRule
. - Added
craft\elements\conditions\assets\AssetCondition
. - Added
craft\elements\conditions\assets\DateModifiedConditionRule
. - Added
craft\elements\conditions\assets\FilenameConditionRule
. - Added
craft\elements\conditions\assets\FileSizeConditionRule
. - Added
craft\elements\conditions\assets\FileTypeConditionRule
. - Added
craft\elements\conditions\assets\HasAltConditionRule
. - Added
craft\elements\conditions\assets\HeightConditionRule
. - Added
craft\elements\conditions\assets\UploaderConditionRule
. - Added
craft\elements\conditions\assets\VolumeConditionRule
. - Added
craft\elements\conditions\assets\WidthConditionRule
. - Added
craft\elements\conditions\categories\CategoryCondition
. - Added
craft\elements\conditions\categories\GroupConditionRule
. - Added
craft\elements\conditions\DateCreatedConditionRule
. - Added
craft\elements\conditions\DateUpdatedConditionRule
. - Added
craft\elements\conditions\ElementCondition
. - Added
craft\elements\conditions\ElementConditionInterface
. - Added
craft\elements\conditions\ElementConditionRuleInterface
. - Added
craft\elements\conditions\entries\AuthorConditionRule
. - Added
craft\elements\conditions\entries\AuthorGroupConditionRule
. - Added
craft\elements\conditions\entries\EntryCondition
. - Added
craft\elements\conditions\entries\ExpiryDateConditionRule
. - Added
craft\elements\conditions\entries\PostDateConditionRule
. - Added
craft\elements\conditions\entries\SectionConditionRule
. - Added
craft\elements\conditions\entries\TypeConditionRule
. - Added
craft\elements\conditions\HasUrlConditionRule
. - Added
craft\elements\conditions\IdConditionRule
. - Added
craft\elements\conditions\LevelConditionRule
. - Added
craft\elements\conditions\RelatedToConditionRule
. - Added
craft\elements\conditions\SlugConditionRule
. - Added
craft\elements\conditions\tags\GroupConditionRule
. - Added
craft\elements\conditions\tags\TagCondition
. - Added
craft\elements\conditions\TitleConditionRule
. - Added
craft\elements\conditions\UriConditionRule
. - Added
craft\elements\conditions\users\AdminConditionRule
. - Added
craft\elements\conditions\users\CredentialedConditionRule
. - Added
craft\elements\conditions\users\EmailConditionRule
. - Added
craft\elements\conditions\users\FirstNameConditionRule
. - Added
craft\elements\conditions\users\GroupConditionRule
. - Added
craft\elements\conditions\users\LastLoginDateConditionRule
. - Added
craft\elements\conditions\users\LastNameConditionRule
. - Added
craft\elements\conditions\users\UserCondition
. - Added
craft\elements\conditions\users\UsernameConditionRule
. - Added
craft\elements\db\AddressQuery
. - Added
craft\elements\MatrixBlock::$primaryOwnerId
. - Added
craft\elements\MatrixBlock::$saveOwnership
. - Added
craft\elements\User::$active
. - Added
craft\elements\User::$fullName
. - Added
craft\elements\User::canAssignUserGroups()
. - Added
craft\elements\User::getAddresses()
. - Added
craft\elements\User::getIsCredentialed()
. - Added
craft\elements\User::STATUS_INACTIVE
. - Added
craft\errors\FsException
. - Added
craft\errors\FsObjectExistsException
. - Added
craft\errors\FsObjectNotFoundException
. - Added
craft\errors\ImageTransformException
. - Added
craft\errors\InvalidFsException
. - Added
craft\errors\MissingVolumeFolderException
. - Added
craft\events\AuthorizationCheckEvent
. - Added
craft\events\CreateElementCheckEvent
. - Added
craft\events\DefineElementEditorHtmlEvent
. - Added
craft\events\DefineElementInnerHtmlEvent
. (#11035) - Added
craft\events\DefineHtmlEvent::$static
. - Added
craft\events\FsEvent
. - Added
craft\events\GenerateTransformEvent::$asset
. - Added
craft\events\GenerateTransformEvent::$transform
. - Added
craft\events\GenerateTransformEvent::$url
. - Added
craft\events\ImageTransformerOperationEvent
. - Added
craft\events\ImageTransformEvent
. - Added
craft\events\RegisterConditionRuleTypesEvent
. - Added
craft\events\TransformImageEvent
. - Added
craft\fieldlayoutelements\addresses\AddressField
. - Added
craft\fieldlayoutelements\addresses\CountryCodeField
. - Added
craft\fieldlayoutelements\addresses\LabelField
. - Added
craft\fieldlayoutelements\addresses\LatLongField
. - Added
craft\fieldlayoutelements\addresses\OrganizationField
. - Added
craft\fieldlayoutelements\addresses\OrganizationTaxIdField
. - Added
craft\fieldlayoutelements\assets\AltField
. - Added
craft\fieldlayoutelements\BaseField::selectorLabel()
. - Added
craft\fieldlayoutelements\FullNameField
. - Added
craft\fieldlayoutelements\TextareaField
. - Added
craft\fieldlayoutelements\users\AddressesField
. - Added
craft\fields\Assets::$allowSubfolders
. - Added
craft\fields\Assets::$restrictedDefaulUploadSubpath
. - Added
craft\fields\BaseRelationField::createSelectionCondition()
. - Added
craft\fields\BaseRelationField::getSelectionCondition()
. - Added
craft\fields\BaseRelationField::setSelectionCondition()
. - Added
craft\fields\conditions\DateFieldConditionRule
. - Added
craft\fields\conditions\FieldConditionRuleInterface
. - Added
craft\fields\conditions\FieldConditionRuleTrait
. - Added
craft\fields\conditions\LightswitchFieldConditionRule
. - Added
craft\fields\conditions\NumberFieldConditionRule
. - Added
craft\fields\conditions\OptionsFieldConditionRule
. - Added
craft\fields\conditions\RelationalFieldConditionRule
. - Added
craft\fields\conditions\TextFieldConditionRule
. - Added
craft\fields\Money
. - Added
craft\fs\Local
. - Added
craft\fs\MissingFs
. - Added
craft\fs\Temp
. - Added
craft\gql\arguments\elements\Address
. - Added
craft\gql\base\SingularTypeInterface
. - Added
craft\gql\interfaces\elements\Address
. - Added
craft\gql\queries\Address
. - Added
craft\gql\resolvers\elements\Address
. - Added
craft\gql\TypeManager::registerFieldDefinitions()
. - Added
craft\gql\types\elements\Address
. - Added
craft\gql\types\generators\AddressType
. - Added
craft\helpers\App::cliOption()
. - Added
craft\helpers\App::devMode()
. - Added
craft\helpers\App::envConfig()
. (#10869) - Added
craft\helpers\App::isStreamLog()
. - Added
craft\helpers\App::normalizeValue()
. - Added
craft\helpers\Assets::downloadFile()
. - Added
craft\helpers\Assets::iconPath()
. - Added
craft\helpers\Assets::iconUrl()
. - Added
craft\helpers\Assets::revParams()
. - Added
craft\helpers\Cp::addressCardHtml()
. - Added
craft\helpers\Cp::addressCardsHtml()
. - Added
craft\helpers\Cp::addressFieldsHtml()
. - Added
craft\helpers\Cp::dateFieldHtml()
. - Added
craft\helpers\Cp::dateHtml()
. - Added
craft\helpers\Cp::elementSelectHtml()
. - Added
craft\helpers\Cp::EVENT_DEFINE_ELEMENT_INNER_HTML
. (#11035) - Added
craft\helpers\Cp::fieldLayoutDesignerHtml()
. - Added
craft\helpers\Cp::lightswitchHtml()
. - Added
craft\helpers\Cp::multiSelectFieldHtml()
. - Added
craft\helpers\Cp::multiSelectHtml()
. - Added
craft\helpers\Cp::requestedSite()
. - Added
craft\helpers\Cp::textareaHtml()
. - Added
craft\helpers\Cp::textHtml()
. - Added
craft\helpers\Cp::timeFieldHtml()
. - Added
craft\helpers\Cp::timeHtml()
. - Added
craft\helpers\Db::dropAllForeignKeysToTable()
. - Added
craft\helpers\Db::dropForeignKeyIfExists()
. - Added
craft\helpers\Db::dropIndexIfExists()
. - Added
craft\helpers\Db::findForeignKey()
. - Added
craft\helpers\Db::findIndex()
. - Added
craft\helpers\Db::parseMoneyParam()
. - Added
craft\helpers\Db::parseNumericParam()
. - Added
craft\helpers\Db::prepareMoneyForDb()
. - Added
craft\helpers\Db::renameTable()
. - Added
craft\helpers\FileHelper::deleteFileAfterRequest()
. - Added
craft\helpers\FileHelper::deleteQueuedFiles()
. - Added
craft\helpers\Gql::getSchemaContainedEntryTypes)()
. - Added
craft\helpers\Html::hiddenLabel()
. - Added
craft\helpers\Html::unwrapCondition()
. - Added
craft\helpers\Html::unwrapNoscript()
. - Added
craft\helpers\ImageTransforms
. - Added
craft\helpers\Money
. - Added
craft\helpers\Number::isInt()
. - Added
craft\helpers\Number::toIntOrFloat()
. - Added
craft\helpers\ProjectConfig::encodeValueAsString()
. - Added
craft\helpers\ProjectConfig::ensureAllSectionsProcessed()
. - Added
craft\helpers\ProjectConfig::traverseDataArray()
. - Added
craft\helpers\Typecast
. (#10706) - Added
craft\i18n\Translation
. - Added
craft\imagetransforms\ImageTransformer
. - Added
craft\log\ContextProcessor
. - Added
craft\log\Dispatcher::getTargets()
. - Added
craft\log\MessageProcessor
. - Added
craft\log\MonologTarget
. - Added
craft\models\AssetIndexingSession
. - Added
craft\models\FieldLayout::getElementsByType()
. - Added
craft\models\FieldLayout::getFirstElementByType()
. - Added
craft\models\FieldLayout::getFirstVisibleElementByType()
. - Added
craft\models\FieldLayout::getVisibleCustomFields()
. - Added
craft\models\FieldLayout::getVisibleElementsByType()
. - Added
craft\models\FieldLayoutElement::$uid
. - Added
craft\models\FieldLayoutElement::getLayout()
andsetLayout()
. - Added
craft\models\FieldLayoutForm::getVisibleElements()
. - Added
craft\models\FieldLayoutFormTab::getTabId()
. - Added
craft\models\FieldLayoutFormTab::getUid()
. - Added
craft\models\FieldLayoutTab::getElements()
andsetElements()
. - Added
craft\models\FsListing
. - Added
craft\models\ImageTransform
. - Added
craft\models\ImageTransformIndex
. - Added
craft\models\ProjectConfigData
. - Added
craft\models\ReadOnlyProjectConfigData
. - Added
craft\models\Volume
. - Added
craft\queue\jobs\Proxy
. - Added
craft\queue\Queue::$proxyQueue
, which can be set to another queue configuration that all jobs should be sent to as proxies. (#10999) - Added
craft\records\Address
. - Added
craft\records\AssetIndexingSession
. - Added
craft\records\ImageTransform
. - Added
craft\services\Addresses
. - Added
craft\services\AssetIndexer::createIndexingSession()
. - Added
craft\services\AssetIndexer::getExistingIndexingSessions()
. - Added
craft\services\AssetIndexer::getIndexingSessionById()
. - Added
craft\services\AssetIndexer::getMissingEntriesForSession()
. - Added
craft\services\AssetIndexer::getSkippedItemsForSession()
. - Added
craft\services\AssetIndexer::indexFileByListing()
. - Added
craft\services\AssetIndexer::indexFolderByEntry()
. - Added
craft\services\AssetIndexer::indexFolderByListing()
. - Added
craft\services\AssetIndexer::processIndexSession()
. - Added
craft\services\AssetIndexer::removeCliIndexingSessions()
. - Added
craft\services\AssetIndexer::startIndexingSession()
. - Added
craft\services\AssetIndexer::stopIndexingSession()
. - Added
craft\services\Assets::getImagePreviewUrl()
. - Added
craft\services\AssetTransforms::deleteTransformIndexDataByAssetIds()
. - Added
craft\services\Conditions
. - Added
craft\services\Config::CATEGORY_CUSTOM
. - Added
craft\services\Config::getCustom()
. - Added
craft\services\Drafts::removeDraftData()
. - Added
craft\services\ElementSources
, which replacescraft\services\ElementIndexes
. - Added
craft\services\Fields::createLayout()
. - Added
craft\services\Fs
. - Added
craft\services\Gc::hardDeleteElements()
. - Added
craft\services\Gc::removeEmptyTempFolders()
. - Added
craft\services\Gql::prepareFieldDefinitions()
. - Added
craft\services\ImageTransforms
. - Added
craft\services\Matrix::createRevisionBlocks()
. - Added
craft\services\Matrix::duplicateOwnership()
. - Added
craft\services\ProjectConfig::ASSOC_KEY
. - Added
craft\services\ProjectConfig::PATH_DATE_MODIFIED
. - Added
craft\services\ProjectConfig::PATH_ELEMENT_SOURCES
. - Added
craft\services\ProjectConfig::PATH_FS
. - Added
craft\services\ProjectConfig::PATH_META_NAMES
. - Added
craft\services\ProjectConfig::PATH_SCHEMA_VERSION
. - Added
craft\services\ProjectConfig::PATH_SYSTEM
. - Added
craft\services\ProjectConfig::rememberAppliedChanges()
. - Added
craft\services\Users::deactivateUser()
. - Added
craft\services\Users::ensureUserByEmail()
, which will return a user for the given email, creating one if it didn’t exist yet. - Added
craft\services\Users::EVENT_AFTER_DEACTIVATE_USER
. - Added
craft\services\Users::EVENT_BEFORE_DEACTIVATE_USER
. - Added
craft\services\Users::removeCredentials()
. - Added
craft\services\Volumes::getTemporaryVolume()
. - Added
craft\services\Volumes::getUserPhotoVolume()
. - Added
craft\validators\MoneyValidator
. - Added
craft\web\assets\conditionbuilder\ConditionBuilderAsset
. - Added
craft\web\assets\htmx\HtmxAsset
. - Added
craft\web\assets\money\MoneyAsset
. - Added
craft\web\Controller::asCpScreen()
. - Added
craft\web\Controller::asFailure()
. - Added
craft\web\Controller::asModelFailure()
. - Added
craft\web\Controller::asModelSuccess()
. - Added
craft\web\Controller::asSuccess()
. - Added
craft\web\Controller::CpScreenResponseBehavior()
. - Added
craft\web\Controller::CpScreenResponseFormatter()
. - Added
craft\web\Controller::getPostedRedirectUrl()
. - Added
craft\web\Controller::TemplateResponseBehavior()
. - Added
craft\web\Controller::TemplateResponseFormatter()
. - Added
craft\web\twig\Extension::addressFilter()
. - Added
craft\web\twig\Extension::moneyFilter()
. - Added
craft\web\twig\variables\Cp::fieldLayoutDesigner()
. - Added
craft\web\twig\variables\Cp::getFsOptions()
. - Added
craft\web\twig\variables\Cp::getVolumeOptions()
. - Added
craft\web\View::clearCssFileBuffer()
. - Added
craft\web\View::clearJsFileBuffer()
. - Added
craft\web\View::startCssFileBuffer()
. - Added
craft\web\View::startJsFileBuffer()
. - Added the
Craft.appendBodyHtml()
JavaScript method, which replaces the now-deprecatedappendFootHtml()
method. - Added the
Craft.CpScreenSlideout
JavaScript class, which can be used to create slideouts from actions that return$this->asCpScreen()
. - Added the
Craft.ElementEditor
JavaScript class. - Added the
Craft.ElementEditorSlideout
JavaScript class. - Added the
Craft.getPageUrl()
JavaScript method. - Added the
Craft.getQueryParam()
JavaScript method. - Added the
Craft.getQueryParams()
JavaScript method. - Added the
Craft.namespaceId()
JavaScript method. - Added the
Craft.namespaceInputName()
JavaScript method. - Added the
Craft.Preview.refresh()
JavaScript method. - Added the
Craft.Queue
JavaScript class. - Added the
Craft.setElementAttributes()
JavaScript method. - Added the
Craft.setPath()
JavaScript method. - Added the
Craft.setQueryParam()
JavaScript method. - Added the
Craft.setUrl()
JavaScript method. - Added the
Craft.ui.createButton()
JavaScript method. - Added the
Craft.ui.createSubmitButton()
JavaScript method. - Added the
htmx.org
JavaScript library. - Added the commerceguys/addressing package.
- Added the illuminate/collections package. (#8475)
- Added the moneyphp/money package.
- Added the symfony/var-dumper package.
- Added the theiconic/name-parser package.
- Added the yiisoft/yii2-symfonymailer package.
- Craft now requires PHP 8.0.2 or later.
- Craft now requires MySQL 5.7.8 / MariaDB 10.2.7 / PostgreSQL 10.0 or later.
- Craft now requires the Intl and BCMath PHP extensions.
- Improved draft creation/application performance. (#10577)
- Improved revision creation performance. (#10589)
- The “What’s New” HUD now displays an icon and label above each announcement, identifying where it came from (Craft CMS or a plugin). (#9747)
- The control panel now keeps track of the currently-edited site on a per-tab basis by adding a
site
query string param to all control panel URLs. (#8920) - Element index pages’ status and sort menu option selections are now coded into the page URL via
status
andsort
query string params. (#10669) - Users are no longer required to have a username or email.
- Users can now set their Formatting Locale to any known locale; not just the available Language options. (#10519)
- Users’ Language and Formatting Locale settings now display locale names in the current language and their native languages. (#10519)
- User queries now return all users by default, rather than only active users.
- Filtering users by
active
,pending
, andlocked
statuses no longer excludes suspended users. credentialed
andinactive
are now reserved user group handles.- Elements throughout the control panel are now automatically updated whenever they’re saved by another browser tab.
- Assets fields that are restricted to a single location can now be configured to allow selection within subfolders of that location. (#9070)
- When an image is saved as a new asset from the Image Editor via an Assets field, the Assets field will now automatically replace the selected asset with the new one. (#8974)
alt
is now a reserved field handle for volume field layouts.- Volumes no longer have “types”, and their file operations are now delegated to a filesystem selected by an “Asset Filesystem” setting on the volume.
- Volumes now have “Transform Filesystem” and “Transform Subpath” settings, which can be used to choose where image transforms should be stored. (The volume’s Asset Filesystem will be used by default.)
- Asset thumbnails are now generated as image transforms.
- It’s now possible to create volumes directly from the User Settings page.
- Images that are not web-safe now are always converted to JPEGs when transforming, if no format was specified.
- Entry post dates are no longer set automatically until the entry is validated with the
live
scenario. (#10093) - Entry queries’
authorGroup()
param method now accepts an array ofcraft\models\UserGroup
objects. - Element queries’
revision
params can now be set tonull
to include normal and revision elements. - Element queries can no longer be traversed or accessed like an array. Use a query execution method such as
all()
,collect()
, orone()
to fetch the results before working with them. - Element queries’
title
params no longer treat values with commas as arrays. (#10891) - User queries’
firstName
andlastName
params no longer treat values with commas as arrays. (#10891) - Relational fields now load elements in the current site rather than the primary site, if the source element isn’t localizable. (#7048)
- Lightswitch fields can no longer be marked as required within field layouts. (#10773)
- Built-in queue jobs are now always translated for the current user’s language. (#9745)
- Path options passed to console commands (e.g.
--basePath
) now take precedence over their enivronment variable/PHP constant counterparts. - Database backups are now named after the Craft version in the database, rather than the Composer-installed version. (#9733)
- Template autosuggestions now include their filename. (#9744)
- Improved the look of loading spinners in the control panel. (#9109)
- The default
subLeft
andsubRight
search query term options are now only applied to terms that don’t include an asterisk at the beginning/end, e.g.hello*
. (#10613) {% cache %}
tags now store any external JavaScript or CSS files registered with{% js %}
and{% css %}
tags. (#9987)- All control panel templates end in
.twig
now. (#9743) - 404 requests are no longer logged by default. (#10659)
- Log entries are now single-line by default when Dev Mode is disabled. (#10659)
- Log files are now rotated once every 24 hours. (#10659)
CRAFT_STREAM_LOG
no longer logs in addition to other log targets. (#10659)- The default log target no longer logs
debug
orinfo
messages when Dev Mode is enabled. (#10916) - SQL query logs now use the
debug
log level, so they no longer get logged when Dev Mode is enabled. (#10916) yii\db\Connection::$enableLogging
and$enableProfiling
are no longer enabled by default when Dev Mode is disabled. (#10916)- The
queue
log target no longer has special handling for Yii orinfo
logs. (#10916) - A warning is now logged if an element query is executed before Craft is fully initialized. (#11033)
- A warning is now logged if Twig is instantiated before Craft is fully initialized. (#11033)
- Craft’s bootstrap script now attempts to create its configured system paths automatically. (#10562)
- When using GraphQL to mutate entries, the
enabled
status is now affected on a per-site basis when specifying both theenabled
andsiteId
parameters. (#9771) - The
forms/selectize
control panel template now supportsaddOptionFn
andaddOptionLabel
params, which can be set to add new options to the list. - Editable tables now support
allowAdd
,allowDelete
, andallowReorder
settings, replacingstaticRows
. (#10163) - Column definitions passed to the
_includes/forms/editableTable
control panel template can now specify awidth
key. (#11062) - The
limitField
macro in the_components/fieldtypes/elementfieldsettings
control panel template has been renamed tolimitFields
. - Renamed the
elements/get-categories-input-html
action tocategories/input-html
. - Renamed the
elements/get-modal-body
action toelement-selector-modals/body
. - The
entries/save-entry
action now returns a 400 HTTP status for JSON responses when the entry couldn’t be saved. - The
users/save-user
action no longer includes aunverifiedEmail
key in failure responses. - The
users/set-password
action now returns a 400 HTTP status when an invalid token is passed, if there’s no URL to redirect to. (#10592) install/*
,setup/*
,db/*
, andhelp
actions no longer output a warning if Craft can’t connect to the database. (#10851)createFoldersInVolume:<uid>
user permissions have been renamed tocreateFolders:<uid>
.deleteFilesAndFoldersInVolume:<uid>
user permissions have been renamed todeleteAssets:<uid>
.deletePeerFilesInVolume:<uid>
user permissions have been renamed todeletePeerAssets:<uid>
.editCategories:<uid>
user permissions have been split intoviewCategories:<uid>
,saveCategories:<uid>
,deleteCategories:<uid>
,viewPeerCategoryDrafts:<uid>
,savePeerCategoryDrafts:<uid>
, anddeletePeerCategoryDrafts:<uid>
.editEntries:<uid>
user permissions have been renamed toviewEntries:<uid>
.editImagesInVolume:<uid>
user permissions have been renamed toeditImages:<uid>
.editPeerEntries:<uid>
user permissions have been renamed toviewPeerEntries:<uid>
.editPeerEntryDrafts:<uid>
user permissions have been split intoviewPeerEntryDrafts:<uid>
andsavePeerEntryDrafts:<uid>
.editPeerFilesInVolume:<uid>
user permissions have been renamed tosavePeerAssets:<uid>
.editPeerImagesInVolume:<uid>
user permissions have been renamed toeditPeerImages:<uid>
.publishEntries:<uid>
user permissions have been renamed tosaveEntries:<uid>
, and no longer differentiate between enabled and disabled entries. (Users withviewEntries:<uid>
permissions will still be able to create drafts.)publishPeerEntries:<uid>
user permissions have been renamed tosavePeerEntries:<uid>
, and no longer differentiate between enabled and disabled entries. (Users withviewPeerEntries:<uid>
permissions will still be able to create drafts.)replaceFilesInVolume:<uid>
user permissions have been renamed toreplaceFiles:<uid>
.replacePeerFilesInVolume:<uid>
user permissions have been renamed toreplacePeerFiles:<uid>
.saveAssetInVolume:<uid>
user permissions have been renamed tosaveAssets:<uid>
.viewPeerFilesInVolume:<uid>
user permissions have been renamed toviewPeerAssets:<uid>
.viewVolume:<uid>
user permissions have been renamed toviewAssets:<uid>
.- Elements’
searchScore
GraphQL fields are now returned as integers. - Element types must now override
craft\base\Element::isDeletable()
if its elements should be deletable from the index page. - Element types’
cpEditUrl()
methods no longer need to add asite
param; one will be added automatically bycraft\base\Element::getCpEditUrl()
. - Element types’
defineActions()
methods’$source
arguments should no longer acceptnull
. - Element types’
defineSources()
methods’$context
arguments should no longer acceptnull
. - Element types’
getHtmlAttributes()
andhtmlAttributes()
methods must now return attribute arrays that are compatible withcraft\helpers\Html::renderTagAttributes()
. - Element types’
sources()
methods’$context
arguments should no longer acceptnull
. - Element types’
tableAttributes()
anddefineTableAttributes()
methods should no longer return a generic attribute for defining the header column heading at the beginning of the returned array. The header column heading is now set to the element type’s display name, per itsdisplayName()
method. - Block element types’
getOwner()
methods can now returnnull
. - Control panel resource locations are now cached, so resource requests can be resolved when Craft isn’t installed yet, or a database connection can’t be established. (#10642)
- Control panel resources are now served with cache headers, if the
buildId
config setting is set. (#10705) - Empty subfolders within the temporary upload volume are now removed during garbage collection. (#10746)
- Most config settings can now be overridden via environment variables. (#10573, #10869)
- It’s now possible to configure the Debug Toolbar to store its data files on a filesystem, rather than within
storage/runtime/debug/
. (#10825) craft\base\AssetPreviewHandlerInterface::getPreviewHtml()
now accepts an optional array of variable to pass on to the template.craft\base\Element::__get()
now clones custom field values before returning them. (#8781)craft\base\Element::fieldLayoutFields()
now has avisibleOnly
argument.craft\base\Element::getFieldValue()
now returns eager-loaded element values for the field, when they exist. (#10047)craft\base\Element::metaFieldsHtml()
now has astatic
argument.craft\base\Element::setFieldValue()
now unsets any previously-eager-loaded elements for the field. (#11003)craft\base\Element::slugFieldHtml()
now has astatic
argument.craft\base\ElementInterface::getEagerLoadedElements()
now returns anIlluminate\Support\Collection
object instead of an array. (#8513)craft\base\ElementInterface::getSidebarHtml()
now has astatic
argument.craft\base\MemoizableArray
no longer extendsArrayObject
, and now implementsIteratorAggregate
andCountable
directly.craft\base\Model::__construct()
andsetAttributes()
now automatically typecast values that map to properties withint
,float
,int|float
,string
,bool
,array
, orDateTime
type declarations. (#10706)craft\base\Model::datetimeAttributes()
is now called from the constructor, instead of theinit()
method.craft\base\Model::setAttributes()
now normalizes date attributes intoDateTime
objects.craft\behaviors\FieldLayoutBehavior::getFields()
has been renamed togetCustomFields()
.craft\elements\Asset::getImg()
now sets thealt
attribute to the native Alternative Text field value, if set.craft\elements\Asset::getVolume()
now returns an instance ofcraft\models\Volume
.craft\elements\db\ElementQuery::ids()
no longer accepts an array of criteria params.craft\events\DraftEvent::$source
has been renamed to$canonical
.craft\events\GetAssetThumbUrlEvent
has been renamed toDefineAssetThumbUrlEvent
.craft\events\GetAssetUrlEvent
has been renamed toDefineAssetUrlEvent
.craft\events\RevisionEvent::$source
has been renamed to$canonical
.craft\fieldlayoutelements\AssetTitleField
has been renamed tocraft\fieldlayoutelements\assets\AssetTitleField
.craft\fieldlayoutelements\EntryTitleField
has been renamed tocraft\fieldlayoutelements\entries\EntryTitleField
.craft\fieldlayoutelements\StandardField
has been renamed tocraft\fieldlayoutelements\BaseNativeField
.craft\fieldlayoutelements\StandardTextField
has been renamed tocraft\fieldlayoutelements\TextField
.craft\fields\Assets::$singleUploadLocationSource
has been renamed to$restrictedLocationSource
.craft\fields\Assets::$singleUploadLocationSubpath
has been renamed to$restrictedLocationSubpath
.craft\fields\Assets::$useSingleFolder
has been renamed to$restrictLocation
.craft\fields\BaseRelationField::$limit
has been renamed to$maxRelations
.craft\fields\BaseRelationField::elementType()
is now public.craft\fields\BaseRelationField::inputSelectionCriteria()
has been renamed togetInputSelectionCriteria()
, and is now public.craft\fields\BaseRelationField::inputSources()
has been renamed togetInputSources()
, and is now public.craft\gql\directives\FormatDateTime::defaultTimezone()
has been renamed todefaultTimeZone()
.craft\gql\TypeManager::EVENT_DEFINE_GQL_TYPE_FIELDS
is now triggered when actually resolving fields for a GraphQL type, rather than when the type is first created. (#9626)craft\helpers\App::env()
now checks for a PHP constant as well, if the environment variable didn’t exist.craft\helpers\App::env()
now returnsnull
if a value couldn’t be found, rather thanfalse
.craft\helpers\App::env()
now returns a boolean if the original value was'true'
or'false'
.craft\helpers\App::env()
now returns an integer or float if the original value was numeric.craft\helpers\ArrayHelper::getValue()
now supports keys in square bracket syntax, e.g.foo[bar][baz]
.craft\helpers\Assets::generateUrl()
no longer accepts a transform index for date modified comparisons. ADateTime
object is expected instead.craft\helpers\Assets::urlAppendix()
no longer accepts a transform index for date modified comparisons. ADateTime
object is expected instead.craft\helpers\Component::createComponent()
now automatically typecasts values that map to properties withint
,float
,int|float
,string
,bool
,array
, orDateTime
type declarations. (#10706)craft\helpers\Cp::elementHtml()
now has an$autoReload
argument.craft\helpers\Db::batchInsert()
,craft\helpers\Db::insert()
,craft\db\Command::batchInsert()
,craft\db\Command::insert()
,craft\db\Migration::batchInsert()
, andcraft\db\Migration::insert()
no longer have$includeAuditColumns
arguments, and now check if the table hasdateCreated
,dateUpdated
, and/oruid
columns before setting their values.craft\helpers\Db::parseParam()
now validates that numeric values are passed if the$columnType
is set to a numeric column type. (#9142)craft\helpers\Db::prepareDateForDb()
no longer has a$stripSeconds
argument.craft\helpers\Db::prepareValueForDb()
now has a$columnType
argument.craft\helpers\Db::truncateTable()
now returnsvoid
rather thanint
.craft\helpers\Db::update()
,craft\helpers\Db::upsert()
,craft\db\Command::update()
,craft\db\Command::upsert()
,craft\db\Migration::update()
’ andcraft\db\Migration::upsert()
’$includeAuditColumns
arguments have been renamed to$updateTimestamp
, and only affect thedateCreated
column now. All upserts now check if the table hasdateCreated
,dateUpdated
, and/oruid
columns before setting their values.craft\helpers\Db::upsert()
,craft\db\Command::upsert()
, andcraft\db\Migration()
no longer merge the$updateColumns
array into$insertColumns
. The full array ofINSERT
column values should be passed to$insertColumns
now.craft\helpers\Gql::getUnionType()
no longer requires a resolver function to be passed, if the union contains only element GraphQL types.craft\helpers\Html::beginForm()
not setsaccept-charset="UTF-8"
by default.craft\helpers\Html
now supports defininghx-*
anddata-hx-*
attributes via ahx
anddata-hx
keys, similar toaria
anddata
.craft\helpers\i18n\Formatter::asPercent()
now chooses a default$decimals
value based on the value given, ifnull
.craft\helpers\i18n\Formatter::asPercent()
now treats all empty values as0
.craft\helpers\MailerHelper::normalizeEmails()
now returns an empty array instead ofnull
.craft\helpers\MigrationHelper::dropAllIndexesOnTable()
no longer returns an array of the dropped indexes.craft\helpers\Queue::push()
now has a$queue
argument.craft\models\FieldLayout::EVENT_DEFINE_STANDARD_FIELDS
has been renamed toEVENT_DEFINE_NATIVE_FIELDS
.craft\models\FieldLayout::getAvailableStandardFields()
has been renamed togetAvailableNativeFields()
.craft\models\FieldLayout::getFields()
has been renamed togetCustomFields()
.craft\queue\Queue::$channel
is now set automatically based on the queue’s application component ID.craft\services\Announcements::push()
no longer accepts callables to be passed to the$heading
and$body
arguments.craft\i18n\Translation::prep()
should be used to prepare the messages to be lazy-translated instead.craft\services\AssetIndexer::storeIndexList()
now expects the first argument to be a generator that returnscraft\models\FsListing
objects.craft\services\Assets::ensureFolderByFullPathAndVolume()
now returns acraft\models\VolumeFolder
object rather than a folder ID.craft\services\Assets::ensureTopFolder()
now returns acraft\models\VolumeFolder
object rather than a folder ID.craft\services\Assets::EVENT_GET_ASSET_THUMB_URL
has been renamed toEVENT_DEFINE_THUMB_URL
.craft\services\Assets::EVENT_GET_ASSET_URL
has been moved tocraft\elements\Asset::EVENT_DEFINE_URL
.craft\services\AssetTransforms::CONFIG_TRANSFORM_KEY
has been moved tocraft\services\ProjectConfig::PATH_IMAGE_TRANSFORMS
.craft\services\Categories::CONFIG_CATEGORYROUP_KEY
has been moved tocraft\services\ProjectConfig::PATH_CATEGORY_GROUPS
.craft\services\Fields::CONFIG_FIELDGROUP_KEY
has been moved tocraft\services\ProjectConfig::PATH_FIELD_GROUPS
.craft\services\Fields::CONFIG_FIELDS_KEY
has been moved tocraft\services\ProjectConfig::PATH_FIELDS
.craft\services\Globals::CONFIG_GLOBALSETS_KEY
has been moved tocraft\services\ProjectConfig::PATH_GLOBAL_SETS
.craft\services\Gql::CONFIG_GQL_KEY
has been moved tocraft\services\ProjectConfig::PATH_GRAPHQL
.craft\services\Gql::CONFIG_GQL_PUBLIC_TOKEN_KEY
has been moved tocraft\services\ProjectConfig::PATH_GRAPHQL_PUBLIC_TOKEN
.craft\services\Gql::CONFIG_GQL_SCHEMAS_KEY
has been moved tocraft\services\ProjectConfig::PATH_GRAPHQL_SCHEMAS
.craft\services\Matrix::CONFIG_BLOCKTYPE_KEY
has been moved tocraft\services\ProjectConfig::PATH_MATRIX_BLOCK_TYPES
.craft\services\Matrix::duplicateBlocks()
now has a$deleteOtherBlocks
argument.craft\services\Plugins::CONFIG_PLUGINS_KEY
has been moved tocraft\services\ProjectConfig::PATH_PLUGINS
.craft\services\Plugins::doesPluginRequireDatabaseUpdate()
has been renamed toisPluginUpdatePending()
.craft\services\ProjectConfig::applyYamlChanges()
has been renamed toapplyExternalChanges()
.craft\services\ProjectConfig::getDoesYamlExist()
has been renamed togetDoesExternalConfigExist()
.craft\services\ProjectConfig::getIsApplyingYamlChanges()
has been renamed togetIsApplyingExternalChanges()
.craft\services\ProjectConfig::set()
now returnstrue
orfalse
depending on whether the project config was modified.craft\services\Revisions::createRevision()
now returns the ID of the revision, rather than the revision itself.craft\services\Routes::CONFIG_ROUTES_KEY
has been moved tocraft\services\ProjectConfig::PATH_ROUTES
.craft\services\Sections::CONFIG_ENTRYTYPES_KEY
has been moved tocraft\services\ProjectConfig::PATH_ENTRY_TYPES
.craft\services\Sections::CONFIG_SECTIONS_KEY
has been moved tocraft\services\ProjectConfig::PATH_PATH_SECTIONS
.craft\services\Sites::CONFIG_SITEGROUP_KEY
has been moved tocraft\services\ProjectConfig::PATH_SITE_GROUPS
.craft\services\Sites::CONFIG_SITES_KEY
has been moved tocraft\services\ProjectConfig::PATH_SITES
.craft\services\Tags::CONFIG_TAGGROUP_KEY
has been moved tocraft\services\ProjectConfig::PATH_TAG_GROUPS
.craft\services\Updates::getIsCraftDbMigrationNeeded()
has been renamed togetIsCraftUpdatePending()
.craft\services\Updates::getIsPluginDbUpdateNeeded()
has been renamed togetIsPluginUpdatePending()
.craft\services\UserGroups::CONFIG_USERPGROUPS_KEY
has been moved tocraft\services\ProjectConfig::PATH_USER_GROUPS
.craft\services\UserPermissions::getAllPermissions()
andgetAssignablePermissions()
now return permission groups as arrays withheading
andpermission
sub-keys, fixing a bug where two groups with the same heading would conflict with each other. (#7771)craft\services\Users::CONFIG_USERLAYOUT_KEY
has been moved tocraft\services\ProjectConfig::PATH_USER_FIELD_LAYOUTS
.craft\services\Users::CONFIG_USERS_KEY
has been moved tocraft\services\ProjectConfig::PATH_USERS
.craft\services\Volumes::CONFIG_VOLUME_KEY
has been moved tocraft\services\ProjectConfig::PATH_VOLUMES
.craft\test\fixtures\elements\BaseElementFixture
now validates elements with thelive
scenario if they are enabled, canonical, and not a provisional draft.craft\test\TestSetup::getMockApp()
has been renamed togetMockModule()
, and its$appClass
argument has been renamed to$moduleClass
.craft\web\Request::getBodyParam()
now accepts nested param names in thefoo[bar][baz]
format.craft\web\Request::getBodyParams()
andgetBodyParam()
now check for anX-Craft-Namespace
header. If present, only params that begin with its value will be returned, excluding the namespace.craft\web\View::renderString()
now has an$escapeHtml
argument.craft\web\View::setNamespace()
’$namespace
argument no longer has a default value ofnull
.- The
Craft.getUrl()
JavaScript method now removes duplicate query string params when passing in a param that’s already included in the base URL. - The
Craft.getUrl()
JavaScript method now encodes any query string params passed to it. Craft.broadcastChannel
has been split up into two broadcast channels:Craft.broadcaster
andCraft.messageReceiver
.Craft.cp.$tabs
now returns a collection of the tabs’<a>
elements, as they no longer have wrapping<li>
elements.- Local volumes no longer use Flysystem.
- A selected volume for user photo storage if no longer displayed if no volume has been set.
- The user photo volume can now only be set to a volume that has a public transform filesystem configured.
- Craft now uses Symfony Mailer to send email. (#10062)
- Updated Twig to 3.3.
- Updated vue-autosuggest to 2.2.0.
- Deprecated the
autosaveDrafts
config setting. - Deprecated the
anyStatus
element query param.status(null)
should be used instead. - Deprecated the
immediately
argument for transforms created over GraphQL. It no longer has any effect. - Deprecated
craft\base\ApplicationTrait::getInstalledSchemaVersion()
. - Deprecated
craft\base\Model::datetimeAttributes()
. (#10706) - Deprecated
craft\elements\User::getFullName()
.$fullName
should be used instead. - Deprecated
craft\gql\TypeManager::flush()
.craft\services\Gql::flushCaches()
should be used instead. - Deprecated
craft\gql\TypeManager::prepareFieldDefinitions()
.craft\services\Gql::prepareFieldDefinitions()
should be used instead. - Deprecated
craft\helpers\ArrayHelper::append()
.array_unshift()
should be used instead. - Deprecated
craft\helpers\ArrayHelper::prepend()
.array_push()
should be used instead. - Deprecated
craft\helpers\MigrationHelper
. - Deprecated
craft\i18n\I18N::getIsIntlLoaded()
. - Deprecated
craft\services\Assets::getAssetUrl()
.craft\elements\Asset::getUrl()
should be used instead. - Deprecated
craft\services\Assets::getIconPath()
.craft\helpers\Assets::iconPath()
should be used instead. - Deprecated
craft\web\Controller::asErrorJson()
.asFailure()
should be used instead. - Deprecated the
assets/save-asset
action.elements/save
should be used instead. - Deprecated the
categories/save-category
action.elements/save
should be used instead. - Deprecated the
Craft.appendFootHtml()
JavaScript method.appendBodyHtml()
should be used instead.
- Removed the “Header Column Heading” element source setting.
- Removed support for setting custom config settings from
config/general.php
.config/custom.php
should be used instead. (#10012) - Removed the
customAsciiCharMappings
config setting. - Removed the
siteName
config setting. Environment-specific site names can be defined via environment variables. - Removed the
siteUrl
config setting. Environment-specific site URLs can be defined via environment variables. - Removed the
suppressTemplateErrors
config setting. - Removed the
useCompressedJs
config setting. - Removed the
useProjectConfigFile
config setting. Overridecraft\services\ProjectConfig::$writeYamlAutomatically
to opt into manual YAML file generation. - Removed support for
config/volumes.php
. Volumes can now specify per-environment filesystems. - Removed support for the
CRAFT_SITE_URL
PHP constant. Environment-specific site URLs can be defined via environment variables. - Removed the
enabledForSite
GraphQL argument.status
should be used instead. - Removed the
{% includeHiResCss %}
Twig tag. - Removed support for deprecated
DateTime
faux Twig methodsatom()
,cookie()
,iso8601()
,rfc822()
,rfc850()
,rfc1036()
,rfc1123()
,rfc2822()
,rfc3339()
,rss()
,w3c()
,w3cDate()
,mySqlDateTime()
,localeDate()
,localeTime()
,year()
,month()
,day()
,nice()
, anduiTimestamp()
. - Removed the
locale
element property.siteId
should be used instead. - Removed the
ownerLocale
Matrix block query param.site
orsiteId
should be used instead. - Removed support for
sourceLocale
inrelatedTo
element query params.sourceSite
should be used instead. - Removed the
craft.categoryGroups
Twig variable. - Removed the
craft.config
Twig variable. - Removed the
craft.deprecator
Twig variable. - Removed the
craft.elementIndexes
Twig variable. - Removed the
craft.emailMessages
Twig variable. - Removed the
craft.feeds
Twig variable. - Removed the
craft.fields
Twig variable. - Removed the
craft.globals
Twig variable. - Removed the
craft.i18n
Twig variable. - Removed the
craft.request
Twig variable. - Removed the
craft.sections
Twig variable. - Removed the
craft.session
Twig variable. - Removed the
craft.systemSettings
Twig variable. - Removed the
craft.userGroups
Twig variable. - Removed the
craft.userPermissions
Twig variable. - Removed the
assignUserGroups
user permission, which authorized users to assign other users to their own groups. Authorization must now be explicitly granted for each group. (#10422) - Removed the
customizeSources
user permission. Only admins can customize element sources now, and only from an environment that allows admin changes. - Removed the
publishPeerEntryDrafts:<uid>
permissions, as they were pointless. (If a user is authorized to save an entry and view other users’ drafts of it, there’s nothing stopping them from making the same changes themselves.) - Removed the
assets/edit-asset
action. - Removed the
assets/thumb
action. - Removed the
categories/edit-category
action. - Removed the
categories/preview-category
action. - Removed the
categories/share-category
action. - Removed the
categories/view-shared-category
action. - Removed the
dashboard/get-feed-items
action. - Removed the
elements/get-editor-html
action. - Removed the
entries/switch-entry-type
action. - Removed
craft\base\ApplicationTrait::getEntryRevisions()
. - Removed
craft\base\ApplicationTrait::getFeed()
. - Removed
craft\base\Element::ATTR_STATUS_CONFLICTED
. - Removed
craft\base\Element::getHasFreshContent()
.getIsFresh()
should be used instead. - Removed
craft\base\ElementInterface::getEditorHtml()
. Element edit forms are now exclusively driven by their field layout. - Removed
craft\base\FieldLayoutElementInterface
. - Removed
craft\base\FlysystemVolume
. - Removed
craft\base\LocalVolumeInterface
. - Removed
craft\base\Volume
. - Removed
craft\base\VolumeInterface
. - Removed
craft\base\VolumeTrait
. - Removed
craft\behaviors\FieldLayoutBehavior::setFields()
. - Removed
craft\config\DbConfig::updateDsn()
. - Removed
craft\console\Request::getIsSingleActionRequest()
. - Removed
craft\controllers\AssetTransformsController
. - Removed
craft\controllers\BaseUpdaterController::ACTION_COMPOSER_OPTIMIZE
. - Removed
craft\controllers\BaseUpdaterController::actionComposerOptimize()
. - Removed
craft\controllers\Drafts
. - Removed
craft\controllers\ElementIndexesController::$paginated
. - Removed
craft\controllers\EntriesController::EVENT_PREVIEW_ENTRY
. - Removed
craft\controllers\UtilitiesController::actionAssetIndexPerformAction()
. - Removed
craft\db\Connection::trimObjectName()
. - Removed
craft\db\Table::ASSETTRANSFORMINDEX
. - Removed
craft\db\Table::ASSETTRANSFORMS
. - Removed
craft\elements\actions\SetStatus::$allowDisabledForSite
. - Removed
craft\elements\actions\SetStatus::DISABLED_FOR_SITE
. - Removed
craft\elements\actions\SetStatus::DISABLED_GLOBALLY
. - Removed
craft\elements\Asset::getSupportsPreview()
. - Removed
craft\elements\Asset::getTransformSource()
. - Removed
craft\elements\Asset::setTransformSource()
. - Removed
craft\elements\db\ElementQuery::getIterator()
. - Removed
craft\elements\db\ElementQuery::offsetExists()
. - Removed
craft\elements\db\ElementQuery::offsetGet()
. - Removed
craft\elements\db\ElementQuery::offsetSet()
. - Removed
craft\elements\db\ElementQuery::offsetUnset()
. - Removed
craft\elements\User::mergePreferences()
. - Removed
craft\errors\AssetTransformException
. - Removed
craft\errors\FieldNotFoundException
. - Removed
craft\errors\InvalidVolumeException
. - Removed
craft\errors\MissingVolumeFolderException
. - Removed
craft\errors\VolumeException
. - Removed
craft\errors\VolumeObjectExistsException
. - Removed
craft\errors\VolumeObjectNotFoundException
. - Removed
craft\events\AssetTransformEvent
. - Removed
craft\events\AssetTransformImageEvent
. - Removed
craft\events\DefineComponentsEvent
. - Removed
craft\events\GenerateTransformEvent::$image
. - Removed
craft\events\GenerateTransformEvent::$tempPath
. - Removed
craft\events\GetAssetThumbEvent
. - Removed
craft\events\GetAssetThumbUrlEvent::$generate
. - Removed
craft\events\GetAssetThumbUrlEvent::$size
. - Removed
craft\events\GlobalSetContentEvent
. - Removed
craft\events\RegisterGqlPermissionsEvent
. - Removed
craft\events\SearchEvent::getElementIds()
. - Removed
craft\events\SearchEvent::setElementIds()
. - Removed
craft\feeds\Feeds
. - Removed
craft\feeds\GuzzleClient
. - Removed
craft\fields\BaseOptionsField::optionLabel()
. - Removed
craft\fields\Url::$placeholder
. - Removed
craft\gql\base\Resolver::extractEagerLoadCondition()
. - Removed
craft\gql\base\Resolver::getArrayableArguments()
. - Removed
craft\gql\base\Resolver::prepareArguments()
. - Removed
craft\helpers\App::dbMutexConfig()
. - Removed
craft\helpers\App::getDefaultLogTargets()
. - Removed
craft\helpers\App::logConfig()
. - Removed
craft\helpers\Cp::editElementTitles()
. - Removed
craft\helpers\Localization::localeData()
. - Removed
craft\helpers\Stringy
. - Removed
craft\i18n\Locale::setDateTimeFormats()
. - Removed
craft\log\FileTarget
. - Removed
craft\log\StreamLogTarget
. - Removed
craft\models\AssetTransform
. - Removed
craft\models\AssetTransformIndex
. - Removed
craft\models\BaseEntryRevisionModel
. - Removed
craft\models\EntryDraft
. - Removed
craft\models\EntryVersion
. - Removed
craft\models\FieldLayout::setFields()
. - Removed
craft\models\Site::$originalBaseUrl
. - Removed
craft\models\Site::$originalName
. - Removed
craft\models\Site::overrideBaseUrl()
. - Removed
craft\models\Site::overrideName()
. - Removed
craft\models\VolumeListing
. - Removed
craft\mutex\DbMutexTrait
. - Removed
craft\mutex\FileMutex
. - Removed
craft\mutex\MysqlMutex
. - Removed
craft\mutex\PgsqlMutex
. - Removed
craft\mutex\PrefixedMutexTrait
. - Removed
craft\queue\jobs\DeleteStaleTemplateCaches
. - Removed
craft\records\AssetTransform
. - Removed
craft\records\MatrixBlockType::$validateUniques
. - Removed
craft\services\AssetIndexer::deleteStaleIndexingData()
. - Removed
craft\services\AssetIndexer::extractFolderItemsFromIndexList()
. - Removed
craft\services\AssetIndexer::extractSkippedItemsFromIndexList()
. - Removed
craft\services\AssetIndexer::getIndexingSessionId()
. - Removed
craft\services\AssetIndexer::getMissingFiles()
. - Removed
craft\services\AssetIndexer::prepareIndexList()
. - Removed
craft\services\AssetIndexer::processIndexForVolume()
. - Removed
craft\services\Assets::$generatePendingTransformsViaQueue
. - Removed
craft\services\Assets::EVENT_GET_ASSET_THUMB_URL
. - Removed
craft\services\Assets::EVENT_GET_THUMB_PATH
. - Removed
craft\services\Assets::getThumbPath()
. - Removed
craft\services\AssetTransforms
. - Removed
craft\services\Composer::$disablePackagist
. - Removed
craft\services\Composer::optimize()
. - Removed
craft\services\Content::getContentRow()
. - Removed
craft\services\Content::populateElementContent()
. - Removed
craft\services\Drafts::EVENT_AFTER_MERGE_SOURCE_CHANGES
. - Removed
craft\services\Drafts::EVENT_AFTER_PUBLISH_DRAFT
. - Removed
craft\services\Drafts::EVENT_BEFORE_MERGE_SOURCE_CHANGES
. - Removed
craft\services\Drafts::EVENT_BEFORE_PUBLISH_DRAFT
. - Removed
craft\services\Drafts::publishDraft()
. - Removed
craft\services\EntryRevisions
. - Removed
craft\services\Fields::assembleLayout()
. - Removed
craft\services\Fields::getFieldIdsByLayoutId()
. - Removed
craft\services\Fields::getFieldsByElementType()
. - Removed
craft\services\Fields::getFieldsByLayoutId()
. - Removed
craft\services\Gql::getAllPermissions()
. - Removed
craft\services\Path::getAssetThumbsPath()
. - Removed
craft\services\ProjectConfig::CONFIG_ALL_KEY
. - Removed
craft\services\ProjectConfig::CONFIG_ALL_KEY
. - Removed
craft\services\ProjectConfig::CONFIG_KEY
. - Removed
craft\services\Sections::isSectionTemplateValid()
. - Removed
craft\services\SystemSettings
. - Removed
craft\services\TemplateCaches::deleteCacheById()
. - Removed
craft\services\TemplateCaches::deleteCachesByKey()
. - Removed
craft\services\TemplateCaches::deleteExpiredCaches()
. - Removed
craft\services\TemplateCaches::deleteExpiredCachesIfOverdue()
. - Removed
craft\services\TemplateCaches::EVENT_AFTER_DELETE_CACHES
. - Removed
craft\services\TemplateCaches::EVENT_BEFORE_DELETE_CACHES
. - Removed
craft\services\TemplateCaches::handleResponse()
. - Removed
craft\services\TemplateCaches::handleResponse()
. - Removed
craft\services\TemplateCaches::includeElementInTemplateCaches()
. - Removed
craft\services\TemplateCaches::includeElementQueryInTemplateCaches()
. - Removed
craft\services\Volumes::createVolume()
. - Removed
craft\services\Volumes::EVENT_REGISTER_VOLUME_TYPES
. - Removed
craft\services\Volumes::getAllVolumeTypes()
. - Removed
craft\services\Volumes::getVolumeOverrides()
. - Removed
craft\volumes\Local
. - Removed
craft\volumes\MissingVolume
. - Removed
craft\volumes\Temp
. - Removed
craft\web\AssetBundle::useCompressedJs()
. - Removed
craft\web\AssetManager::getPublishedPath()
. - Removed
craft\web\Request::getIsSingleActionRequest()
. - Removed
craft\web\twig\Template
. - Removed
craft\web\twig\variables\CategoryGroups
. - Removed
craft\web\twig\variables\Config
. - Removed
craft\web\twig\variables\Deprecator
. - Removed
craft\web\twig\variables\ElementIndexes
. - Removed
craft\web\twig\variables\EmailMessages
. - Removed
craft\web\twig\variables\Feeds
. - Removed
craft\web\twig\variables\Fields
. - Removed
craft\web\twig\variables\Globals
. - Removed
craft\web\twig\variables\I18N
. - Removed
craft\web\twig\variables\Request
. - Removed
craft\web\twig\variables\Sections
. - Removed
craft\web\twig\variables\SystemSettings
. - Removed
craft\web\twig\variables\UserGroups
. - Removed
craft\web\twig\variables\UserPermissions
. - Removed
craft\web\twig\variables\UserSession
. - Removed
craft\web\User::destroyDebugPreferencesInSession()
. - Removed
craft\web\User::saveDebugPreferencesToSession()
. - Removed
craft\web\View::$minifyCss
. - Removed
craft\web\View::$minifyJs
. - Removed
craft\web\View::registerHiResCss()
. - Removed
craft\web\View::renderTemplateMacro()
. - Removed the
_layouts/element
control panel template. - Removed the
assets/_edit
control panel template. - Removed the
categories/_edit
control panel template. - Removed the
entries/_edit
control panel template. - Removed the
cp.assets.edit.content
control panel template hook. - Removed the
cp.assets.edit.details
control panel template hook. - Removed the
cp.assets.edit.meta
control panel template hook. - Removed the
cp.assets.edit.settings
control panel template hook. - Removed the
cp.assets.edit
control panel template hook. - Removed the
cp.categories.edit.content
control panel template hook. - Removed the
cp.categories.edit.details
control panel template hook. - Removed the
cp.categories.edit.meta
control panel template hook. - Removed the
cp.categories.edit.settings
control panel template hook. - Removed the
cp.categories.edit
control panel template hook. - Removed the
cp.elements.edit
control panel template hook. - Removed the
cp.entries.edit.content
control panel template hook. - Removed the
cp.entries.edit.details
control panel template hook. - Removed the
cp.entries.edit.meta
control panel template hook. - Removed the
cp.entries.edit.settings
control panel template hook. - Removed the
cp.entries.edit
control panel template hook. - Removed the
Craft.AssetEditor
JavaScript class. - Removed the
Craft.BaseElementEditor
JavaScript class. - Removed the
Craft.DraftEditor
JavaScript class. - Removed the
Craft.queueActionRequest()
JavaScript method.Craft.queue.push()
can be used instead. - Removed the Flysystem package. The
craftcms/flysystem-adapter
package now provides a base Flysystem adapter class. - Removed the laminas-feed package.
- Removed the yii2-swiftmailer package.
- Fixed a bug where pending project config changes in the YAML would get applied when other project config changes were made. (#9660)
- Fixed a bug where revisions weren’t getting propagated when a section was enabled for new sites, or its Propagation Method was changed. (#10634)
- Generated control panel URLs now begin with the
@web
alias value if thebaseCpUrl
config setting isn’t defined. - HTML entities output within email body text are now escaped by default in HTML email bodies.