Skip to content

Commit

Permalink
Assets::getRootFolderByVolumeId() improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonkelly committed Jun 12, 2023
1 parent 5324524 commit 8305fbe
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 22 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG-WIP.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@
- Added `craft\web\CpScreenResponseBehavior::$pageSidebar`, `pageSidebar()`, and `pageSidebarTemplate()`. ([#13019](https://github.com/craftcms/cms/pull/13019), [#12795](https://github.com/craftcms/cms/issues/12795))
- Added `craft\web\CpScreenResponseBehavior::$slideoutBodyClass`.
- `craft\helpers\Cp::selectizeFieldHtml()`, `selectizeHtml()`, and `_includes/forms/selectize.twig` now support a `multi` param. ([#13176](https://github.com/craftcms/cms/pull/13176))
- `craft\services\Assets::getRootFolderByVolumeId()` now ensures the root folder actually exists, and caches its results internally, improving performance. ([#13297](https://github.com/craftcms/cms/issues/13297))
- `craft\validators\UniqueValidator` now supports setting an additional filter via the `filter` property. ([#12941](https://github.com/craftcms/cms/pull/12941))
- `craft\web\UrlManager` no longer triggers its `EVENT_REGISTER_CP_URL_RULES` and `EVENT_REGISTER_SITE_URL_RULES` events until the request is ready to be routed, making it safe to call `UrlManager::addRules()` from plugin/module constructors. ([#13109](https://github.com/craftcms/cms/issues/13109))
- Deprecated `craft\helpers\UrlHelper::buildQuery()`. `http_build_query()` should be used instead.
- Deprecated `craft\services\Volumes::ensureTopFolder()`. `craft\services\Assets::getRootFolderByVolumeId()` should be used instead.

### System
- All generated URL param characters are now properly encoded. ([#12796](https://github.com/craftcms/cms/issues/12796))
Expand Down
3 changes: 0 additions & 3 deletions src/fields/Assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -850,9 +850,6 @@ private function _findFolder(string $sourceKey, ?string $subpath, ?ElementInterf

$assetsService = Craft::$app->getAssets();
$rootFolder = $assetsService->getRootFolderByVolumeId($volume->id);
if (!$rootFolder) {
$rootFolder = Craft::$app->getVolumes()->ensureTopFolder($volume);
}

// Are we looking for the root folder?
$subpath = trim($subpath ?? '', '/');
Expand Down
37 changes: 32 additions & 5 deletions src/services/Assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ class Assets extends Component
*/
private array $_foldersByUid = [];

/**
* @var array<int,VolumeFolder|null>
* @see getRootFolderByVolumeId()
*/
private array $_rootFolders = [];

/**
* @var VolumeFolder[]
* @see getUserTemporaryUploadFolder()
Expand Down Expand Up @@ -543,10 +549,31 @@ public function findFolder(mixed $criteria = []): ?VolumeFolder
*/
public function getRootFolderByVolumeId(int $volumeId): ?VolumeFolder
{
return $this->findFolder([
'volumeId' => $volumeId,
'parentId' => ':empty:',
]);
if (!array_key_exists($volumeId, $this->_rootFolders)) {
$volume = Craft::$app->getVolumes()->getVolumeById($volumeId);
if (!$volume) {
// todo: throw an InvalidArgumentException
return $this->_rootFolders[$volumeId] = null;
}

$folder = $this->findFolder([
'volumeId' => $volumeId,
'parentId' => ':empty:',
]);

if (!$folder) {
$folder = new VolumeFolder();
$folder->volumeId = $volume->id;
$folder->parentId = null;
$folder->name = $volume->name;
$folder->path = '';
$this->storeFolderRecord($folder);
}

$this->_rootFolders[$volumeId] = $folder;
}

return $this->_rootFolders[$volumeId];
}

/**
Expand Down Expand Up @@ -826,7 +853,7 @@ public function getNameReplacementInFolder(string $originalFilename, int $folder
*/
public function ensureFolderByFullPathAndVolume(string $fullPath, Volume $volume, bool $justRecord = true): VolumeFolder
{
$parentFolder = Craft::$app->getVolumes()->ensureTopFolder($volume);
$parentFolder = $this->getRootFolderByVolumeId($volume->id);
$folderModel = $parentFolder;
$parentId = $parentFolder->id;

Expand Down
19 changes: 5 additions & 14 deletions src/services/Volumes.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use craft\records\VolumeFolder as VolumeFolderRecord;
use Throwable;
use yii\base\Component;
use yii\base\InvalidArgumentException;
use yii\base\InvalidConfigException;

/**
Expand Down Expand Up @@ -442,24 +443,14 @@ public function reorderVolumes(array $volumeIds): bool
*
* @param Volume $volume
* @return VolumeFolder
* @deprecated in 4.5.0. [[Assets::getRootFolderByVolumeId()]] should be used instead.
*/
public function ensureTopFolder(Volume $volume): VolumeFolder
{
$assetsService = Craft::$app->getAssets();
$folder = $assetsService->findFolder([
'name' => $volume->name,
'volumeId' => $volume->id,
]);

if ($folder === null) {
$folder = new VolumeFolder();
$folder->volumeId = $volume->id;
$folder->parentId = null;
$folder->name = $volume->name;
$folder->path = '';
$assetsService->storeFolderRecord($folder);
$folder = Craft::$app->getAssets()->getRootFolderByVolumeId($volume->id);
if (!$folder) {
throw new InvalidArgumentException(sprintf('Invalid volume passed to %s().', __METHOD__));
}

return $folder;
}

Expand Down

0 comments on commit 8305fbe

Please sign in to comment.