Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
34e1af4
Port NestedElementQueryInterface
riasvdv Apr 7, 2026
347b7d4
Deprecate trait & expression
riasvdv Apr 7, 2026
bfdbafa
Clean up ElementRelationParamParser
riasvdv Apr 7, 2026
971a117
health-check
riasvdv Apr 7, 2026
3164ccd
cp alerts
riasvdv Apr 7, 2026
4bd0be4
Move healthcheck controller
riasvdv Apr 8, 2026
952b0be
License shun
riasvdv Apr 8, 2026
dc87674
Plugin licenses
riasvdv Apr 8, 2026
1d5c51b
Broken images
riasvdv Apr 8, 2026
c3bf2d6
Render elements & components
riasvdv Apr 8, 2026
b7de336
Cleanup
riasvdv Apr 8, 2026
48e365f
Add test coverage
riasvdv Apr 8, 2026
255ea7d
ConditionsController
riasvdv Apr 8, 2026
09a7fcf
MatrixController
riasvdv Apr 8, 2026
62d6014
Remove unused controller
riasvdv Apr 8, 2026
ded20c5
Deprecate controllers
riasvdv Apr 8, 2026
d4bc3c4
RelationalFieldsController
riasvdv Apr 8, 2026
6fcd931
No need to port the Upgrade utility to 6
riasvdv Apr 8, 2026
64bad20
NestedElementsController
riasvdv Apr 8, 2026
8b81c52
Fix phpstan
riasvdv Apr 8, 2026
f5975e7
Fix test
riasvdv Apr 8, 2026
b943113
TemplatesController
riasvdv Apr 9, 2026
7231522
Remove controller
riasvdv Apr 9, 2026
694b1bd
Merge branch '6.x' into feature/misc-ports
riasvdv Apr 9, 2026
0366d84
Fix custom error page rendering when in CP
riasvdv Apr 9, 2026
f781d31
Ensure web middleware for session test
riasvdv Apr 9, 2026
9545249
Merge branch '6.x' into feature/misc-ports
riasvdv Apr 9, 2026
39daf94
Changelog
riasvdv Apr 9, 2026
e6e0454
All sorts of cleanup
riasvdv Apr 9, 2026
e6bcbf4
Fix legacy behavior test
riasvdv Apr 9, 2026
1dc66b5
Fix review comments
riasvdv Apr 9, 2026
302eb3e
Clean up factories
riasvdv Apr 10, 2026
8e0e2e7
Fix query on nested elements
riasvdv Apr 10, 2026
491e505
Merge branch '6.x' into feature/misc-ports
riasvdv Apr 11, 2026
18fd30d
Show exception.message on error pages
riasvdv Apr 13, 2026
4ab487e
Fix asset edit route not falling back to Yii
riasvdv Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG-WIP.md
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,10 @@ Craft 6 now uses [Laravel's authorization system](https://laravel.com/docs/12.x/

- Added `CraftCms\Cms\Support\Facades\Conditions`.

### Controllers

- Removed `craft\controllers\ConditionsController`. `CraftCms\Cms\Http\Controllers\ConditionsController` should be used instead.

### Deprecations

#### Service
Expand Down Expand Up @@ -501,6 +505,10 @@ Craft 6 introduces a new validation system that uses Laravel's Validator instead

## Element Queries

- Deprecated `craft\elements\db\ElementRelationParamParser`. `CraftCms\Cms\Database\ElementRelationParamFilter` should be used instead.
- Deprecated `craft\elements\db\NestedElementQueryInterface`. `CraftCms\Cms\Element\Queries\Contracts\NestedElementQueryInterface` should be used instead.
- Deprecated `craft\elements\db\NestedElementQueryTrait`. `CraftCms\Cms\Element\Queries\Concerns\QueriesNestedElements` should be used instead.
- Deprecated `craft\elements\db\OrderByPlaceholderExpression`. `CraftCms\Cms\Database\Expressions\OrderByPlaceholderExpression` should be used instead.
- Deprecated `\craft\elements\db\AddressQuery`. `\CraftCms\Cms\Element\Queries\AddressQuery` should be used instead.
- Deprecated `\craft\elements\db\AssetQuery` `\CraftCms\Cms\Element\Queries\AssetQuery` should be used instead.
- Deprecated `\craft\elements\db\ContentBlockQuery` `\CraftCms\Cms\Element\Queries\ContentBlockQuery` should be used instead.
Expand Down Expand Up @@ -595,6 +603,8 @@ Craft 6 introduces a new validation system that uses Laravel's Validator instead

- Updated field index pagination to return Laravel-style pagination metadata and use the configured `GeneralConfig::$pageTrigger` query parameter.
- Removed `craft\controllers\FieldsController` in favor of `CraftCms\Cms\Http\Controllers\FieldsController`.
- Removed `craft\controllers\MatrixController`. `CraftCms\Cms\Http\Controllers\MatrixController` should be used instead.
- Removed `craft\controllers\RelationalFieldsController`. `CraftCms\Cms\Http\Controllers\RelationalFieldsController` should be used instead.
- Deprecated `craft\errors\InvalidFieldException`. `CraftCms\Cms\Field\Exceptions\InvalidFieldException` should be used instead.
- Deprecated `craft\fields\data\ColorData`. `CraftCms\Cms\Field\Data\ColorData` should be used instead.
- Deprecated `craft\fields\data\IconData`. `CraftCms\Cms\Field\Data\IconData` should be used instead.
Expand Down Expand Up @@ -657,6 +667,7 @@ Craft 6 introduces a new validation system that uses Laravel's Validator instead

## HTTP

- Deprecated `craft\config\GeneralConfig::$errorTemplatePrefix` and `craft\config\GeneralConfig::errorTemplatePrefix()`. Configure [Laravel's custom error pages](https://laravel.com/docs/13.x/errors#custom-http-error-pages) instead.
- Deprecated `craft\filters\BasicHttpAuthLogin`. Use the `auth.basic` middleware instead. (see https://laravel.com/docs/12.x/authentication#http-basic-authentication)
- Deprecated `craft\filters\BasicHttpAuthStatic`. Use the `auth.basic` middleware instead. (see https://laravel.com/docs/12.x/authentication#http-basic-authentication)
- Deprecated `craft\filters\BasicHttpAuthTrait`. Use the `auth.basic` middleware instead. (see https://laravel.com/docs/12.x/authentication#http-basic-authentication)
Expand All @@ -666,7 +677,14 @@ Craft 6 introduces a new validation system that uses Laravel's Validator instead
- Deprecated `craft\filters\SiteFilterTrait`.
- Deprecated `craft\filters\UtilityAccess`.
- Deprecated `craft\controllers\AppController::actionLicensingIssues()`. `CraftCms\Cms\Http\Middleware\EnforceLicenses` should be used instead.
- Removed `craft\controllers\AppController::actionHealthCheck()`. `CraftCms\Cms\Http\Controllers\App\HealthCheckController` should be used instead.
- Removed `craft\controllers\AppController::actionGetCpAlerts()` and `actionShunCpAlert()`. `CraftCms\Cms\Http\Controllers\App\CpAlertsController` should be used instead.
- Removed `craft\controllers\AppController::actionIconPickerOptions()`. Use `CraftCms\Cms\Http\Controllers\IconController::pickerOptions()` instead.
- Removed `craft\controllers\AppController::actionSetLicenseShunCookie()`. `CraftCms\Cms\Http\Controllers\App\LicensesController::setShunCookie()` should be used instead.
- Removed `craft\controllers\AppController::actionGetPluginLicenseInfo()` and `actionUpdatePluginLicense()`. `CraftCms\Cms\Http\Controllers\App\PluginsController` should be used instead.
- Removed `craft\controllers\AppController::actionBrokenImage()`. `CraftCms\Cms\Http\Middleware\ShowBrokenImage` should be used instead.
- Removed `craft\controllers\AppController::actionRenderElements()` and `actionRenderComponents()`. `CraftCms\Cms\Http\Controllers\App\RenderController` should be used instead.
- Removed `craft\controllers\NotFoundController`. Laravel's exception handling should be used instead.
- Removed the header-setting logic in `yii2-adapter\legacy\web\Application`. The new `\CraftCms\Cms\Http\Middleware\SetHeaders` middleware handles this functionality.
- Removed the licensing issues screen logic in `yii2-adapter\legacy\web\Application`. The new `\CraftCms\Cms\Http\Middleware\EnforceLicenses` middleware handles this functionality.
- Removed `craft\controllers\AppController::actionTryEdition()` and `actionSwitchToLicensedEdition()` in favor of `CraftCms\Cms\Http\Controllers\EditionController`.
Expand Down
29 changes: 26 additions & 3 deletions database/Factories/AddressFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,54 @@

namespace CraftCms\Cms\Database\Factories;

use craft\base\ElementInterface;
use CraftCms\Cms\Address\Elements\Address as AddressElement;
use CraftCms\Cms\Address\Models\Address;
use CraftCms\Cms\Database\Factories\Concerns\CreatesElement;
use CraftCms\Cms\Database\Table;
use CraftCms\Cms\Element\Models\Element;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\DB;
use Override;

class AddressFactory extends Factory
{
use CreatesElement;

#[Override]
protected $model = Address::class;

#[Override]
public function definition(): array
{
return [
'id' => Element::factory()->set('type', \CraftCms\Cms\Address\Elements\Address::class),
'id' => Element::factory()->set('type', AddressElement::class),
'countryCode' => fake()->countryCode(),
'dateCreated' => $created = $this->faker->dateTime(),
'dateUpdated' => $created,
];
}

public function createElement(array $attributes = []): \CraftCms\Cms\Address\Elements\Address
public function createElement(array $attributes = []): AddressElement
{
$model = $this->create($attributes);

return \CraftCms\Cms\Address\Elements\Address::find()->id($model->id)->one();
return AddressElement::find()->id($model->id)->one();
}

public function withOwnedElement(
ElementInterface $owner,
int $sortOrder,
?int $primaryOwnerId = null,
): self {
return $this
->state(fn () => ['primaryOwnerId' => $primaryOwnerId ?? $owner->id])
->afterCreating(function (Address $address) use ($owner, $sortOrder) {
DB::table(Table::ELEMENTS_OWNERS)->insert([
'elementId' => $address->id,
'ownerId' => $owner->id,
'sortOrder' => $sortOrder,
]);
});
}
}
50 changes: 50 additions & 0 deletions database/Factories/Concerns/CreatesElement.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php

declare(strict_types=1);

namespace CraftCms\Cms\Database\Factories\Concerns;

trait CreatesElement
{
public function title(string $title): static
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->title($title),
]);
}

public function slug(string $slug): static
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->slug($slug),
]);
}

