如何更改语言项链接? -- 8 领域 和 navigation 领域 和 theming 领域 drupal 相关 的问题

How do I alter a language item link?


7
vote

问题

中文

我正在寻找在某些情况下修改Drupal 8的默认输出,语言切换器。理想情况下,我希望能够在枝模板中做到这一点,不必生成 Massive PHP文件,overwwwrites整个链路生成系统并添加一个大如果需要覆盖的情况。

我认为输出布局应该在类似于这个答案(这个答案输出了每种语言的相同URL)

我正在使用引导作为基本主题,因此我想为我的链接使用Bootstrap标记(BTN BTN-Primary,Dropdown)

这是我的代码,我正在尝试制作 links--language-block.html.twig

  {%- if links|length == 2 -%}     {# show only alternate language button #}     {%- for key, item in links -%}         {%- if not item.attributes['#options']['set_active_class'] -%} {# <--- this is always true!? #}             <a href="{{ item.link['#url'] }}" class="btn btn-primary">{{ item.link['#title'] }}</a> {# #url is always the same what ever the language it is pointing to! #}         {%- endif -%}     {%- endfor -%} {%- elseif links|length > 2  -%}     {# show selected language in button and other languages in drop down #}     <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">{{ selectedLanguage }}<span class="caret"></span></button>     <ul class="dropdown-menu">         {% for key, item in links %}             {%- if not item.attributes['#options']['set_active_class'] -%} {# <--- this is always true!? #}             <li><a href="{{ item.link['#url'] }}">{{ item.link['#title'] }}</a></li>             {% endif %}         {% endfor %}     </ul> {%- endif -%}   

任何人都有一个关于如何做到这一点的想法?

英文原文

I am looking to modify the default output of Drupal 8 of links in a certain situation, the language switcher. Ideally I want to be able to do that in a twig template and not have to produce a massive php file that overwwrites that whole link generation system and add a BIG if for the cases I need to overwrite.

I think the output layout should be controllable in the twig template similar to this answer (this answer outputs the same url for every languages)

I am using bootstrap as a base theme so i'd like to use the bootstrap markup for my links (btn btn-primary, dropdown)

Here is my code I am trying to make links--language-block.html.twig

{%- if links|length == 2 -%}     {# show only alternate language button #}     {%- for key, item in links -%}         {%- if not item.attributes['#options']['set_active_class'] -%} {# <--- this is always true!? #}             <a href="{{ item.link['#url'] }}" class="btn btn-primary">{{ item.link['#title'] }}</a> {# #url is always the same what ever the language it is pointing to! #}         {%- endif -%}     {%- endfor -%} {%- elseif links|length > 2  -%}     {# show selected language in button and other languages in drop down #}     <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">{{ selectedLanguage }}<span class="caret"></span></button>     <ul class="dropdown-menu">         {% for key, item in links %}             {%- if not item.attributes['#options']['set_active_class'] -%} {# <--- this is always true!? #}             <li><a href="{{ item.link['#url'] }}">{{ item.link['#title'] }}</a></li>             {% endif %}         {% endfor %}     </ul> {%- endif -%} 

Anyone has an idea on how to do this?

        

回答列表

14
 
vote
vote
最佳答案
 
好的,我找到了两种方法来做。

1。在自定义主题

您可以在 my_theme.theme 文件中更改变量。您需要找出您需要的功能的名称。 EX: my_theme_preprocess_twig_file() ,在我的情况下,我需要 my_theme_preprocess_links__language_block() 你需要采取枝条文件名并替换所有 - _

my_theme.theme

  function my_theme_preprocess_links__language_block(&$variables) {   $currentLanguageCode = Drupal::languageManager()     ->getCurrentLanguage()     ->getId();   // replace key of active language with 'activeLink'   foreach ($variables['links'] as $i => $link) {     /** @var DrupallanguageEntityConfigurableLanguage $linkLanguage */     $linkLanguage = $link['link']['#options']['language'];     if ($currentLanguageCode == $linkLanguage->get('id')) {       $variables['links']['activeLink'] = $link;       unset($variables['links'][$i]);     }   }   // if there is only 2 languages remove active one   if (sizeof($variables['links']) == 2) {     unset($variables['links']['activeLink']);     // give class 'btn btn-primary' to alternate language     /** @var DrupalCoreUrl $alternate */     $alternate = current($variables['links']);     $alternate['link']['#options']['attributes']['class'][] = 'btn';     $alternate['link']['#options']['attributes']['class'][] = 'btn-primary';     $variables['links'] = [$alternate];   } }   

2。在自定义模块中

您还可以创建一个模块,该模块将更改相同的变量。变量的值有很大的差异,因为这种预处理在流程中早期发生。函数的名称也完全不同,例如: my_module_api_to_modify_alter() 。在我的情况下,我需要修改 language.api.php language_switch_links 。您可以通过搜索Drupal 8中搜索 my_theme_preprocess_twig_file()0 文件来找到所有更改功能。那些是作为究竟参考。

my_theme_preprocess_twig_file()1

  my_theme_preprocess_twig_file()2  

和我的骰子模板L my_theme_preprocess_twig_file()3

  my_theme_preprocess_twig_file()4  
 

Ok I found 2 ways to do that.

1. In a custom theme

You can alter variables in your my_theme.theme file. You need to figure out the name of the function you need. ex: my_theme_preprocess_twig_file(), in my case I needed my_theme_preprocess_links__language_block() You need to take the twig file name and replace all - for _.

my_theme.theme:

function my_theme_preprocess_links__language_block(&$variables) {   $currentLanguageCode = \Drupal::languageManager()     ->getCurrentLanguage()     ->getId();   // replace key of active language with 'activeLink'   foreach ($variables['links'] as $i => $link) {     /** @var \Drupal\language\Entity\ConfigurableLanguage $linkLanguage */     $linkLanguage = $link['link']['#options']['language'];     if ($currentLanguageCode == $linkLanguage->get('id')) {       $variables['links']['activeLink'] = $link;       unset($variables['links'][$i]);     }   }   // if there is only 2 languages remove active one   if (sizeof($variables['links']) == 2) {     unset($variables['links']['activeLink']);     // give class 'btn btn-primary' to alternate language     /** @var \Drupal\Core\Url $alternate */     $alternate = current($variables['links']);     $alternate['link']['#options']['attributes']['class'][] = 'btn';     $alternate['link']['#options']['attributes']['class'][] = 'btn-primary';     $variables['links'] = [$alternate];   } } 

2. In a custom module

You can also create a module that will change those same variables. There is a big difference in the values of the variables because this preprocess happened earlier in the flow. The name of the function is also quite different, ex: my_module_api_to_modify_alter(). In my case I needed to modify the language_switch_links from the language.api.php. You can find all alter function by searching for *.api.php files in drupal 8. Those are there as a reference for exactly that.

my_module.module:

function my_module_language_switch_links_alter(&$variables) {   $currentLanguageCode = \Drupal::languageManager()     ->getCurrentLanguage()     ->getId();   // replace key of active language with 'activeLink'   foreach ($variables as $i => $link) {     /** @var \Drupal\language\Entity\ConfigurableLanguage $linkLanguage */     $linkLanguage = $link['language'];     if ($currentLanguageCode == $linkLanguage->get('id')) {       $variables['activeLink'] = $link;       unset($variables[$i]);     }   }   // if there is only 2 languages remove active one   if (sizeof($variables) == 2) {     unset($variables['activeLink']);     // give class 'btn btn-primary' to alternate language     /** @var \Drupal\Core\Url $alternate */     $alternate = current($variables);     $alternate['attributes']['class'][] = 'btn';     $alternate['attributes']['class'][] = 'btn-primary';     $variables = [$alternate];   } } 

And my Twig template for both cases links--language-block.html.twig:

{% if links -%}     {%- if links|length == 1 -%}         {# show only alternate language button #}         {{ (links|first).link }}     {%- else -%}         {# show selected language in button and other languages in drop down #}         <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">{{ links['activeLink'].text }} <span class="caret"></span></button>         <ul class="dropdown-menu">             {% for key, item in links %}                 {% if key is not same as("activeLink") %}                 <li>{{ item.link }}</li>                 {% endif %}             {% endfor %}         </ul>     {%- endif -%} {%- endif %} 
 
 
1
 
vote

我做了这种调整语言切换器,以便当它找到具有类型文章的节点时,这不是一个不同的语言中的转换,它将改变链接成为主页。

这需要在模块中而不是主题。

我需要这个,因为我对每种语言翻译的文章数量的巨大差异。

  my_theme_preprocess_twig_file()5  

别忘了添加drupal core url的使用语句,并将其从函数参数中删除,它还​​用于新的路线生成。

还请注意,您必须使用新的生成的URL对象来更改URL,现有URL没有设置方法('<&lt; current&gt;')来更改它。

 

I made this adaption the language switcher so that when it finds a node with type article, and this is not a translation in a different langauge that it would change the link to be the homepage.

This needed to be made in a module rather than in the Theme.

I needed this as I had a massive difference in the number of translated articles per language.

function HOOK_language_switch_links_alter(array &$links, $type, \Drupal\Core\Url $url){ $currentLanguageCode = \Drupal::languageManager() ->getCurrentLanguage() ->getId(); // look at all links. foreach ($links as $link) {   // Only work on links that are not in the current page language.   $lang_id = $link['language']->get('id');   if ($currentLanguageCode != $lang_id) {     // Trying to get the node.     $node = \Drupal::request()->attributes->get('node');     // Making sure its an object and has the method getType and is Article.     if (!empty((object) $node)        && method_exists($node, 'getType')       && $node->getType() == 'article') {       //  We know its an article, checking for languages.       $flipped = array_flip(array_keys($node->getTranslationLanguages()));       // Using flipped array rather than in_array       if (!isset($flipped[$lang_id])) {         // Translation not available.         $links[$lang_id]['url'] = Url::fromRoute('<front>');       }     }   }  } } 

Don't forget to add the use statement for Drupal\Core\Url and remove it from the function arguments, its also used for the new route generation.

Also note that you have to use a new generated Url object to change the url, there is no set method for the existing url ('<current>') to change it.

 
 

相关问题

6  你如何在树枝上打印视图字段?  ( How do you print view fields on twig ) 
我有一个视图并将标题添加为字段。 例如:如何打印标题? 在Drupal 7中,它与一样简单 视图 - 视图 - 字段 - [ViewName] .tpl.php <?php print $fields["title"]->content; ?> 我们如何在drupal 8中这样做? 我已创建视图...

5  以编程方式删除锁定的字段  ( Delete locked fields programmatically ) 
我已将一个网站升级到drupal 8,我发现一个创建的字段,我需要删除该字段,因为它变得无用。 字段已锁定,这可以防止我从接口中删除它。 我试图使用 field_purge_field() ,但它也不工作。 如何正确删除字段,以编程方式?不适合我。 编辑: 我尝试了那段代码,但没有做任何事情 $field...

0  如何从内容类型迁移文件附件字段?  ( How do i migrate the file attachments field from a content type ) 
我的drupal 6站点有不同的内容类型,并且有一个文件附件字段添加到内容类型。迁移到Drupal 8.1时,此字段未迁移,但附加文件存在于文件目录中。在执行迁移时,显示Drupal 6中的"上载" 模块具有迁移路径,但它不会迁移。 如何将文件附件字段迁移到Drupal 8? ...

7  在不同地区显示节点的字段是最好的做法是什么?  ( Whats the best practice to show a nodes fields in different regions ) 
在D7中,我们用于为节点创建视图,每个字段都有自己的显示。每个显示器都会在站点的任何区域创建一个块。但当然,观点是SQL-rement。 现在,Drupal 8全部花哨。显示页面不同区域中的节点字段的Drupal 8方式是什么? 编辑:我当前的尝试是创建一个自定义模块,为每个指定的字段提供一个块。 ...

0  “目录网站/默认/文件不可写的错误  ( The directory sites default files is not writable error ) 
我正在尝试在Centos Linux机器上安装Drupal 8.1作为root用户。 我得到"目录网站/默认/文件不可写的。" 错误。在此之前,我必须手动创建 sites / default / files 文件夹。我甚至更改了"站点" 中的所有文件和文件夹及其子文件夹和"root" 的权限,并且是所有文件和文件夹/...

6  如何阅读yaml文件?  ( How can i read yaml files ) 
我一直在尝试弄清楚如何解码(也尝试编码)我的yml文件,所以我可以在php数组上完全控制。我试试这个... ,正如您所看到的,我没有收到YML文件中的信息。 我的问题是我做错了什么?为什么不向我展示 /core/modules/toolbar/toolbar.breakpoints.yml 文件中的信息? 这...

6  如何获得UNIX时间戳?  ( How do i get the unix timestamp ) 
我想使用 format_date() ,但它需要一个UNIX时间戳,我的日期是ISO。 是否有一个Drupal Date将ISO日期转换为UNIX时间戳?如果我使用strtotime,我丢失了我的时区偏移量。 ...

18  如何更改基本URL?  ( How do i change the base url ) 
在Drupal 7中,我们可以快速更改网站的基础URL。 Drupal 8如何这样做? ...

0  与外部二进制程序的Drupal集成转换图像?  ( Drupal integration with external binary program to convert an image ) 
使用Drupal 8.在基于云的站点上,我有一个程序,用于将图像转换为有时运行时间几个小时的SVG。我可以轻松运行外部二进制程序(配置为以CommandLine运行Java)。最后我有程序吐出了相关文件。我需要用Drupal融合这个,我想知道最好的程序。 我用什么来抓住图像并在磁盘上有实际文件?每当此程序完成时,如何...

1  如何使用多重/表单数据上传图像文件?  ( How can i upload an image file using multipart form data ) 
我想在Drupal 8中使用REST API发送图像文件以及注册表。我建立了一个自定义API以保存注册表。 对于文件,我创建了另一个API,以使用标题内容类型保存数据:Multipart / Form-Data并在保存后使用文件ID更新注册表单。 当我使用邮递员Chrome扩展发送文件来检查API时,我不会在我的控制...

6  为什么不“苏打所有人”的工作?  ( Why doesnt drush cc all work ) 
我安装醉酒,但我猜,大多数命令都不工作。我尝试了 drush cc all 并得到以下输出: 命令缓存清除需要一个更高的引导级别来运行 - 您将需要从更常用的Drupal环境中的调用侦听来运行此命令。 无法执行DRUSH命令'CC所有'。 找不到一个Drupal安装目录 drush status 输出...

2  在编辑后,缓存仍然为自定义块陈旧  ( Cache remains stale for custom blocks after editing ) 
我的drupal 8网站由从Drupal后端用户界面创建的多个自定义块组成。 当我从dev到生产设置和激活 Internal Dynamic Page Cache (设置为1分钟),在编辑后,自定义块内容不会在实际站点上更改(对于匿名和经过身份验证的用户) 。如果我返回编辑模式,更改将按预期持久。 当我清除缓存时,更...

28  如何根据当前节点正确地正确设置CATION块的CACHING,显示内容?  ( How do i correctly setup caching for my custom block showing content depending o ) 
我有这个非常基本的块,只会显示当前节点的ID。 <?php /** * @file * Contains DrupalmymodulePluginBlockExampleEmptyBlock. */ namespace DrupalmymodulePluginBlock; use DrupalCore...

7  如何加载节点创建或编辑表单?  ( How do i load the node create or edit form ) 
要加载我使用以下代码的登录表单。 $form = Drupal::formBuilder()->getForm('DrupaluserFormUserLoginForm'); 我想加载表单以创建或编辑节点。我如何实现这一目标? ...

16  如何从节点对象获取节点类型标签?  ( How do i get the node type label from a node object ) 
我正在尝试从Drupal 8中的节点对象获取节点的捆绑标签(节点类型标签)。 这是作品,但似乎长时间: $node_type = Drupal::entityManager()->getStorage('node_type')->load($node->getType())->get('name'); 是否...

1  drupal 8视图 - 获取URL字段  ( Drupal 8 view get url field ) 
如何获取URL,而不是我视图中分类字段的链接HTML。 对于Drupal 7我发现了这张票: 如何获得原始URL作为视图中的字段? 此提到获取内容:路径 - 但这并没有显示为选项。 ---更新--- 我正在创建一个块视图,不确定很重要。我没有路径选项,我实际上没有看到字段类型选项中的任何内容。 ...

4  是否有等同于template_preprocess_search_results()的东西?  ( Is there something equivalent to template preprocess search results ) 
我刚刚意识到template_preprocess_search_results()函数已在Drupal 8中遗漏出于某些原因,虽然 template_preprocess_search_result() (用于单个结果)仍然存在。 我需要能够在渲染之前操纵搜索结果,因为我将在drupal 7中的 template_...

5  GIF动画和响应图像样式不起作用  ( Gif animation and responsive image styles are not working ) 
我有一个多映像字段,需要它来上传图像和动画GIF。这些图像可能被调整大小。发生这种情况时,动画的GIF会失去动画。 有没有人在Drupal 8中解决了这个问题? ...

0  如何添加媒体图像字段?  ( How do i add a media image field ) 
我已安装这些模块: 媒体实体 媒体实体图像 实体浏览器 当我尝试添加图像字段时,我没有Drupal 7中的媒体没有小部件。 我也试图向媒体添加引用,但它似乎没有工作。 我做错了什么? ...

1  主题形式。形状元素  ( Theming forms form element ) 
请,帮助。是否可能为form-compent.html.twig实现不同的模板? for表单"用户形式" 一个模板,以及其他形式的第二模板。 ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.