web-dev-qa-db-ja.com

小枝で言語固有のパスを取得するにはどうすればよいですか?

twigテンプレートでは、{{ path('entity.node.edit_form', {'node': nid }) }}を使用して相対パスを取得できます。パスは現在の言語になります。

次に、特定の言語でパスを取得する必要があります。 {{ path('entity.node.edit_form', {'node': nid }, {'language': langcode}) }}を使用できると思いましたが、langcodeDEのような文字列に設定すると、エラーが発生します。 api docs によると、languageは言語オブジェクトである必要があります。小枝でこれをどのように達成できますか?

4
Philipp Michael

twigソリューションのみの場合、カスタムtwig function path_lang()を定義できます。これにより、言語コードが追加パラメーターとして提供されます:

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 }

小枝で:

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

言語コードだけでなく言語オブジェクトも必要だと思うので、これは機能しません。

これを行う最良の方法は、yourtheme.themeファイルのTHEME_preprocess_nodeで行うことだと思います。

解決策1(ノードの翻訳を取得してから適切なリンクを取得):

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

解決策2(ノードのurlオブジェクトを取得してから、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();
}
_

$vars['node_url'] = $node->toUrl()->toString();の代わりに{{ path('entity.node.edit_form', {'node': nid }) }}を使用して_{{ node_url }}_を出力しますが、それが良いと思います。

次に、TWIGテンプレートで、エイリアスされたドイツ語ノードリンクに対して_{{ node_url_de }}_を印刷する必要があります。

2
pbonnefoi