public function trashed(bool $trashed = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->trashed($trashed),
]);
}

public function archived(bool $archived = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('archived', $archived),
]);
}

public function enabled(bool $enabled = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('enabled', $enabled),
]);
}

public function disabled(bool $disabled = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('enabled', ! $disabled),
]);
}
}
44 changes: 2 additions & 42 deletions database/Factories/EntryFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace CraftCms\Cms\Database\Factories;

use CraftCms\Cms\Database\Factories\Concerns\CreatesElement;
use CraftCms\Cms\Database\Factories\Concerns\HasFieldFactory;
use CraftCms\Cms\Element\Element as BaseElement;
use CraftCms\Cms\Element\Models\Element;
Expand All @@ -20,6 +21,7 @@

class EntryFactory extends Factory
{
use CreatesElement;
use HasFieldFactory;

#[Override]
Expand Down Expand Up @@ -54,34 +56,6 @@ public function configure(): self
});
}

public function trashed(bool $trashed = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->trashed($trashed),
]);
}

public function archived(bool $archived = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('archived', $archived),
]);
}

public function enabled(bool $enabled = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('enabled', $enabled),
]);
}

public function disabled(bool $disabled = true): self
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->set('enabled', ! $disabled),
]);
}

public function pending(bool $pending = true): self
{
return $this->state(fn (array $attributes) => [
Expand All @@ -100,20 +74,6 @@ public function expired(bool $expired = true): self
]);
}

public function title(string $title): static
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->title($title),
]);
}

public function slug(string $slug): static
{
return $this->state(fn (array $attributes) => [
'id' => $attributes['id']->slug($slug),
]);
}

public function forSection(Section $section): static
{
return $this->state(fn () => ['sectionId' => $section->id]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

{% block message %}
<h2>{{ title }}</h2>
<p>{{ (message ?? null) ?: "The request could not be understood by the server due to malformed syntax."|t('app') }}</p>
<p>{{ (exception.message ?? null) ?: "The request could not be understood by the server due to malformed syntax."|t('app') }}</p>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

{% block message %}
<h2>{{ title }}</h2>
<p>{{ (message ?? null) ?: "You don’t have the proper credentials to access this page."|t('app') }}</p>
<p>{{ (exception.message ?? null) ?: "You don’t have the proper credentials to access this page."|t('app') }}</p>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

{% block message %}
<h2>{{ title }}</h2>
<p>{{ (message ?? null) ?: "The requested URL was not found on this server."|t('app') }}</p>
<p>{{ (exception.message ?? null) ?: "The requested URL was not found on this server."|t('app') }}</p>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

{% block message %}
<h2>{{ title }}</h2>
<p>{{ (message ?? null) ?: "An error occurred while processing your request."|t('app') }}</p>
<p>{{ (exception.message ?? null) ?: "An error occurred while processing your request."|t('app') }}</p>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

{% block message %}
<h2>{{ title }}</h2>
<p>{{ (message ?? null) ?: "Our site is temporarily unavailable. Please try again later."|t('app') }}</p>
<p>{{ (exception.message ?? null) ?: "Our site is temporarily unavailable. Please try again later."|t('app') }}</p>
{% endblock %}
37 changes: 37 additions & 0 deletions routes/actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
use CraftCms\Cms\Http\Controllers\AddressesController;
use CraftCms\Cms\Http\Controllers\AnnouncementsController;
use CraftCms\Cms\Http\Controllers\ApiController;
use CraftCms\Cms\Http\Controllers\App\CpAlertsController;
use CraftCms\Cms\Http\Controllers\App\HealthCheckController;
use CraftCms\Cms\Http\Controllers\App\LicensesController;
use CraftCms\Cms\Http\Controllers\App\RenderController;
use CraftCms\Cms\Http\Controllers\Assets\ActionController as AssetsActionController;
use CraftCms\Cms\Http\Controllers\Assets\FolderController as AssetsFolderController;
use CraftCms\Cms\Http\Controllers\Assets\IconController as AssetsIconController;
Expand All @@ -19,6 +23,7 @@
use CraftCms\Cms\Http\Controllers\Auth\SessionInfoController;
use CraftCms\Cms\Http\Controllers\Auth\TwoFactorAuthenticationController;
use CraftCms\Cms\Http\Controllers\BaseUpdaterController;
use CraftCms\Cms\Http\Controllers\ConditionsController;
use CraftCms\Cms\Http\Controllers\ConfigSyncController;
use CraftCms\Cms\Http\Controllers\Dashboard\Widgets\CraftSupportController;
use CraftCms\Cms\Http\Controllers\Dashboard\Widgets\FeedController;
Expand All @@ -36,12 +41,15 @@
use CraftCms\Cms\Http\Controllers\Gql\TokensController as GqlTokensController;
use CraftCms\Cms\Http\Controllers\IconController;
use CraftCms\Cms\Http\Controllers\InstallController;
use CraftCms\Cms\Http\Controllers\MatrixController;
use CraftCms\Cms\Http\Controllers\MigrateController;
use CraftCms\Cms\Http\Controllers\NestedElementsController;
use CraftCms\Cms\Http\Controllers\PluginsController;
use CraftCms\Cms\Http\Controllers\PluginStore\InstallController as PluginStoreInstallController;
use CraftCms\Cms\Http\Controllers\PluginStore\PluginStoreController;
use CraftCms\Cms\Http\Controllers\PluginStore\RemoveController;
use CraftCms\Cms\Http\Controllers\PreviewController;
use CraftCms\Cms\Http\Controllers\RelationalFieldsController;
use CraftCms\Cms\Http\Controllers\Settings\EntryTypesController;
use CraftCms\Cms\Http\Controllers\Settings\FilesystemsController;
use CraftCms\Cms\Http\Controllers\Settings\ImageTransformsController;
Expand Down Expand Up @@ -95,6 +103,9 @@
]) => ['craft.cp'],
] as $prefix => $middleware) {
Route::prefix($prefix)->middleware($middleware)->group(function () {
// App
Route::get('app/health-check', HealthCheckController::class);

// Auth
Route::post('users/login', [LoginController::class, 'attemptLogin']);
Route::post('auth/verify-totp', [TwoFactorAuthenticationController::class, 'verify']);
Expand Down Expand Up @@ -174,6 +185,15 @@
Route::post('addresses/fields', [AddressesController::class, 'fields']);
Route::middleware(RequireAdminChanges::class)->post('addresses/save-field-layout', [AddressesController::class, 'saveFieldLayout']);

// App
Route::any('app/get-cp-alerts', [CpAlertsController::class, 'index']);
Route::any('app/shun-cp-alert', [CpAlertsController::class, 'destroy']);
Route::any('app/set-license-shun-cookie', [LicensesController::class, 'setShunCookie']);
Route::middleware(RequireAdmin::class)->get('app/get-plugin-license-info', [CraftCms\Cms\Http\Controllers\App\PluginsController::class, 'getLicenseInfo']);
Route::middleware(RequireAdminChanges::class)->post('app/update-plugin-license', [CraftCms\Cms\Http\Controllers\App\PluginsController::class, 'updateLicense']);
Route::any('app/render-elements', [RenderController::class, 'elements']);
Route::any('app/render-components', [RenderController::class, 'components']);

// Auth methods
Route::post('auth/method-setup-html', [AuthMethodController::class, 'setupHtml']);
Route::post('auth/method-listing-html', [AuthMethodController::class, 'listingHtml']);
Expand All @@ -195,6 +215,11 @@
Route::post('utilities/clear-caches-perform-action', [ClearCachesController::class, 'clearCaches']);
Route::post('utilities/invalidate-tags', [ClearCachesController::class, 'invalidateTags']);

// Conditions
Route::post('conditions/render', [ConditionsController::class, 'show']);
Route::post('conditions/add-rule', [ConditionsController::class, 'store']);
Route::post('conditions/remove-rule', [ConditionsController::class, 'destroy']);

// DbBackup
Route::post('utilities/db-backup-perform-action', DbBackupController::class);

Expand Down Expand Up @@ -270,9 +295,18 @@
});
});

// Matrix
Route::post('matrix/default-table-column-options', [MatrixController::class, 'defaultTableColumnOptions']);
Route::post('matrix/create-entry', [MatrixController::class, 'createEntry']);
Route::post('matrix/render-blocks', [MatrixController::class, 'renderBlocks']);

// Migrations
Route::post('utilities/apply-new-migrations', MigrationsController::class);

// Nested entries
Route::post('nested-elements/reorder', [NestedElementsController::class, 'reorder']);
Route::post('nested-elements/delete', [NestedElementsController::class, 'destroy']);

// Asset Indexes
Route::post('asset-indexes/start-indexing', [AssetIndexesController::class, 'startIndexing']);
Route::post('asset-indexes/stop-indexing-session', [AssetIndexesController::class, 'stopIndexingSession']);
Expand Down Expand Up @@ -303,6 +337,9 @@
// Preview
Route::any('preview/create-token', [PreviewController::class, 'createToken']);

// Relational fields
Route::any('relational-fields/structured-input-html', [RelationalFieldsController::class, 'structuredInputHtml']);

// Widgets
Route::post('dashboard/create-widget', [WidgetsController::class, 'store']);
Route::post('dashboard/save-widget-settings', [WidgetsController::class, 'update']);
Expand Down
3 changes: 2 additions & 1 deletion routes/cp.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,9 @@
/**
* Assets
*/
// Route::get('assets/edit/{id}-{filename}', EditElementController::class); - TODO
Route::get('assets/{defaultSource?}', AssetsIndexController::class)
->where('defaultSource', '.*');
->where('defaultSource', '(?!edit(?:/|$)).*');

/**
* Routes that require admin, but do not require admin changes
Expand Down
2 changes: 1 addition & 1 deletion src/Address/Elements/Address.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
use Craft;
use craft\base\NestedElementInterface;
use craft\base\NestedElementTrait;
use craft\elements\conditions\addresses\AddressCondition;
use CraftCms\Cms\Address\Addresses;
use CraftCms\Cms\Address\Conditions\AddressCondition;
use CraftCms\Cms\Address\Models\Address as AddressModel;
use CraftCms\Cms\Address\Validation\AddressRules;
use CraftCms\Cms\Cms;
Expand Down
Loading
Loading