it-swarm.com.de

Wie bekomme ich einen sprachspezifischen Pfad in einem Zweig?

In einer twig - Vorlage können Sie mithilfe von {{ path('entity.node.edit_form', {'node': nid }) }} einen relativen Pfad abrufen. Der Pfad wird in der aktuellen Sprache angezeigt.

Jetzt muss ich den Pfad in einer bestimmten Sprache finden. Ich dachte, ich könnte {{ path('entity.node.edit_form', {'node': nid }, {'language': langcode}) }} verwenden, aber dies führt zu einem Fehler, wenn ich langcode auf einen String wie DE setze. Nach den API-Dokumenten muss language ein Sprachobjekt sein. Wie kann ich das im Zweig erreichen?

4
Philipp Michael

Für eine Lösung twig only) können Sie eine benutzerdefinierte twig function path_lang() definieren, die das Sprachobjekt zu Optionen hinzufügt, wenn ein Sprachcode vorhanden ist wird als zusätzlicher Parameter bereitgestellt:

src/TwigExtension.php :

<?php

namespace Drupal\mymodule;

use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Routing\UrlGeneratorInterface;

class TwigExtension extends \Twig_Extension {

  protected $languageManager;

  protected $urlGenerator;

  public function __construct(LanguageManagerInterface $language_manager, UrlGeneratorInterface $url_generator) {
    $this->languageManager = $language_manager;
    $this->urlGenerator = $url_generator;
  }

  public function getName() {
    return 'mymodule';
  }

  public function getFunctions() {
    return [
      new \Twig_SimpleFunction('path_lang', [$this, 'getPathLang']),
    ];
  }

  public function getPathLang($name, $parameters = [], $options = [], $langcode = '') {
    if (!empty($langcode)) {
      if ($language = $this->languageManager->getLanguage($langcode)) {
        $options['language'] = $language;
      }
    }
    return $this->urlGenerator->generateFromRoute($name, $parameters, $options);
  }
}

mymodule.services.yml :

services:
  mymodule.twig.extension:
    arguments: ['@language_manager', '@url_generator']
    class: Drupal\mymodule\TwigExtension
    tags:
      - { name: twig.extension }

In Zweig :

{{  path_lang('entity.node.edit_form', {'node': nid }, {}, 'en') }}
6
4k4

Dies wird nicht funktionieren, da ich denke, dass Sie das Sprachobjekt und nicht nur den Langcode benötigen.

Ich denke, der beste Weg, dies zu tun, ist es, es in einem THEME_preprocess_node in Ihrer yourtheme.theme-Datei zu tun:

LÖSUNG 1 (Übersetzung des Knotens abrufen und dann den richtigen Link erhalten):

function yourtheme_preprocess_node(&$vars) {
    $node = &$vars['node'];
    // TO HAVE NODE URL IN ANY OF YOUR NODE TEMPLATES FOR CURRENT LANGUAGE
    $vars['node_url'] = $node->toUrl()->toString();
    // SOLUTION 1
    $node_de = $node->getTranslation('de');
    if ($node_de && is_object($node_de)) {
        $node_url = $node_de->toUrl()->toString();
        $vars['node_url_de'] = $node_url;
    }
}

LÖSUNG 2 (Holen Sie sich das URL-Objekt des Knotens und dann die Übersetzung des URL-Objekts):

function yourtheme_preprocess_node(&$vars) {
    $node = &$vars['node'];
    // TO HAVE NODE URL IN ANY OF YOUR NODE TEMPLATES FOR CURRENT LANGUAGE
    $vars['node_url'] = $node->toUrl()->toString();
    // SOLUTION 2
    $language_manager = \Drupal::service('language_manager');
    $language_de = $language_manager->getLanguage('de');
    $urlNodeObject = $node->toUrl();
    $urlNodeObject->setOption('language', $language_de);
    // IF YOU WANT AN ABSOLUTE URL
    $urlNodeObject->setAbsolute();

    $vars['node_url_de'] = $urlNodeObject->toString();
}

Obwohl ich $vars['node_url'] = $node->toUrl()->toString(); zum Drucken von {{ node_url }} Anstelle von {{ path('entity.node.edit_form', {'node': nid }) }} setze, weil ich denke, dass es besser ist.

Dann müssen Sie in Ihrer TWIG Vorlage) nur {{ node_url_de }} Für Ihren deutschen Alias-Knotenlink drucken.

2
pbonnefoi