Skip to content

Commit

Permalink
Merge pull request #12168 from craftcms/feature/dev-1028-elementevent…
Browse files Browse the repository at this point in the history
…_define_url

Element::EVENT_DEFINE_URL
  • Loading branch information
brandonkelly authored Oct 20, 2022
2 parents ecb040d + 8733838 commit 4e5f62c
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 21 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG-WIP.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
- Added support for the `CRAFT_DOTENV_PATH` PHP constant. ([#11894](https://github.com/craftcms/cms/discussions/11894))
- Added support for `CRAFT_WEB_URL` and `CRAFT_WEB_ROOT` PHP constants, which can be used to set the default `@web` and `@webroot` alias values. ([#11912](https://github.com/craftcms/cms/pull/11912))
- Added `craft\base\conditions\BaseTextConditionRule::inputOptions()`.
- Added `craft\base\Element::EVENT_DEFINE_URL`. ([#12168](https://github.com/craftcms/cms/pull/12168))
- Added `craft\base\ExpirableElementInterface`. ([#11901](https://github.com/craftcms/cms/pull/11901))
- Added `craft\controllers\ElementsController::$element`.
- Added `craft\db\ActiveQuery::collect()`. ([#11842](https://github.com/craftcms/cms/pull/11842))
Expand All @@ -33,6 +34,7 @@
- Added `craft\events\CreateTwigEvent`.
- Added `craft\events\DefineAddressFieldLabelEvent`.
- Added `craft\events\DefineAddressFieldsEvent`.
- Added `craft\events\DefineUrlEvent`. ([#12168](https://github.com/craftcms/cms/pull/12168))
- Added `craft\events\ImageTransformerOperationEvent::$tempPath`.
- Added `craft\events\SearchEvent::$scores`. ([#11882](https://github.com/craftcms/cms/discussions/11882))
- Added `craft\events\UserGroupPermissionsEvent`.
Expand Down Expand Up @@ -117,6 +119,7 @@
- `{% cache %}` tags and GraphQL query caches now get a max cache duration based on the fetched/referenced entries’ expiry dates. ([#8525](https://github.com/craftcms/cms/discussions/8525), [#11901](https://github.com/craftcms/cms/pull/11901))
- Improved GraphQL cache reliability. ([#11994](https://github.com/craftcms/cms/issues/11994), [#12086](https://github.com/craftcms/cms/pull/12086))
- Control panel `.twig` templates are now prioritized over `.html`. ([#11809](https://github.com/craftcms/cms/discussions/11809), [#11840](https://github.com/craftcms/cms/pull/11840))
- `craft\elements\Asset::EVENT_DEFINE_URL` now gets triggered after the default URL has been generated, and the URL will be passed to `craft\events\DefineAssetUrlEvent::$url`.
- `craft\elements\db\ElementQuery::collect()` and `craft\base\Element::getEagerLoadedElements()` now return `craft\elements\ElementCollection` instances. ([#12113](https://github.com/craftcms/cms/discussions/12113))
- `craft\events\DraftEvent::$creatorId` is now nullable. ([#11904](https://github.com/craftcms/cms/issues/11904))
- `craft\fieldlayoutelements\BaseField::statusClass()` and `statusLabel()` now return status info from the element for the attribute specified by `attribute()`.
Expand All @@ -135,6 +138,7 @@
- Deprecated `craft\base\Element::EVENT_AUTHORIZE_SAVE`. `craft\services\Elements::EVENT_AUTHORIZE_SAVE` should be used instead.
- Deprecated `craft\base\Element::EVENT_AUTHORIZE_VIEW`. `craft\services\Elements::EVENT_AUTHORIZE_VIEW` should be used instead.
- Deprecated `craft\elements\Address::addressAttributeLabel()`. `craft\services\Addresses::getFieldLabel()` should be used instead.
- Deprecated `craft\events\DefineAssetUrlEvent::$asset`. `$sender` should be used instead.
- Deprecated `craft\services\Elements::getIsCollectingCacheTags()`. `getIsCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))
- Deprecated `craft\services\Elements::startCollectingCacheTags()`. `startCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))
- Deprecated `craft\services\Elements::stopCollectingCacheTags()`. `stopCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))
Expand Down
52 changes: 48 additions & 4 deletions src/base/Element.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
use craft\events\DefineEagerLoadingMapEvent;
use craft\events\DefineHtmlEvent;
use craft\events\DefineMetadataEvent;
use craft\events\DefineUrlEvent;
use craft\events\DefineValueEvent;
use craft\events\ElementIndexTableAttributeEvent;
use craft\events\ElementStructureEvent;
Expand Down Expand Up @@ -538,6 +539,38 @@ abstract class Element extends Component implements ElementInterface
*/
public const EVENT_DEFINE_KEYWORDS = 'defineKeywords';

/**
* @event DefineUrlEvent The event that is triggered when defining the element’s URL.
*
* ```php
* use craft\base\Element;
* use craft\elements\Entry;
* use craft\events\DefineUrlEvent;
* use craft\helpers\UrlHelper;
* use yii\base\Event;
*
* Event::on(
* Entry::class,
* Element::EVENT_DEFINE_URL,
* function(DefineUrlEvent $e
* ) {
* // @var Entry $entry
* $entry = $e->sender;
*
* // Add a custom query string param to the URL
* if ($event->value !== null) {
* $event->url = UrlHelper::urlWithParams($event->url, [
* 'foo' => 'bar',
* ]);
* }
* });
* ```
*
* @since 4.3.0
* @see getUrl()
*/
public const EVENT_DEFINE_URL = 'defineUrl';

/**
* @event ModelEvent The event that is triggered before the element is saved.
*
Expand Down Expand Up @@ -2761,12 +2794,23 @@ public function getIsHomepage(): bool
*/
public function getUrl(): ?string
{
if (!isset($this->uri)) {
return null;
if (isset($this->uri)) {
$path = $this->getIsHomepage() ? '' : $this->uri;
$url = UrlHelper::siteUrl($path, null, null, $this->siteId);
} else {
$url = null;
}

// Give plugins/modules a chance to customize it
if ($this->hasEventHandlers(self::EVENT_DEFINE_URL)) {
$event = new DefineUrlEvent([
'url' => $url,
]);
$this->trigger(self::EVENT_DEFINE_URL, $event);
$url = $event->url;
}

$path = $this->getIsHomepage() ? '' : $this->uri;
return UrlHelper::siteUrl($path, null, null, $this->siteId);
return $url !== null ? Html::encodeSpaces($url) : $url;
}

/**
Expand Down
26 changes: 16 additions & 10 deletions src/elements/Asset.php
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class Asset extends Element
public const EVENT_AFTER_GENERATE_TRANSFORM = 'afterGenerateTransform';

/**
* @event DefineAssetUrlEvent The event that is triggered when a transform is being generated for an asset.
* @event DefineAssetUrlEvent The event that is triggered when defining the asset’s URL.
* @see getUrl()
* @since 4.0.0
*/
Expand Down Expand Up @@ -1507,18 +1507,24 @@ public function setTransform(mixed $transform): Asset
*/
public function getUrl(mixed $transform = null, ?bool $immediately = null): ?string
{
// Maybe a plugin wants to do something here
$event = new DefineAssetUrlEvent([
'transform' => $transform,
'asset' => $this,
]);
$this->trigger(self::EVENT_DEFINE_URL, $event);
$url = $this->_url($transform, $immediately);

// If a plugin set the url, we'll just use that.
if ($event->url !== null) {
return Html::encodeSpaces($event->url);
// Give plugins/modules a chance to customize it
if ($this->hasEventHandlers(self::EVENT_DEFINE_URL)) {
$event = new DefineAssetUrlEvent([
'url' => $url,
'transform' => $transform,
'asset' => $this,
]);
$this->trigger(self::EVENT_DEFINE_URL, $event);
$url = $event->url;
}

return $url !== null ? Html::encodeSpaces($url) : $url;
}

private function _url(mixed $transform = null, ?bool $immediately = null): ?string
{
$volume = $this->getVolume();

$transform = $transform ?? $this->_transform;
Expand Down
9 changes: 2 additions & 7 deletions src/events/DefineAssetUrlEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
* @author Pixel & Tonic, Inc. <[email protected]>
* @since 4.0.0
*/
class DefineAssetUrlEvent extends Event
class DefineAssetUrlEvent extends DefineUrlEvent
{
/**
* @var ImageTransform|string|array|null Asset transform index that is being generated (if any)
Expand All @@ -28,12 +28,7 @@ class DefineAssetUrlEvent extends Event
/**
* @var Asset The asset that is being transformed.
* @since 4.0.0
* @deprecated in 4.3.0. [[$sender]] should be used instead.
*/
public Asset $asset;

/**
* @var string|null Url to requested Asset that should be used instead.
* @since 4.0.0
*/
public ?string $url = null;
}
24 changes: 24 additions & 0 deletions src/events/DefineUrlEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\events;

use yii\base\Event;

/**
* Define URL event class
*
* @author Pixel & Tonic, Inc. <[email protected]>
* @since 4.3.0
*/
class DefineUrlEvent extends Event
{
/**
* @var string|null The URL
*/
public ?string $url = null;
}

0 comments on commit 4e5f62c

Please sign in to comment.