Score:0

ส่งภาษาปัจจุบันไปยังทวิกในบล็อกที่กำหนดเอง

ธง za

บล็อกโมดูลที่กำหนดเองของฉันโดยไม่มีแคช

<?php

เนมสเปซ Drupal\amu_social_icon\Plugin\Block;

ใช้ Drupal\Core\Block\BlockBase;

/**
 * ให้บล็อก 'ไอคอน'
 *
 * @ปิดกั้น(
 * id = "amu_social_icon_block",
 * admin_label = @Translation("บล็อกไอคอนโซเชียล"),
 * )
 */
คลาส IconBlock ขยาย BlockBase {

  /**
   * {@inheritdoc}
   */
  สร้างฟังก์ชั่นสาธารณะ () {
    $config = \Drupal::config('amu_social_icon.settings');
    กลับ [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#attached' => [
        'ห้องสมุด' => [
          'amu_social_icon/global-styling',
        ]
      ]
    ];
  }

  /**
   * @กลับ int
   */
  ฟังก์ชั่นสาธารณะ getCacheMaxAge () {
    กลับ 0;
  }
}

บริบทภาษาที่ฉันพยายามเพิ่มใน URL ภายใน

<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>

ฉันเข้าใจว่าตัวแปรที่ส่งโดย hook_theme นั้นคงที่ ดังนั้นฉันจึงพยายามแทนที่มันในบล็อกการประมวลผลล่วงหน้า

ฟังก์ชัน amu_social_icon_theme($existing, $type, $theme, $path) {
  กลับ [
    'amu_social_icon_block' => [
      'ตัวแปร' => [
        'icons' => null,
        'ภาษา' => \Drupal::languageManager()->getCurrentLanguage()->getId()
      ]
    ]
  ];
}

ฟังก์ชัน amu_social_icon_preprocess_block(&$vars) {
  ถ้า ($vars['plugin_id'] == 'amu_social_icon_block') {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $vars['ภาษา'] = $ภาษา;
  }
}

ไม่มีการทำงานเหล่านี้ ฉันต้องการล้างแคช drupal เพื่อที่

{{ การถ่ายโอนข้อมูล (ภาษา) }}

แสดงภาษาปัจจุบันที่ถูกต้อง

Score:3
ธง cn

ฉันเข้าใจว่าตัวแปรที่ส่งโดย hook_theme เป็นแบบคงที่

ได้ คุณสามารถถือว่าค่าเริ่มต้นที่กำหนดใน hook_theme เป็นค่าคงที่ ซึ่งจะถูกตั้งค่าเมื่อคุณติดตั้งโมดูล เพื่อช่วยให้นักพัฒนาสามารถล้างแคชได้ นอกจากนี้ยังล้างข้อมูลส่วนใหญ่ที่ติดตั้งโดยโมดูล ดังนั้นคุณไม่จำเป็นต้องติดตั้งโมดูลใหม่ตลอดเวลา แต่การดำเนินการนี้ไม่เกี่ยวข้องกับการเรนเดอร์แคช

ภาษา เป็นตัวแปรของธีมที่คุณกำหนดเอง ไม่ใช่ของบล็อก คุณไม่จำเป็นต้องใช้ hook การประมวลผลล่วงหน้า คุณสามารถเพิ่มโดยตรงไปยังการสร้างบล็อกที่มีเทมเพลตนี้:

  สร้างฟังก์ชั่นสาธารณะ () {
    กลับ [
      '#theme' => 'amu_social_icon_block',
      '#ภาษา' => $ภาษา,

การแคชภาษาปัจจุบันใช้งานได้ทันที นี่เป็นหนึ่งในสามบริบทเริ่มต้น อย่างไรก็ตาม คุณไม่สามารถดีบักการแคชด้วยเอาต์พุตดีบัก หลายครั้งที่คุณใช้งานแคช โดยให้บริการเนื้อหาจากแคช โดยไม่ได้รันโค้ดที่สร้างเนื้อหา

Matoeil avatar
za flag
สิ่งนี้ทำให้เกิดข้อผิดพลาดของผู้ใช้: "ภาษา" เป็นคีย์อาร์เรย์การแสดงผลที่ไม่ถูกต้องใน Drupal\Core\Render\Element::children() (บรรทัดที่ 97 ของ core/lib/Drupal/Core/Render/Element.php)
4uk4 avatar
cn flag
ฉันได้เพิ่มเครื่องหมาย `#` ก่อนชื่อตัวแปร
sonfd avatar
in flag
อาร์เรย์เรนเดอร์ทุกตัวแตกต่างกันไปตามภาษาโดยค่าเริ่มต้นหรือไม่ นั่นคือสิ่งที่คำตอบของคุณดูเหมือนจะบอกเป็นนัย เมื่อดูรหัสของ OP ดูเหมือนว่าบล็อกไม่ใช่เอนทิตีที่แปลจริง คุณไม่จำเป็นต้องเพิ่มบริบทแคชภาษาลงในบล็อกด้วยตนเองหรือ
4uk4 avatar
cn flag
@sonfd นี่เป็นกรณีสำหรับอาร์เรย์เรนเดอร์ทั้งหมด ดู https://drupal.stackexchange.com/questions/298480/how-do-i-specify-a-render-cache-context-as-universal
Matoeil avatar
za flag
ฉันได้ลอง '#language' => $language แล้ว แต่มันเป็นโมฆะ
Score:0
ธง za

ดูเหมือนว่าจำเป็นต้องใช้ค่าเริ่มต้นใน hook_theme

 */
ฟังก์ชัน amu_social_icon_theme($existing, $type, $theme, $path) {
  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
  กลับ [
    'amu_social_icon_block' => [
      'ตัวแปร' => [
        'icons' => null,
        'lang' => $ภาษา,
      ]
    ]
  ];
}

เช่นเดียวกับรายการ #cache ในวิธีการสร้างบล็อก

<?php

เนมสเปซ Drupal\amu_social_icon\Plugin\Block;

ใช้ Drupal\Core\Block\BlockBase;

/**
 * ให้บล็อก 'ไอคอน'
 *
 * @ปิดกั้น(
 * id = "amu_social_icon_block",
 * admin_label = @Translation("บล็อกไอคอนโซเชียล"),
 * )
 */
คลาส IconBlock ขยาย BlockBase {

  /**
   * {@inheritdoc}
   */
  สร้างฟังก์ชั่นสาธารณะ () {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $config = \Drupal::config('amu_social_icon.settings');
    กลับ [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#lang' => $ภาษา,
      '#แคช' => [
        'อายุสูงสุด' => 0,
      ]
      '#attached' => [
        'ห้องสมุด' => [
          'amu_social_icon/global-styling',
        ]
      ]
    ];
  }

  ฟังก์ชั่นสาธารณะ getCacheMaxAge () {
    กลับ 0;
  }
}
leymannx avatar
ne flag
ควรหลีกเลี่ยงการเรียก Drupal ในคลาส ให้ใส่การอ้างอิงแทน แต่นอกเหนือจากนั้น: ดี!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา