Pimcore: Document Translation Link

Mit dem Helper erhält man die URL der entsprechenden Sprachversion von verknüpften Dokumenten (seit Pimcore 4). Somit kann man einen "intelligenten" Language Switch (englisch/deutsch) in seine Seite implementieren.
Im Backend kann man die Seiten über das Menü miteinander verknüpfen:

Pimcore Translation Document Links

Da wir meist nur Webseiten erstellen welche in Deutsch und Englisch ausgeliefert werden, behandeln wir hier auch nur diesen Szenario.
Unser Standard Url Schema sieht meist so aus domain.com/de/tolle-seite bzw. domain.com/en/awesome-page.

<?php  
    namespace Website\Tool;
    use Pimcore\Model\Document;

    class Frontend
    {
        /**
         * @param Document $document
         * @param string $language
         *
         * @return bool|string
         */
        public static function getLanguageDocument($document, $language = 'de')
        {
            if ($document instanceof Document) {

                if ($document instanceof Document\Page) {

                    /** @var Document\Service $service */
                    $service = new Document\Service();
                    $linkedDocuments = $service->getTranslations($document);

                    foreach ($linkedDocuments as $docLanguage => $docId) {
                        if ($docLanguage == $language) {

                            /** @var Document $doc */
                            $doc = Document::getById($docId);
                            if ($doc instanceof Document\Page) {
                                return $doc->getFullPath();
                            }
                        }
                    }
                }
            }

            return false;
        }
    }

Dann erweitern wir noch die Website Controller Action, damit wir in jedem Dokument auf die URL zugreifen können:

<?php

    namespace Website\Controller;

    use Pimcore\Controller\Action\Frontend;

    class Action extends Frontend
    {

        public $language;

        public function init()
        {
            parent::init();

            if (\Zend_Registry::isRegistered("Zend_Locale")) {
                $locale = \Zend_Registry::get("Zend_Locale");
            } else {
                $locale = new \Zend_Locale("en");
                \Zend_Registry::set("Zend_Locale", $locale);
            }

            $this->language = (string)$locale;
            $this->view->language = $this->language;

            $pageSiblingLanguage = ($this->language == 'de') ? 'en' : 'de';
            $currentPage = $this->getFrontController()->getRequest()->document;
            $pageSiblingUrl = \Website\Tool\Frontend::getLanguageDocument($currentPage, $pageSiblingLanguage);
            if($pageSiblingUrl){
                $this->view->pageSiblingUrl = $pageSiblingUrl;
            } else {
                $this->view->pageSiblingUrl = '/' . $pageSiblingLanguage;
            }
        }
    }

Nun kann man in einem Dokument wie folgt darauf zugreifen:

<a href="<?= $this->pageSiblingUrl ?>"><?= ($this->language == 'en') ? 'Deutsch' : 'Englisch' ?></a>  

Falls kein Link gefunden wird, enthält der Link standardgemäß die URL der entspechenden Sprachen-Startseite.
Ein Dank geht an @igorbenko der den initialen Input geliefert hat.

Cheers!

Marco

daddy in love, runner, kiter, engineer, berlin, sheeeeeit!