Skip to content

Commit 4e5f62c

Browse files
authored
Merge pull request #12168 from craftcms/feature/dev-1028-elementevent_define_url
Element::EVENT_DEFINE_URL
2 parents ecb040d + 8733838 commit 4e5f62c

File tree

5 files changed

+94
-21
lines changed

5 files changed

+94
-21
lines changed

CHANGELOG-WIP.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
- Added support for the `CRAFT_DOTENV_PATH` PHP constant. ([#11894](https://github.com/craftcms/cms/discussions/11894))
2323
- 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))
2424
- Added `craft\base\conditions\BaseTextConditionRule::inputOptions()`.
25+
- Added `craft\base\Element::EVENT_DEFINE_URL`. ([#12168](https://github.com/craftcms/cms/pull/12168))
2526
- Added `craft\base\ExpirableElementInterface`. ([#11901](https://github.com/craftcms/cms/pull/11901))
2627
- Added `craft\controllers\ElementsController::$element`.
2728
- Added `craft\db\ActiveQuery::collect()`. ([#11842](https://github.com/craftcms/cms/pull/11842))
@@ -33,6 +34,7 @@
3334
- Added `craft\events\CreateTwigEvent`.
3435
- Added `craft\events\DefineAddressFieldLabelEvent`.
3536
- Added `craft\events\DefineAddressFieldsEvent`.
37+
- Added `craft\events\DefineUrlEvent`. ([#12168](https://github.com/craftcms/cms/pull/12168))
3638
- Added `craft\events\ImageTransformerOperationEvent::$tempPath`.
3739
- Added `craft\events\SearchEvent::$scores`. ([#11882](https://github.com/craftcms/cms/discussions/11882))
3840
- Added `craft\events\UserGroupPermissionsEvent`.
@@ -117,6 +119,7 @@
117119
- `{% 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))
118120
- Improved GraphQL cache reliability. ([#11994](https://github.com/craftcms/cms/issues/11994), [#12086](https://github.com/craftcms/cms/pull/12086))
119121
- 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))
122+
- `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`.
120123
- `craft\elements\db\ElementQuery::collect()` and `craft\base\Element::getEagerLoadedElements()` now return `craft\elements\ElementCollection` instances. ([#12113](https://github.com/craftcms/cms/discussions/12113))
121124
- `craft\events\DraftEvent::$creatorId` is now nullable. ([#11904](https://github.com/craftcms/cms/issues/11904))
122125
- `craft\fieldlayoutelements\BaseField::statusClass()` and `statusLabel()` now return status info from the element for the attribute specified by `attribute()`.
@@ -135,6 +138,7 @@
135138
- Deprecated `craft\base\Element::EVENT_AUTHORIZE_SAVE`. `craft\services\Elements::EVENT_AUTHORIZE_SAVE` should be used instead.
136139
- Deprecated `craft\base\Element::EVENT_AUTHORIZE_VIEW`. `craft\services\Elements::EVENT_AUTHORIZE_VIEW` should be used instead.
137140
- Deprecated `craft\elements\Address::addressAttributeLabel()`. `craft\services\Addresses::getFieldLabel()` should be used instead.
141+
- Deprecated `craft\events\DefineAssetUrlEvent::$asset`. `$sender` should be used instead.
138142
- Deprecated `craft\services\Elements::getIsCollectingCacheTags()`. `getIsCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))
139143
- Deprecated `craft\services\Elements::startCollectingCacheTags()`. `startCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))
140144
- Deprecated `craft\services\Elements::stopCollectingCacheTags()`. `stopCollectingCacheInfo()` should be used instead. ([#11901](https://github.com/craftcms/cms/pull/11901))

src/base/Element.php

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use craft\events\DefineEagerLoadingMapEvent;
3434
use craft\events\DefineHtmlEvent;
3535
use craft\events\DefineMetadataEvent;
36+
use craft\events\DefineUrlEvent;
3637
use craft\events\DefineValueEvent;
3738
use craft\events\ElementIndexTableAttributeEvent;
3839
use craft\events\ElementStructureEvent;
@@ -538,6 +539,38 @@ abstract class Element extends Component implements ElementInterface
538539
*/
539540
public const EVENT_DEFINE_KEYWORDS = 'defineKeywords';
540541

542+
/**
543+
* @event DefineUrlEvent The event that is triggered when defining the element’s URL.
544+
*
545+
* ```php
546+
* use craft\base\Element;
547+
* use craft\elements\Entry;
548+
* use craft\events\DefineUrlEvent;
549+
* use craft\helpers\UrlHelper;
550+
* use yii\base\Event;
551+
*
552+
* Event::on(
553+
* Entry::class,
554+
* Element::EVENT_DEFINE_URL,
555+
* function(DefineUrlEvent $e
556+
* ) {
557+
* // @var Entry $entry
558+
* $entry = $e->sender;
559+
*
560+
* // Add a custom query string param to the URL
561+
* if ($event->value !== null) {
562+
* $event->url = UrlHelper::urlWithParams($event->url, [
563+
* 'foo' => 'bar',
564+
* ]);
565+
* }
566+
* });
567+
* ```
568+
*
569+
* @since 4.3.0
570+
* @see getUrl()
571+
*/
572+
public const EVENT_DEFINE_URL = 'defineUrl';
573+
541574
/**
542575
* @event ModelEvent The event that is triggered before the element is saved.
543576
*
@@ -2761,12 +2794,23 @@ public function getIsHomepage(): bool
27612794
*/
27622795
public function getUrl(): ?string
27632796
{
2764-
if (!isset($this->uri)) {
2765-
return null;
2797+
if (isset($this->uri)) {
2798+
$path = $this->getIsHomepage() ? '' : $this->uri;
2799+
$url = UrlHelper::siteUrl($path, null, null, $this->siteId);
2800+
} else {
2801+
$url = null;
2802+
}
2803+
2804+
// Give plugins/modules a chance to customize it
2805+
if ($this->hasEventHandlers(self::EVENT_DEFINE_URL)) {
2806+
$event = new DefineUrlEvent([
2807+
'url' => $url,
2808+
]);
2809+
$this->trigger(self::EVENT_DEFINE_URL, $event);
2810+
$url = $event->url;
27662811
}
27672812

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

27722816
/**

src/elements/Asset.php

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class Asset extends Element
132132
public const EVENT_AFTER_GENERATE_TRANSFORM = 'afterGenerateTransform';
133133

134134
/**
135-
* @event DefineAssetUrlEvent The event that is triggered when a transform is being generated for an asset.
135+
* @event DefineAssetUrlEvent The event that is triggered when defining the asset’s URL.
136136
* @see getUrl()
137137
* @since 4.0.0
138138
*/
@@ -1507,18 +1507,24 @@ public function setTransform(mixed $transform): Asset
15071507
*/
15081508
public function getUrl(mixed $transform = null, ?bool $immediately = null): ?string
15091509
{
1510-
// Maybe a plugin wants to do something here
1511-
$event = new DefineAssetUrlEvent([
1512-
'transform' => $transform,
1513-
'asset' => $this,
1514-
]);
1515-
$this->trigger(self::EVENT_DEFINE_URL, $event);
1510+
$url = $this->_url($transform, $immediately);
15161511

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

1523+
return $url !== null ? Html::encodeSpaces($url) : $url;
1524+
}
1525+
1526+
private function _url(mixed $transform = null, ?bool $immediately = null): ?string
1527+
{
15221528
$volume = $this->getVolume();
15231529

15241530
$transform = $transform ?? $this->_transform;

src/events/DefineAssetUrlEvent.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
1818
* @since 4.0.0
1919
*/
20-
class DefineAssetUrlEvent extends Event
20+
class DefineAssetUrlEvent extends DefineUrlEvent
2121
{
2222
/**
2323
* @var ImageTransform|string|array|null Asset transform index that is being generated (if any)
@@ -28,12 +28,7 @@ class DefineAssetUrlEvent extends Event
2828
/**
2929
* @var Asset The asset that is being transformed.
3030
* @since 4.0.0
31+
* @deprecated in 4.3.0. [[$sender]] should be used instead.
3132
*/
3233
public Asset $asset;
33-
34-
/**
35-
* @var string|null Url to requested Asset that should be used instead.
36-
* @since 4.0.0
37-
*/
38-
public ?string $url = null;
3934
}

src/events/DefineUrlEvent.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
/**
3+
* @link https://craftcms.com/
4+
* @copyright Copyright (c) Pixel & Tonic, Inc.
5+
* @license https://craftcms.github.io/license/
6+
*/
7+
8+
namespace craft\events;
9+
10+
use yii\base\Event;
11+
12+
/**
13+
* Define URL event class
14+
*
15+
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
16+
* @since 4.3.0
17+
*/
18+
class DefineUrlEvent extends Event
19+
{
20+
/**
21+
* @var string|null The URL
22+
*/
23+
public ?string $url = null;
24+
}

0 commit comments

Comments
 (0)