twigテンプレートでは、{{ path('entity.node.edit_form', {'node': nid }) }}
を使用して相対パスを取得できます。パスは現在の言語になります。
次に、特定の言語でパスを取得する必要があります。 {{ path('entity.node.edit_form', {'node': nid }, {'language': langcode}) }}
を使用できると思いましたが、langcode
をDE
のような文字列に設定すると、エラーが発生します。 api docs によると、language
は言語オブジェクトである必要があります。小枝でこれをどのように達成できますか?
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') }}
言語コードだけでなく言語オブジェクトも必要だと思うので、これは機能しません。
これを行う最良の方法は、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 }}
_を印刷する必要があります。