.. include:: /Includes.rst.txt

.. _feature-86614:

==========================================================================
Feature: #86614 - Add PSR-14 event to control hreflang tags to be rendered
==========================================================================

See :issue:`86614`

Description
===========

It is now possible to alter the hreflang tags just before they
get rendered. You can do this by registering an event listener for
the event :php:`TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent`.

Also the class :php:`TYPO3\CMS\Seo\HrefLang\HrefLangGenerator` has been
refactored to be a listener (identifier :php:`'typo3-seo/hreflangGenerator'`)
to the newly introduced event. This way the system extension seo still
provides hreflang tags but it is now possible to simply register
after or instead of the implementation.

Example
=======

An example implementation could look like this:

:file:`EXT:my_extension/Configuration/Services.yaml`

.. code-block:: yaml

   services:
     Vendor\MyExtension\HrefLang\EventListener\OwnHrefLang:
       tags:
         - name: event.listener
           identifier: 'my-ext/ownHrefLang'
           after: 'typo3-seo/hreflangGenerator'
           event: TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent

With :yaml:`after` and :yaml:`before`, you can make sure your own listener is
executed after or before the given identifiers.

:file:`EXT:my_extension/Classes/HrefLang/EventListener/OwnHrefLang.php`

.. code-block:: php

   namespace Vendor\MyExtension\HrefLang\EventListener;

   use TYPO3\CMS\Frontend\Event\ModifyHrefLangTagsEvent;

   class OwnHrefLang
   {
      public function __invoke(ModifyHrefLangTagsEvent $event): void
      {
         $hrefLangs = $event->getHrefLangs();
         $request = $event->getRequest();

         // Do anything you want with $hrefLangs
         $hrefLangs = [
            'en-US' => 'https://example.com',
            'nl-NL' => 'https://example.com/nl'
         ];

         // Override all hrefLang tags
         $event->setHrefLangs($hrefLangs);

         // Or add a single hrefLang tag
         $event->addHrefLang('de-DE', 'https://example.com/de');
       }
   }

.. index:: ext:seo, PHP-API
