Làm cách nào để thay đổi liên kết mục ngôn ngữ?


7

Tôi đang tìm cách sửa đổi đầu ra mặc định của Drupal 8 của các liên kết trong một tình huống nhất định, trình chuyển đổi ngôn ngữ. Lý tưởng nhất là tôi muốn có thể làm điều đó trong một mẫu twig và không phải tạo ra một tệp php lớn bao trùm toàn bộ hệ thống tạo liên kết và thêm LỚN nếu trong trường hợp tôi cần ghi đè.

Tôi nghĩ rằng bố cục đầu ra phải được kiểm soát trong mẫu twig tương tự câu trả lời này (câu trả lời này xuất ra cùng một url cho mọi ngôn ngữ)

Tôi đang sử dụng bootstrap làm chủ đề cơ bản vì vậy tôi muốn sử dụng đánh dấu bootstrap cho các liên kết của mình (btn btn-sơ cấp, thả xuống)

Đây là mã của tôi, tôi đang cố gắng thực hiện 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 -%}

Bất cứ ai cũng có một ý tưởng về cách làm điều này?

Câu trả lời:


13

Ok tôi tìm thấy 2 cách để làm điều đó.

1. Trong một chủ đề tùy chỉnh

Bạn có thể thay đổi các biến trong my_theme.themetập tin của bạn . Bạn cần tìm ra tên của chức năng bạn cần. ví dụ : my_theme_preprocess_twig_file(), trong trường hợp của tôi, tôi cần my_theme_preprocess_links__language_block()Bạn cần lấy tên tệp twig và thay thế tất cả -cho _.

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. Trong một mô-đun tùy chỉnh

Bạn cũng có thể tạo một mô-đun sẽ thay đổi các biến tương tự. Có một sự khác biệt lớn trong các giá trị của các biến vì tiền xử lý này đã xảy ra trước đó trong luồng. Tên của hàm cũng khá khác nhau, ví dụ : my_module_api_to_modify_alter(). Trong trường hợp của tôi, tôi cần phải sửa đổi language_switch_linkstừ language.api.php. Bạn có thể tìm thấy tất cả các chức năng thay đổi bằng cách tìm kiếm *.api.phpcác tệp trong drupal 8. Chúng có ở đó như một tài liệu tham khảo cho chính xác điều đó.

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

Và mẫu Twig của tôi cho cả hai trường hợp l inks--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

Tôi đã thực hiện điều chỉnh này trình chuyển đổi ngôn ngữ để khi nó tìm thấy một nút có loại bài viết và đây không phải là bản dịch trong một ngôn ngữ khác mà nó sẽ thay đổi liên kết thành trang chủ.

Điều này cần phải được thực hiện trong một mô-đun chứ không phải trong Chủ đề.

Tôi cần điều này vì tôi có sự khác biệt lớn về số lượng bài báo được dịch trên mỗi ngôn ngữ.

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

Đừng quên thêm câu lệnh sử dụng cho Drupal \ Core \ Url và xóa nó khỏi các đối số chức năng, nó cũng được sử dụng để tạo tuyến đường mới.

Cũng lưu ý rằng bạn phải sử dụng một đối tượng Url mới được tạo để thay đổi url, không có phương thức thiết lập nào cho url hiện tại ('<current>') để thay đổi nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.