Skip to main content
Add getUrl to user element
Users sind zwar Elements, haben aber trotzdem kein URI Element. Hier wird erklärt, wie man dies ändern kann.

Für Elemente oder Kategorien (solange es sie noch gibt) gibt es die Möglichkeit, deren URL via {{ entry.getUrl() }} aufzurufen. Für Benutzer leider nicht, dort muss man auf Umwege wie den folgenden zurückgreifen:

{{ url("users/"~user.username) }}

Das ist natürlich nicht ideal, und ein Custom Behaviour klappt auch nicht, da die User trotzdem Elements sind und damit bereits eine getUrl() besitzen.

Ab Craft 4.3 können wir aber den Event (User::EVENT_DEFINE_URL), der direkt vor dem Retournieren der Url getriggert wird, abfangen und eine eigene Logik einbauen:

namespace foo;

use Craft;

class Module extends \yii\base\Module
{
    public function init()
    {
        // ...

        // Defer most setup tasks until Craft is fully initialized:
        Craft::$app->onInit(function() {
            // Add the event listener
             \craft\base\Event::on(
                User::class, 
                Element::EVENT_DEFINE_URL, 
                function (DefineUrlEvent $event) {
                    $event->handled = true;
                    // Add your custom url logic here
                    $event->url = UrlHelper::siteUrl('users/' . $event->sender->id);
                    // Other examples:
                    // $event->url = UrlHelper::siteUrl('users/' . $event->sender->username);
                    // $event->url = UrlHelper::siteUrl('users/' . $event->sender->uuid);
                }
            );
        });
    }
}

In einem Modul in der Init Methode untergebracht kann fortan mit

{{ user.getUrl() }}

die URL des Users einfach und konsistent aufgerufen werden.

Credits: Leevi Graham