NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #3801 most downloaded on Packagist
Craft CMS
Last release today
07 Oct 2026
Ships on a steady schedule
a new release about every 2 weeks
Most releases are documented
notes for 41 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
1343 releases · first in 2013
Fixed a bug where disclosure menus weren’t releasing their scroll and resize event listeners on hide. (#14911, #14510)
scroll and resize event listeners on hide. (#14911, #14510)app/resource-js requests weren’t working for guest requests. (#14908)One column per quarter.
Sort options are now sorted alphabetically within element indexes, and custom fields’ options are now listed in a “Fields” group.
asyncCsrfInputs config setting. (#14625)backupCommandFormat config setting. (#14897)backupCommand config setting can now be set to a closure, which will be passed a mikehaertl\shellcommand\Command object. (#14897)safeMode config setting. (#14734)resave commands now support an --if-invalid option. (#14731)craft\conditions\ConditionInterface::getBuilderConfig().craft\controllers\EditUserTrait. (#14789)craft\controllers\UsersController::EVENT_DEFINE_EDIT_SCREENS. (#14789)craft\elements\conditions\ElementConditionInterface::setFieldLayouts().craft\events\DefineEditUserScreensEvent. (#14789)craft\helpers\Cp::parseTimestampParam().craft\models\FieldLayoutTab::labelHtml().craft\services\ProjectConfig::getAppliedChanges(). (#14851)craft\web\Request::getBearerToken(). (#14784)craft\db\CoalesceColumnsExpression.craft\db\ExpressionBuilder.craft\db\ExpressionInterface.craft\base\NameTrait::prepareNamesForSave() no longer updates the name properties if fullName, firstName, and lastName are already set. (#14665)craft\helpers\Typecast::properties() now typecasts numeric strings to integers, for int|string properties. (#14618)Craft.MatrixInput.Entry. (#14730)Fixed a bug where element caches weren’t getting invalidated when an element was moved within a structure.
Fixed a bug where the Database Backup utility was present when the backupCommand config setting was set to false.
backupCommand config setting was set to false.db/convert-charset command, if any tables contained char or varchar foreign key columns. (#14815)craft\helpers\UrlHelper::isAbsoluteUrl() was returning false for URLs with schemes other than http or https, such as mailto and tel. (#14830)...) wasn’t working with attribute accessors. (#14827)Fixed a bug where element queries with the relatedTo param set to a list of element IDs were overly complex.
relatedTo param set to a list of element IDs were overly complex....) wasn’t working when the preloadSingles config setting was enabled. (#14783)Fixed a bug where LTR and RTL characters weren’t getting stripped from sanitized asset filenames.
utils/fix-field-layout-uids command wasn’t looking at field layouts defined with a fieldLayout key in the project config.Fixed a bug where craft\helpers\ElementHelper::siteStatusesForElement() wasn’t working for soft-deleted elements.
craft\helpers\ElementHelper::siteStatusesForElement() wasn’t working for soft-deleted elements. (#14753)Fixed a “Double-instantiating a checkbox select on an element” JavaScript warning.
craft\cache\DbCache was attempting to store values beyond the cache.data column’s storage capacity.collation database connection setting was set to utf8_* on MySQL. (#14332)_includes/nav.twig template wasn’t marking nested nav items as selected. (#14735)craft\i18n\I18N::getPrimarySiteLocale() is now deprecated. craft\models\Site::getLocale() should be used instead.
elevatedSessionDuration config setting.localeAliases config setting. (#12705)partialTemplatesPath config setting. (#14284)tempAssetUploadFs config setting. (#13957)utils/prune-orphaned-entries command. (#14154)entrify/* commands now ask if an entry type already exists for the section.resave/entries command now accepts a --field option.up, migrate/up, and migrate/all commands no longer overwrite pending project config YAML changes, if new project config changes were made by migrations.--force option from the up command. --isolated=0 should be used instead. (#14270)resave/matrix-blocks command.myEntryType:myField).eagerly param, which can be used to lazily eager-load the resulting elements for all peer elements, when all(), collect(), one(), nth(), or count() is called.inBulkOp param, which limits the results to elements which were involved in a bulk operation. (#14032)addressLine1, addressLine2, addressLine3, administrativeArea, countryCode, dependentLocality, firstName, fullName, lastName, locality, organizationTaxId, organization, postalCode, and sortingCode params.field, fieldId, primaryOwner, primaryOwnerId, owner, ownerId, allowOwnerDrafts, and allowOwnerRevisions params.authorId params now support passing multiple IDs prefixed with and, to fetch entries with multiple listed authors.authorOf param.field and fieldId params.field and fieldId params.fieldId, fieldHandle, ownerId, and sortOrder entry GraphQL fields. (#14366)<entryTypeHandle>_Entry, and are no longer prefixed with their section’s handle. (That goes for Matrix-nested entries as well.)author and authorIds GraphQL field.entries field rather than blocks.entryType() and fieldValueSql() Twig functions. (#14557)|firstWhere and |flatten Twig filters.craft.matrixBlocks() Twig function. craft.entries() should be used instead.POST request will now respond with a 405 error code if another request method is used. (#13397)elements_sites.content column as JSON, rather than across multiple columns in a content table. (#2009, #4308, #7221, #7750, #12954)fieldLayouts() and defineFieldLayouts() methods’ $source arguments must now accept null values.myEntryType:myField), by implementing craft\base\FieldLayoutProviderInterface on the field layout provider class, and ensuring that defineFieldLayouts() is returning field layouts via their providers.static instead of self. (#11868)new. The _includes/forms/selectize.twig control panel template should be used instead (or craft\helpers\Cp::selectizeHtml()/selectizeFieldHtml()), which will append an styled “Add” option when addOptionFn and addOptionLabel settings are passed. (#11946)chip(), customSelect(), disclosureMenu(), elementCard(), elementChip(), elementIndex(), iconSvg(), and siteMenuItems() global functions for control panel templates.colorSelect, colorSelectField, customSelect, customSelectField, languageMenu, and languageMenuField form macros.assets/move-asset and assets/move-folder actions no longer include success keys in responses. (#12159)assets/upload controller action now includes errors object in failure responses. (#12159)validateSelection() and activate() methods are now passed an elementIndex argument, with a reference to the trigger’s corresponding element index.craft\events\SearchEvent::$scores by craft\services\Search::EVENT_AFTER_SEARCH or EVENT_BEFORE_SCORE_RESULTS now must be indexed by element ID and site ID (e.g. '100-1').craft\auth\methods\AuthMethodInterface.craft\auth\methods\BaseAuthMethod.craft\auth\methods\RecoveryCodes.craft\auth\methods\TOTP.craft\auth\passkeys\CredentialRepository.craft\base\Actionable. (#14169)craft\base\ApplicationTrait::$edition.craft\base\ApplicationTrait::getAuth().craft\base\Chippable. (#14169)craft\base\Colorable. (#14187)craft\base\CpEditable.craft\base\Element::EVENT_DEFINE_ACTION_MENU_ITEMS.craft\base\Element::EVENT_DEFINE_INLINE_ATTRIBUTE_INPUT_HTML.craft\base\Element::crumbs().craft\base\Element::destructiveActionMenuItems().craft\base\Element::inlineAttributeInputHtml().craft\base\Element::render(). (#14284)craft\base\Element::safeActionMenuItems().craft\base\Element::shouldValidateTitle().craft\base\ElementContainerFieldInterface, which should be implemented by fields which contain nested elements, such as Matrix.craft\base\ElementInterface::canDuplicateAsDraft().craft\base\ElementInterface::getActionMenuItems().craft\base\ElementInterface::getCardBodyHtml().craft\base\ElementInterface::getChipLabelHtml().craft\base\ElementInterface::getCrumbs().craft\base\ElementInterface::getInlineAttributeInputHtml().craft\base\ElementInterface::hasDrafts().craft\base\ElementInterface::hasThumbs().craft\base\ElementInterface::setAttributesFromRequest().craft\base\ElementInterface::setAttributesFromRequest().craft\base\ElementInterface::setLazyEagerLoadedElements().craft\base\ElementTrait::$deletedWithOwner.craft\base\ElementTrait::$eagerLoadInfo.craft\base\ElementTrait::$elementQueryResult.craft\base\ElementTrait::$forceSave.craft\base\ElementTrait::$propagatingFrom.craft\base\Field::valueSql().craft\base\FieldInterface::dbType(), which defines the type(s) of values the field will store in the elements_sites.content column (if any).craft\base\FieldInterface::getValueSql().craft\base\FieldInterface::icon().craft\base\FieldInterface::isMultiInstance().craft\base\FieldInterface::queryCondition(), which accepts an element query param value and returns the corresponding query condition.craft\base\FieldLayoutComponent::hasSettings().craft\base\FieldLayoutElement::isMultiInstance().craft\base\FieldLayoutProviderInterface::getHandle().craft\base\FieldTrait::$layoutElement.craft\base\Iconic. (#14169)craft\base\Identifiable. (#14169)craft\base\InlineEditableFieldInterface.craft\base\NestedElementInterface, which should be implemented by element types which could be nested by other elements.craft\base\NestedElementTrait.craft\base\Statusable. (#14169)craft\base\ThumbableFieldInterface.craft\base\Thumbable. (#14169)craft\base\conditions\ConditionInterface::createConditionRule().craft\behaviors\EventBehavior.craft\controllers\EntryTypesController.craft\db\CallbackExpressionBuilder.craft\db\CallbackExpression.craft\db\Connection::getIsMaria().craft\db\QueryParam.craft\db\Table::ELEMENTS_OWNERS.craft\db\Table::SECTIONS_ENTRYTYPES.craft\db\mysql\ColumnSchema::$collation.craft\db\mysql\QueryBuilder::jsonContains().craft\db\mysql\QueryBuilder::jsonExtract().craft\db\mysql\Schema::supportsMb4().craft\db\pgsql\QueryBuilder::jsonContains().craft\db\pgsql\QueryBuilder::jsonExtract().craft\db\pgsql\Schema::supportsMb4().craft\elements\Address::GQL_TYPE_NAME.craft\elements\Asset::gqlTypeName().craft\elements\Category::gqlTypeName().craft\elements\ElementCollection::render(). (#14284)craft\elements\Entry::$collapsed.craft\elements\Entry::$dirty.craft\elements\Entry::gqlTypeName().craft\elements\Entry::setOwner().craft\elements\NestedElementManager.craft\elements\Tag::gqlTypeName().craft\elements\User::GQL_TYPE_NAME.craft\elements\User::authenticateWithPasskey().craft\elements\User::canRegisterUsers().craft\elements\conditions\ElementConditionInterface::getFieldLayouts().craft\elements\conditions\addresses\AddressLine1ConditionRule.craft\elements\conditions\addresses\AddressLine2ConditionRule.craft\elements\conditions\addresses\AddressLine3ConditionRule.craft\elements\conditions\addresses\AdministrativeAreaConditionRule.craft\elements\conditions\addresses\CountryConditionRule.craft\elements\conditions\addresses\DependentLocalityConditionRule.craft\elements\conditions\addresses\FullNameConditionRule.craft\elements\conditions\addresses\LocalityConditionRule.craft\elements\conditions\addresses\OrganizationConditionRule.craft\elements\conditions\addresses\OrganizationTaxIdConditionRule.craft\elements\conditions\addresses\PostalCodeConditionRule.craft\elements\conditions\addresses\SortingCodeConditionRule.craft\elements\conditions\entries\MatrixFieldConditionRule.craft\elements\db\EagerLoadInfo.craft\elements\db\EagerLoadPlan::$lazy.craft\elements\db\ElementQuery::$eagerLoadAlias.craft\elements\db\ElementQuery::$eagerLoadHandle.craft\elements\db\ElementQueryInterface::eagerly().craft\elements\db\ElementQueryInterface::fieldLayouts().craft\elements\db\ElementQueryInterface::prepForEagerLoading().craft\elements\db\ElementQueryInterface::wasCountEagerLoaded().craft\elements\db\ElementQueryInterface::wasEagerLoaded().craft\enums\AttributeStatus.craft\enums\CmsEdition.craft\enums\Color. (#14187)craft\enums\ElementIndexViewMode.craft\enums\PropagationMethod.craft\enums\TimePeriod.craft\events\BulkElementsEvent.craft\events\BulkOpEvent. (#14032)craft\events\DefineEntryTypesForFieldEvent.craft\events\DefineFieldHtmlEvent::$inline.craft\events\DuplicateNestedElementsEvent.craft\events\SetEagerLoadedElementsEvent::$plan.craft\fieldlayoutelements\BaseField::$includeInCards.craft\fieldlayoutelements\BaseField::$providesThumbs.craft\fieldlayoutelements\BaseField::previewHtml().craft\fieldlayoutelements\BaseField::previewable().craft\fieldlayoutelements\BaseField::selectorIcon().craft\fieldlayoutelements\BaseField::thumbHtml().craft\fieldlayoutelements\BaseField::thumbable().craft\fieldlayoutelements\CustomField::$handle.craft\fieldlayoutelements\CustomField::getOriginalHandle().craft\fieldlayoutelements\TextField::inputAttributes().craft\fieldlayoutelements\users\EmailField.craft\fieldlayoutelements\users\FullNameField.craft\fieldlayoutelements\users\PhotoField.craft\fieldlayoutelements\users\UsernameField.craft\fields\Addresses.craft\fields\Matrix::EVENT_DEFINE_ENTRY_TYPES.craft\fields\Matrix::getEntryTypes().craft\fields\Matrix::getEntryTypesForField().craft\fields\Matrix::getSupportedSitesForElement().craft\fields\Matrix::setEntryTypes().craft\fields\Matrix::supportedSiteIds().craft\fields\Money::currencyLabel().craft\fields\Money::currencyLabel().craft\fields\Money::subunits().craft\fields\Money::subunits().craft\fields\conditions\FieldConditionRuleTrait::fieldInstances().craft\fields\conditions\FieldConditionRuleTrait::setLayoutElementUid().craft\fields\conditions\MoneyFieldConditionRule.craft\fields\conditions\MoneyFieldConditionRule.craft\helpers\App::isWindows().craft\helpers\App::silence().craft\helpers\ArrayHelper::lastValue().craft\helpers\Cp::CHIP_SIZE_LARGE.craft\helpers\Cp::CHIP_SIZE_SMALL.craft\helpers\Cp::checkboxGroupFieldHtml().craft\helpers\Cp::checkboxGroupHtml().craft\helpers\Cp::chipHtml().craft\helpers\Cp::colorSelectFieldHtml().craft\helpers\Cp::customSelectFieldHtml(). (#14169)craft\helpers\Cp::customSelectHtml(). (#14169)craft\helpers\Cp::disclosureMenu().craft\helpers\Cp::earthIcon(). (#14169)craft\helpers\Cp::elementCardHtml().craft\helpers\Cp::elementChipHtml().craft\helpers\Cp::elementIndexHtml().craft\helpers\Cp::entryTypeSelectFieldHtml(). (#14169)craft\helpers\Cp::entryTypeSelectHtml(). (#14169)craft\helpers\Cp::fallbackIconSvg(). (#14169)craft\helpers\Cp::iconPickerFieldHtml(). (#14169)craft\helpers\Cp::iconPickerHtml(). (#14169)craft\helpers\Cp::iconSvg(). (#14169)craft\helpers\Cp::layoutElementSelectorHtml().craft\helpers\Cp::menuItem(). (#14169)craft\helpers\Cp::moneyFieldHtml().craft\helpers\Cp::moneyInputHtml().craft\helpers\Cp::normalizeMenuItems().craft\helpers\Cp::siteMenuItems().craft\helpers\Db::defaultCollation().craft\helpers\Db::prepareForJsonColumn().craft\helpers\ElementHelper::actionConfig().craft\helpers\ElementHelper::addElementEditorUrlParams().craft\helpers\ElementHelper::elementEditorUrl().craft\helpers\ElementHelper::renderElements(). (#14284)craft\helpers\ElementHelper::rootElementIfCanonical().craft\helpers\Gql::getSchemaContainedSections().craft\helpers\Json::detectIndent().craft\helpers\Json::encodeToFile().craft\helpers\ProjectConfig::ensureAllEntryTypesProcessed().craft\i18n\Locale::$aliasOf.craft\i18n\Locale::setDisplayName().craft\log\Dispatcher::getDefaultTarget(). (#14283)craft\migrations\BaseContentRefactorMigration.craft\models\EntryType::$color.craft\models\EntryType::findUsages().craft\models\FieldLayout::getCardBodyFields().craft\models\FieldLayout::getElementByUid().craft\models\FieldLayout::getFieldById().craft\models\FieldLayout::getFieldByUid().craft\models\FieldLayout::getThumbField().craft\models\FsListing::getAdjustedUri().craft\models\Section::getCpEditUrl().craft\models\Site::getLanguage().craft\models\Site::setLanguage().craft\models\Volume::$altTranslationKeyFormat.craft\models\Volume::$altTranslationMethod.craft\models\Volume::getSubpath().craft\models\Volume::setSubpath().craft\queue\BaseBatchedElementJob. (#14032)craft\queue\BaseBatchedJob::after().craft\queue\BaseBatchedJob::afterBatch().craft\queue\BaseBatchedJob::before().craft\queue\BaseBatchedJob::beforeBatch().craft\services\Auth.craft\services\Elements::EVENT_AUTHORIZE_DUPLICATE_AS_DRAFT.craft\services\Elements::canDuplicateAsDraft().craft\services\Entries::deleteEntryType().craft\services\Entries::deleteEntryTypeById().craft\services\Entries::deleteSection().craft\services\Entries::deleteSectionById().craft\services\Entries::getAllEntryTypes().craft\services\Entries::getAllSectionIds().craft\services\Entries::getAllSections().craft\services\Entries::getEditableSectionIds().craft\services\Entries::getEditableSections().craft\services\Entries::getEntryTypeByHandle().craft\services\Entries::getEntryTypeById().craft\services\Entries::getEntryTypesBySectionId().craft\services\Entries::getSectionByHandle().craft\services\Entries::getSectionById().craft\services\Entries::getSectionByUid().craft\services\Entries::getSectionsByType().craft\services\Entries::getTotalEditableSections().craft\services\Entries::getTotalSections().craft\services\Entries::refreshEntryTypes().craft\services\Entries::saveSection().craft\services\Fields::$fieldContext, which replaces craft\services\Content::$fieldContext.craft\services\Fields::EVENT_REGISTER_NESTED_ENTRY_FIELD_TYPES.craft\services\Fields::findFieldUsages().craft\services\Fields::getAllLayouts().craft\services\Fields::getNestedEntryFieldTypes().craft\services\Gql::defineContentArgumentsForFieldLayouts().craft\services\Gql::defineContentArgumentsForFields().craft\services\Gql::getOrSetContentArguments().craft\services\ProjectConfig::find().craft\services\ProjectConfig::flush().craft\services\ProjectConfig::writeYamlFiles().craft\services\Sites::$maxSites. (#14307)craft\services\Sites::getRemainingSites(). (#14307)craft\servics\Users::canCreateUsers().craft\web\Controller::asCpModal().craft\web\CpModalResponseBehavior.craft\web\CpModalResponseFormatter.craft\web\CpScreenResponseBehavior::$actionMenuItems.craft\web\CpScreenResponseBehavior::$contextMenuItems.craft\web\CpScreenResponseBehavior::$selectableSites.craft\web\CpScreenResponseBehavior::$site.craft\web\CpScreenResponseBehavior::actionMenuItems().craft\web\CpScreenResponseBehavior::contextMenuItems().craft\web\CpScreenResponseBehavior::selectableSites().craft\web\CpScreenResponseBehavior::site().craft\web\Request::getQueryParamsWithoutPath().craft\web\twig\variables\Cp::getEntryTypeOptions().craft\base\PluginTrait::$minCmsEdition.craft\base\BlockElementInterface to NestedElementInterface, and added the getField(), getSortOrder(), and setOwner() methods to it.craft\base\Element::EVENT_SET_TABLE_ATTRIBUTE_HTML to EVENT_DEFINE_ATTRIBUTE_HTML.craft\base\Element::getHasCheckeredThumb() to hasCheckeredThumb() and made it protected.craft\base\Element::getHasRoundedThumb() to hasRoundedThumb() and made it protected.craft\base\Element::getThumbAlt() to thumbAlt() and made it protected.craft\base\Element::getThumbUrl() to thumbUrl() and made it protected.craft\base\Element::tableAttributeHtml() to attributeHtml().craft\base\ElementInterface::getTableAttributeHtml() to getAttributeHtml().craft\base\FieldInterface::valueType() to phpType().craft\base\PreviewableFieldInterface::getTableAttributeHtml() to getPreviewHtml().craft\base\UtilityInterface::iconPath() to icon(), which can now return a system icon name. (#14169)craft\base\conditions\BaseCondition::EVENT_REGISTER_CONDITION_RULE_TYPES to EVENT_REGISTER_CONDITION_RULES.craft\base\conditions\BaseCondition::conditionRuleTypes() to selectableConditionRules().craft\events\BatchElementActionEvent to MultiElementActionEvent.craft\events\RegisterConditionRuleTypesEvent to RegisterConditionRulesEvent, and its $conditionRuleTypes property has been renamed to $conditionRules.craft\events\SetElementTableAttributeHtmlEvent to DefineAttributeHtmlEvent.craft\fields\BaseRelationField::tableAttributeHtml() to previewHtml(), and it now accepts an ElementCollection argument, rather than Collection.craft\fields\Matrix::$maxBlocks to $maxEntries.craft\fields\Matrix::$minBlocks to $minEntries.craft\helpers\MailerHelper\EVENT_REGISTER_MAILER_TRANSPORT_TYPES to EVENT_REGISTER_MAILER_TRANSPORTS.craft\log\Dispatcher::getTargets() to getDefaultTargets(). (#14283)craft\services\Addresses::getLayout() to getFieldLayout().craft\services\Addresses::saveLayout() to saveFieldLayout().craft\services\Utilities::EVENT_REGISTER_UTILITY_TYPES to EVENT_REGISTER_UTILITIES.craft\web\CpScreenResponseBehavior::$additionalButtons() and additionalButtons() to $additionalButtonsHtml and additionalButtonsHtml(). (#13037)craft\web\CpScreenResponseBehavior::$content() and content() to $contentHtml and contentHtml(). (#13037)craft\web\CpScreenResponseBehavior::$contextMenu() and contextMenu() to $contextMenuHtml and contextMenuHtml(). (#13037)craft\web\CpScreenResponseBehavior::$notice() and notice() to $noticeHtml and noticeHtml(). (#13037)craft\web\CpScreenResponseBehavior::$pageSidebar() and pageSidebar() to $pageSidebarHtml and pageSidebarHtml(). (#13037)craft\web\CpScreenResponseBehavior::$sidebar() and sidebar() to $metaSidebarHtml and metaSidebarHtml(). (#13037)craft\base\ApplicationTrait::getLicensedEdition() now returns a craft\enums\CmsEdition case or null.craft\base\ApplicationTrait::requireEdition() now accepts a craft\enums\CmsEdition case or an integer.craft\base\ApplicationTrait::setEdition() now accepts a craft\enums\CmsEdition case or an integer.craft\base\BaseFsInterface::renameFile() and copyFile() now have a $config argument. (#14147)craft\base\ConfigurableComponent::getSettings() now converts backed enum cases to their values.craft\base\Element::getCpEditUrl() now returns a URL to edit/<ID> if cpEditUrl() returns null.craft\base\ElementInterface::findSource() no longer needs to specify a default value for the context argument.craft\base\ElementInterface::getAncestors(), getDescendants(), getChildren(), and getSiblings() now have ElementQueryInterface|ElementCollection return types, rather than ElementQueryInterface|Collection.craft\base\ElementInterface::getEagerLoadedElementCount() can now return null for counts that haven’t been eager-loaded yet.craft\base\ElementInterface::getEagerLoadedElements now has an ElementCollection|null return type, rather than Collection|null.craft\base\ElementInterface::indexHtml()’ $showCheckboxes argument is now $selectable, and it now has a $sortable argument.craft\base\ElementInterface::modifyCustomSource() can now set disabled to true on the source config to hide it.craft\base\ElementInterface::setEagerLoadedElements() now has a $plan argument, which will be set to the eager-loading plan.craft\base\ElementInterface::setParent() no longer needs to specify a default value for the parent argument.craft\base\ElementInterface::setRevisionCreatorId() no longer needs to specify a default value for the creatorId argument.craft\base\ElementInterface::setRevisionNotes() no longer needs to specify a default value for the notes argument.craft\base\Field::inputHtml() now has an $inline argument.craft\base\FieldInterface::getIsTranslatable(), getTranslationDescription(), getInputHtml(), normalizeValue(), normalizeValueFromRequest(), and serializeValue() no longer need to specify a default value for the $element argument.craft\base\WidgetInterface::icon() can now return a system icon name. (#14169)craft\behaviors\SessionBehavior::setSuccess() and getSuccess() use the success flash key now, rather than notice. (#14345)craft\db\Connection::getSupportsMb4() is now dynamic for MySQL installs, based on whether the elements_sites table has an mb4 charset.craft\elemens\db\ElementQueryInterface::collect() now has an ElementCollection return type, rather than Collection.craft\elements\Entry::getSection() can now return null, for nested entries.craft\elements\User::getAddresses() now returns a collection.craft\elements\db\ElementQuery::__toString() now returns the class name. (#14498)craft\enums\LicenseKeyStatus is now an enum.craft\events\AuthenticateUserEvent::$password can now be null, if the user is being authenticated with a passkey.craft\fields\BaseOptionsField::$multi and $optgroups properties are now static.craft\fields\Matrix::$propagationMethod now has a type of craft\enums\PropagationMethod.craft\fields\fieldlayoutelements\BaseUiElement::selectorIcon() can now return a system icon name. (#14169)craft\gql\mutations\Entry::createSaveMutations() now accepts a $section argument.craft\helpers\App::parseEnv() now returns null when a missing environment variable name is passed to it. (#14253)craft\helpers\Assets::generateUrl() no longer has an $fs argument. (#14353)craft\helpers\Cp::fieldHtml() now supports a labelExtra config value.craft\helpers\Db::parseParam(), parseDateParam(), parseMoneyParam(), and parseNumericParam() now return null instead of an empty string if no condition should be applied.craft\helpers\Html::id() and Craft.formatInputId() now retain colons and periods, and ensure the string begins with a letter.craft\helpers\Html::normalizeTagAttributes() now supports a removeClass key.craft\helpers\Html::svg() now has a $throwException argument.craft\helpers\Html::tag() and beginTag() now ensure that the passed-in attributes are normalized.craft\helpers\StringHelper::toString() now supports backed enums.craft\i18n\I18N::getPrimarySiteLocale() is now deprecated. craft\models\Site::getLocale() should be used instead.craft\i18n\I18N::getPrimarySiteLocaleId() is now deprecated. craft\models\Site::$language should be used instead.craft\models\FieldLayout::getField() and isFieldIncluded() now now have a $filter argument rather than $attribute, and it can be set to a callable.craft\models\Section::$propagationMethod now has a type of craft\enums\PropagationMethod.craft\services\AssetIndexer::indexFileByListing() now has a $volume argument in place of $volumeId.craft\services\AssetIndexer::indexFolderByListing() now has a $volume argument in place of $volumeId.craft\services\AssetIndexer::storeIndexList() now has a $volume argument in place of $volumeId.craft\services\Elements::duplicateElement() now has an $asUnpublishedDraft argument, and no longer has a $trackDuplication argument.craft\services\Elements::saveElement() now has a $saveContent argument.craft\services\Plugins::getPluginLicenseKeyStatus() now returns a craft\enums\LicenseKeyStatus case.craft\services\ProjectConfig::saveModifiedConfigData() no longer has a $writeExternalConfig argument, and no longer writes out updated project config YAML files.craft\services\Users::activateUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::deactivateUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::removeCredentials() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::shunMessageForUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::suspendUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::unlockUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::unshunMessageForUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::unsuspendUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\services\Users::verifyEmailForUser() now has a void return type, and throws an InvalidElementException in case of failure.craft\web\Controller::asModelSuccess() now includes a modelClass key in the response data (and modelId if the model implements craft\base\Identifiable).statuses() methods can now be a craft\enums\Color instance.error key with the exception message. message should be used instead. (#14346)Craft::Pro. craft\enums\CmsEdition::Pro should be used instead.Craft::Solo. craft\enums\CmsEdition::Solo should be used instead.craft\base\ApplicationTrait::getEdition(). $edition should be used instead.craft\base\ApplicationTrait::getEditionHandle(). $edition should be used instead.craft\base\ApplicationTrait::getEditionName(). $edition should be used instead.craft\base\ApplicationTrait::getLicensedEditionName(). getLicensedEdition() should be used instead.craft\events\DefineElementInnerHtmlEvent.craft\events\SearchEvent::$siteId.craft\helpers\App::editionHandle(). craft\enums\CmsEdition::handle() should be used instead.craft\helpers\App::editionIdByHandle(). craft\enums\CmsEdition::fromHandle() should be used instead.craft\helpers\App::editionName(). craft\enums\CmsEdition::name should be used instead.craft\helpers\App::editions(). craft\enums\CmsEdition::cases() should be used instead.craft\helpers\App::isValidEdition(). craft\enums\CmsEdition::tryFrom() should be used instead.craft\helpers\Component::iconSvg(). craft\helpers\Cp::iconSvg() and fallbackIconSvg() should be used instead. (#14169)craft\helpers\Cp::ELEMENT_SIZE_LARGE. CHIP_SIZE_LARGE should be used instead.craft\helpers\Cp::ELEMENT_SIZE_SMALL. CHIP_SIZE_SMALL should be used instead.craft\helpers\Cp::elementHtml(). elementChipHtml() or elementCardHtml() should be used instead._elements/element.twig control panel template. elementChip() or elementCard() should be used instead.cp.elements.element control panel template hook._includes/revisionmenu.twig control panel template.\craft\mail\transportadapters\Gmail::$timeout.\craft\mail\transportadapters\Smtp::$encryptionMethod.\craft\mail\transportadapters\Smtp::$timeout.craft\base\ApplicationTrait::getMatrix().craft\base\Element::$contentId.craft\base\Element::ATTR_STATUS_MODIFIED. craft\enums\AttributeStatus::Modified should be used instead.craft\base\Element::ATTR_STATUS_OUTDATED. craft\enums\AttributeStatus::Outdated should be used instead.craft\base\ElementInterface::getContentTable().craft\base\ElementInterface::getFieldColumnPrefix().craft\base\ElementInterface::gqlMutationNameByContext().craft\base\ElementInterface::gqlTypeNameByContext().craft\base\ElementInterface::hasContent().craft\base\FieldInterface::getContentColumnType(). dbType() should be implemented instead.craft\base\FieldInterface::getGroup().craft\base\FieldInterface::hasContentColumn(). Fields that don’t need to store values in the elements_sites.content column should return null from dbType().craft\base\FieldInterface::modifyElementsQuery(). Fields can customize how their element query params are handled by implementing queryCondition().craft\base\FieldTrait::$groupId.craft\base\FieldTrait::$layoutId.craft\base\FieldTrait::$sortOrder.craft\base\FieldTrait::$tabId.craft\base\conditions\ConditionInterface::getConditionRuleTypes().craft\controllers\Sections::actionDeleteEntryType().craft\controllers\Sections::actionEditEntryType().craft\controllers\Sections::actionEntryTypesIndex().craft\controllers\Sections::actionReorderEntryTypes().craft\controllers\Sections::actionSaveEntryType().craft\controllers\UsersController::EVENT_REGISTER_USER_ACTIONS. craft\base\Element::EVENT_DEFINE_ACTION_MENU_ITEMS should be used instead.craft\db\Table::FIELDGROUPS.craft\elements\MatrixBlock.craft\elements\db\ElementQuery::$contentTable.craft\elements\db\MatrixBlockQuery.craft\enums\PatchManifestFileAction.craft\enums\PeriodType.craft\enums\PluginUpdateStatus.craft\enums\VersionUpdateStatus.craft\errors\MatrixBlockTypeNotFoundException.craft\events\BlockTypesEvent.craft\events\FieldGroupEvent.craft\events\RegisterUserActionsEvent.craft\fieldlayoutelements\users\AddressesField.craft\fields\Matrix::EVENT_SET_FIELD_BLOCK_TYPES.craft\fields\Matrix::PROPAGATION_METHOD_ALL. craft\enums\PropagationMethod::All should be used instead.craft\fields\Matrix::PROPAGATION_METHOD_CUSTOM. craft\enums\PropagationMethod::Custom should be used instead.craft\fields\Matrix::PROPAGATION_METHOD_LANGUAGE. craft\enums\PropagationMethod::Language should be used instead.craft\fields\Matrix::PROPAGATION_METHOD_NONE. craft\enums\PropagationMethod::None should be used instead.craft\fields\Matrix::PROPAGATION_METHOD_SITE_GROUP. craft\enums\PropagationMethod::SiteGroup should be used instead.craft\fields\Matrix::contentTable.craft\fields\Matrix::getBlockTypeFields().craft\fields\Matrix::getBlockTypes().craft\fields\Matrix::setBlockTypes().craft\gql\arguments\elements\MatrixBlock.craft\gql\interfaces\elements\MatrixBlock.craft\gql\resolvers\elements\MatrixBlock.craft\gql\types\elements\MatrixBlock.craft\gql\types\generators\MatrixBlockType.craft\helpers\Db::GLUE_AND, GLUE_OR, and GLUE_NOT. craft\db\QueryParam::AND, OR, and NOT can be used instead.craft\helpers\Db::extractGlue(). craft\db\QueryParam::extractOperator() can be used instead.craft\helpers\ElementHelper::fieldColumn().craft\helpers\ElementHelper::fieldColumnFromField().craft\helpers\FieldHelper.craft\helpers\Gql::canMutateEntries().craft\models\EntryType::$sectionId.craft\models\EntryType::$sortOrder.craft\models\EntryType::getSection().craft\models\FieldGroup.craft\models\MatrixBlockType.craft\models\Section::PROPAGATION_METHOD_ALL. craft\enums\PropagationMethod::All should be used instead.craft\models\Section::PROPAGATION_METHOD_CUSTOM. craft\enums\PropagationMethod::Custom should be used instead.craft\models\Section::PROPAGATION_METHOD_LANGUAGE. craft\enums\PropagationMethod::Language should be used instead.craft\models\Section::PROPAGATION_METHOD_NONE. craft\enums\PropagationMethod::None should be used instead.craft\models\Section::PROPAGATION_METHOD_SITE_GROUP. craft\enums\PropagationMethod::SiteGroup should be used instead.craft\records\EntryType::getSection().craft\records\Field::getGroup().craft\records\Field::getOldColumnSuffix().craft\records\FieldGroup.craft\records\FieldLayout::getFields().craft\records\FieldLayout::getTabs().craft\records\FieldLayoutField.craft\records\FieldLayoutTab.craft\records\MatrixBlockType.craft\records\MatrixBlock.craft\services\Content.craft\services\Elements::$duplicatedElementIds.craft\services\Elements::$duplicatedElementSourceIds.craft\services\Fields::EVENT_AFTER_DELETE_FIELD_GROUP.craft\services\Fields::EVENT_AFTER_SAVE_FIELD_GROUP.craft\services\Fields::EVENT_BEFORE_APPLY_GROUP_DELETE.craft\services\Fields::EVENT_BEFORE_DELETE_FIELD_GROUP.craft\services\Fields::EVENT_BEFORE_SAVE_FIELD_GROUP.craft\services\Fields::deleteGroup().craft\services\Fields::deleteGroupById().craft\services\Fields::getAllGroups().craft\services\Fields::getFieldIdsByLayoutIds().craft\services\Fields::getFieldsByGroupId().craft\services\Fields::getGroupById().craft\services\Fields::getGroupByUid().craft\services\Fields::getLayoutTabsById().craft\services\Fields::handleChangedGroup().craft\services\Fields::handleDeletedGroup().craft\services\Fields::saveGroup().craft\services\Fields::updateColumn().craft\services\Matrix.craft\services\Plugins::setPluginLicenseKeyStatus().craft\services\ProjectConfig::PATH_MATRIX_BLOCK_TYPES.craft\services\ProjectConfig::PATH_MATRIX_BLOCK_TYPES.craft\services\ProjectConfig::PATH_MATRIX_BLOCK_TYPES.craft\services\ProjectConfig::updateStoredConfigAfterRequest().craft\services\Sections. Most of its methods have been moved to craft\services\Entries.craft\web\CpScreenResponseBehavior::$contextMenuHtml. $contextMenuItems should be used instead.craft\web\CpScreenResponseBehavior::contextMenuHtml(). contextMenuItems() should be used instead.craft\web\CpScreenResponseBehavior::contextMenuTemplate(). contextMenuItems() should be used instead.craft\web\User::startElevatedSession(). login() should be used instead.craft\web\twig\variables\Cp::getEntryTypeOptions().bodyHtml and headHtml when running in API mode.Craft.BaseElementSelectInput::defineElementActions().Craft.CP::setSiteCrumbMenuItemStatus().Craft.CP::showSiteCrumbMenuItem().Craft.CP::updateContext().Craft.CpModal.Craft.ElementEditor::markDeltaNameAsModified().Craft.ElementEditor::setFormValue().Garnish.DisclosureMenu::addGroup().Garnish.DisclosureMenu::addHr().Garnish.DisclosureMenu::addItem().Garnish.DisclosureMenu::createItem().Garnish.DisclosureMenu::getFirstDestructiveGroup().Garnish.DisclosureMenu::isPadded().Craft.appendBodyHtml() and appendHeadHtml() are now promise-based, and load JavaScript resources over Ajax.bacon/bacon-qr-code.composer/semver directly.pragmarx/google2fa.pragmarx/recovery.web-auth/webauthn-lib.commerceguys/addressing to v2. (#14318)illuminate/collections to v10.yiisoft/yii2-symfonymailer to v4.composer/composer.utf8mb4 charset, and the utf8mb4_0900_ai_ci or utf8mb4_unicode_ci collation, on MySQL. Existing installs should run db/convert-charset after upgrading, to ensure all tables have consistent charsets and collations. (#11823)deprecationerrors.traces, fieldlayouts.config, gqlschemas.scope, sections.previewTargets, userpreferences.preferences, and widgets.settings columns are now of type JSON for MySQL and PostgreSQL. (#14300)defaultTemplateExtensions config setting now lists twig before html by default. (#11809)slug.craft\ervices\Sites::$maxSites at your own peril. (#14307)author. (#14057)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fixed a high-severity SQL injection vulnerability. (GHSA-mjj9-pjh4-r48g)
craft\helpers\StringHelper::containsNewlines().Fixed a high-severity RCE vulnerability. (GHSA-xmwr-88vw-5ghh)
Fixed a high-severity RCE vulnerability. (GHSA-5m2g-hhqr-84pc)
Fixed a high-severity RCE vulnerability. (GHSA-5r92-75j8-c534)
craft\helpers\StringHelper::isMd5().Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →