Điểm:0

Chuyển ngôn ngữ hiện tại sang twig trên các khối tùy chỉnh

lá cờ za

khối mô-đun tùy chỉnh của tôi, được cho là không có bộ đệm

<?php

không gian tên Drupal\amu_social_icon\Plugin\Block;

sử dụng Drupal\Core\Block\BlockBase;

/**
 * Cung cấp Khối 'Biểu tượng'
 *
 * @Chặn(
 * id = "amu_social_icon_block",
 * admin_label = @Translation("Khối biểu tượng xã hội"),
 * )
 */
lớp IconBlock mở rộng BlockBase {

  /**
   * {@inheritdoc}
   */
  xây dựng chức năng công cộng () {
    $config = \Drupal::config('amu_social_icon.settings');
    trở lại [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#đính kèm' => [
        'thư viện' => [
          'amu_social_icon/kiểu dáng toàn cầu',
        ],
      ],
    ];
  }

  /**
   * @return int
   */
  hàm công khai getCacheMaxAge() {
    trả về 0;
  }
}

bối cảnh ngôn ngữ tôi đang cố gắng thêm vào các url nội bộ

<ul class="social-icon menu socialicon-nav">
      {{ dump(language) }}
  {% for icon in icons %}
    {% if icon.url is not empty %}
          {% if icon.url starts with '/' %}
                <li><a href="/{{ language }}{{ icon.url }}" aria-label="{{ icon.aria_label }}"><i aria-hidden="true" class="{{ icon.icon }}"></i></a></li>
          {% else %}
                   <li><a href="{{ icon.url }}" aria-label="{{ icon.aria_label }}"><i aria-hidden="true" class="{{ icon.icon }}"></i></a></li>
    {% endif %}
      {% endif %}
  {% endfor %}
</ul>

tôi hiểu biến được truyền bởi hook_theme là tĩnh nên tôi đã cố gắng ghi đè lên nó trên khối tiền xử lý

function amu_social_icon_theme($current, $type, $theme, $path) {
  trở lại [
    'amu_social_icon_block' => [
      'biến' => [
        'biểu tượng' => không,
        'ngôn ngữ' => \Drupal::languageManager()->getCurrentLanguage()->getId()
      ],
    ],
  ];
}

function amu_social_icon_pre process_block(&$vars) {
  if ($vars['plugin_id'] == 'amu_social_icon_block') {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $vars['language'] = $language;
  }
}

Không có cái nào trong số này hoạt động. Tôi cần làm trống bộ đệm drupal để

{{ kết xuất(ngôn ngữ) }}

hiển thị đúng ngôn ngữ hiện tại

Điểm:3
lá cờ cn

Tôi hiểu biến được truyền bởi hook_theme là tĩnh

Có, bạn có thể coi các giá trị mặc định được xác định trong hook_theme là tĩnh, chúng được đặt khi bạn cài đặt mô-đun. Để giúp các nhà phát triển xóa bộ nhớ cache cũng xóa hầu hết mọi thứ được cài đặt bởi các mô-đun, do đó bạn không cần phải cài đặt lại mô-đun mọi lúc, nhưng điều này không liên quan gì đến kết xuất bộ nhớ đệm.

ngôn ngữ là một biến của chủ đề tùy chỉnh của bạn, không phải của khối. Sau đó, bạn không cần hook tiền xử lý, bạn có thể thêm nó trực tiếp vào bản dựng khối chứa mẫu này:

  xây dựng chức năng công cộng () {
    trở lại [
      '#theme' => 'amu_social_icon_block',
      '#ngôn ngữ' => $ngôn ngữ,

Bộ nhớ đệm của ngôn ngữ hiện tại hoạt động vượt trội. Đây là một trong ba bối cảnh mặc định. Tuy nhiên, bạn không thể gỡ lỗi bộ nhớ đệm bằng đầu ra gỡ lỗi. Hầu hết các lần bạn gặp phải lần truy cập vào bộ nhớ cache, phân phát nội dung từ bộ nhớ cache mà không cần chạy mã xây dựng nội dung.

Matoeil avatar
lá cờ za
điều này gây ra Lỗi người dùng: "ngôn ngữ" là khóa mảng kết xuất không hợp lệ trong Drupal\Core\Render\Element::children() (dòng 97 của core/lib/Drupal/Core/Render/Element.php).
4uk4 avatar
lá cờ cn
Tôi đã thêm dấu `#` trước tên biến .
sonfd avatar
lá cờ in
Có phải mọi mảng kết xuất khác nhau theo ngôn ngữ theo mặc định không? Đó là những gì câu trả lời của bạn dường như ngụ ý. Nhìn vào mã của OP, có vẻ như khối đó không thực sự là một thực thể được dịch. Bạn có cần thêm ngữ cảnh bộ đệm ngôn ngữ vào khối theo cách thủ công không?
4uk4 avatar
lá cờ cn
@sonfd, ngoài hộp, đây là trường hợp cho tất cả các mảng kết xuất. Xem https://drupal.stackexchange.com/questions/298480/how-do-i-specify-a-render-cache-context-as-universal
Matoeil avatar
lá cờ za
tôi đã thử '#language' => $language nhưng không được
Điểm:0
lá cờ za

một giá trị mặc định dường như là cần thiết trong hook_theme

 */
function amu_social_icon_theme($current, $type, $theme, $path) {
  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
  trở lại [
    'amu_social_icon_block' => [
      'biến' => [
        'biểu tượng' => không,
        'lang' => $ngôn ngữ,
      ],
    ],
  ];
}

cũng như mục #cache trong phương thức tạo khối

<?php

không gian tên Drupal\amu_social_icon\Plugin\Block;

sử dụng Drupal\Core\Block\BlockBase;

/**
 * Cung cấp Khối 'Biểu tượng'
 *
 * @Chặn(
 * id = "amu_social_icon_block",
 * admin_label = @Translation("Khối biểu tượng xã hội"),
 * )
 */
lớp IconBlock mở rộng BlockBase {

  /**
   * {@inheritdoc}
   */
  xây dựng chức năng công cộng () {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $config = \Drupal::config('amu_social_icon.settings');
    trở lại [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#lang' => $ngôn ngữ,
      '#cache' => [
        'tuổi tối đa' => 0,
      ],
      '#đính kèm' => [
        'thư viện' => [
          'amu_social_icon/kiểu dáng toàn cầu',
        ],
      ],
    ];
  }

  hàm công khai getCacheMaxAge() {
    trả về 0;
  }
}
leymannx avatar
lá cờ ne
Nên tránh các cuộc gọi Drupal trong lớp, thay vào đó hãy thêm các phụ thuộc. Nhưng bên cạnh đó: tốt đẹp!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.