web-dev-qa-db-fra.com

Comment obtenir un chemin spécifique à une langue dans Twig?

Dans un modèle twig vous pouvez obtenir un chemin relatif en utilisant {{ path('entity.node.edit_form', {'node': nid }) }}. Le chemin sera dans la langue courante.

Maintenant, je dois obtenir le chemin dans un langage spécifique. Je pensais pouvoir utiliser {{ path('entity.node.edit_form', {'node': nid }, {'language': langcode}) }} mais cela entraîne une erreur si je définissais langcode sur une chaîne comme DE. Selon le api docslanguage doit être un objet langage. Comment puis-je accomplir cela en brindille?

4
Philipp Michael

Pour une solution twig only), vous pouvez définir une fonction twig function path_lang() personnalisée, qui ajoute l'objet langage aux options, si un code de langue est fourni comme paramètre supplémentaire:

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 }

En brindille:

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

Cela ne fonctionnera pas car je pense que vous avez besoin de l'objet langage et pas seulement du langcode.

La meilleure façon de le faire, je pense que c'est de le faire dans un nœud THEME_preprocess_node dans votre fichier yourtheme.theme:

SOLUTION 1 (obtenez la traduction du nœud puis obtenez le lien approprié):

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;
    }
}

SOLUTION 2 (récupérez l'objet url du nœud puis obtenez la traduction de l'objet url):

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();
}

Bien que je mette $vars['node_url'] = $node->toUrl()->toString(); pour imprimer {{ node_url }} Au lieu de {{ path('entity.node.edit_form', {'node': nid }) }} parce que je pense que c'est mieux.

Ensuite, dans votre modèle TWIG, il vous suffit d'imprimer {{ node_url_de }} Pour votre lien de nœud allemand alias.

2
pbonnefoi