Score:0

แสดงป้ายกำกับฟิลด์ (ไม่ใช่คีย์) เป็นชื่อหน้ามุมมองในตัวกรองตามบริบท

ธง gu

ต่อจากคำถามเหล่านี้:

ฉันมีเงื่อนไขอนุกรมวิธานของเกมและมุมมองที่เป็นตัวแทนแต่ละเกมมีฟิลด์ให้เลือกประเภทหนึ่งที่เรียกว่า "ประเภท" โดยมีรูปแบบเป็น "คีย์|ป้ายกำกับ" มี 16 ประเภทที่เก็บไว้เช่นนั้น (ภาษาเริ่มต้นคือรัสเซีย):

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นฉันได้กำหนดค่ามุมมองของฉัน ตัวกรองบริบท แบบนี้:

ป้อนคำอธิบายรูปภาพที่นี่

พยายามด้วย "ค่า RAW จาก URL" - ไม่มีการเปลี่ยนแปลง.

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

และทำงานได้ดีกับตัวกรองที่เปิดเผยเช่นเดียวกับการเข้าถึง URL เช่น /เกม/2 หรือ /เกม/13. แต่จะแสดงชื่อหน้าเป็นฟิลด์ KEY เป็นตัวเลข

สิ่งที่ฉันต้องการทำคือส่งออก LABEL ที่สอดคล้องกัน

ในทางทฤษฎีฉันสามารถใช้ค่าในฟิลด์นี้ได้ แต่จะมีปัญหาอีกสองข้อ:

  1. ฉันไม่สามารถเปลี่ยนตัวเลือกพื้นที่เก็บข้อมูลของฟิลด์ได้โดยไม่สูญเสียข้อมูลปัจจุบัน
  2. ประเภทเป็นภาษารัสเซีย ดังนั้นจะมีปัญหา URL เช่นนี้ - .../?field_genre_value=%D0%90+%D1%8D%D1%82%D0%BE+%D1%82%D1%80%D0%B5%D1%82%D0%B8%D0%B9

มีวิธีแก้ปัญหานี้หรือไม่?

Score:0
ธง gu

ในที่สุดก็คิดออก! โพสต์คำตอบของฉันสำหรับคนรุ่นต่อไป

ทั้งหมดที่เราต้องการคือ YOUR_TEMPLATE.theme ไฟล์สำหรับสิ่งนี้

ด้านล่างนี้เป็นรหัสของฉันพร้อมความคิดเห็น มันอาจจะไม่สมบูรณ์ ดังนั้นถ้าใครจะแก้ไขบางอย่างฉันจะขอบคุณที่

ใช้ \Drupal\views\ViewExecutable;

// เปลี่ยนชื่อมุมมอง มันไม่เปลี่ยนแท็ก HEAD <title>!
ฟังก์ชัน YOUR_THEME_NAME_views_pre_render(ViewExecutable $view) 
{
  // checkRoute() และ checkArg() เป็นฟังก์ชันแบบกำหนดเองและอธิบายไว้ด้านล่าง
  ถ้า (checkRoute ('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg ())
  {
    // สิ่งนี้เปลี่ยนชื่อมุมมอง รวมทั้งตั้งค่า $variables['page']['#title'] เป็นค่าเดียวกัน
    // gamesGenreTitle() เป็นฟังก์ชันแบบกำหนดเองและอธิบายไว้ด้านล่าง
    $view->setTitle(gamesGenreTitle($view->args[0]));
  }
}

// ที่นี่เราสามารถเปลี่ยน HEAD <title>
ฟังก์ชัน YOUR_THEME_NAME_preprocess_html(&$ตัวแปร)
{
  // checkRoute() และ checkArg() เป็นฟังก์ชันแบบกำหนดเองและอธิบายไว้ด้านล่าง
  ถ้า (checkRoute('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg() && isset($variables['head_title'])) 
  {

    // ชิ้นที่ไม่จำเป็น โทเค็นจำเป็นสำหรับจุดประสงค์ของฉัน
    $token = Drupal::token();

    // $variables['page']['#title'] ถูกเปลี่ยนใน views_pre_render() ดังนั้นเราจึงสามารถเปลี่ยน HEAD <title>
    // ฉันใช้โทเค็น [current-page:page-number] เพื่อทำให้ชื่อไม่ซ้ำใคร
    // เพื่อปรับปรุงสิ่งนี้ เราสามารถเพิ่มตรรกะเพื่อรวมหมายเลขหน้าปัจจุบันเฉพาะในกรณีที่มีมากกว่า 1 หน้า
    $variables['head_title'] = $variables['page']['#title'] " | หน้า " . $token->replace('[หน้าปัจจุบัน:หมายเลขหน้า]');
  }
}

// ในกรณีที่คุณใช้ชื่อหน้าปัจจุบันใน breadcrumbs อาจต้องการเปลี่ยนด้วย
ฟังก์ชัน YOUR_THEME_NAME_preprocess_breadcrumb(&$variables)
{
  // checkRoute() และ checkArg() เป็นฟังก์ชันแบบกำหนดเองและอธิบายไว้ด้านล่าง
  if(checkRoute('view.VIEW_ID.VIEW_DISPLAY_ID') && checkArg() && isset($variables['breadcrumb']['2']['text']))
  {
    // คุณอาจต้องการ var_dump($variables) ก่อนที่จะทำเคล็ดลับนี้เพื่อค้นหาชิ้นส่วนของ breadcrumb
    $variables['breadcrumb']['2']['text'] = gamesGenreTitle(getArg_0());
  }
}

// รับค่าที่อนุญาตของฟิลด์ (ป้ายกำกับ) ที่ใช้เพื่อสร้างชื่อ
ฟังก์ชั่นเกมประเภทชื่อเรื่อง($val)
{
  $options = options_allowed_values(\Drupal::service('entity_field.manager')->getFieldStorageDefinitions('taxonomy_term')['field_NAME']);

  // ตรวจสอบว่าเราส่งข้อมูลถูกต้องหรือไม่
  ถ้า(is_numeric($val) && $val <= จำนวน($ตัวเลือก))
  {
    ส่งคืน $option[$val];
  }
}

// ตรวจสอบว่ามีการตั้งค่าอาร์กิวเมนต์และตัวเลขที่จำเป็นหรือไม่
ฟังก์ชัน checkArg()
{
  $arg = Drupal::routeMatch()->getParameter('arg_0');
  // ในกรณีของฉัน อาร์กิวเมนต์จากการดูถูกส่งผ่านไปยัง arg_0
  // อาจแตกต่างกันไป ดังนั้นลอง var_dump($arg) หรือ ksm($arg) เพื่อตรวจสอบว่าเป็นสิ่งที่คุณต้องการหรือไม่

  ส่งคืน isset($arg) && is_numeric($arg);
}

// ตรวจสอบเส้นทางปัจจุบัน เราต้องการมุมมองและการแสดงผลที่แน่นอน มิฉะนั้น ชื่อเรื่องจะถูกเปลี่ยนในทุกหน้า
ฟังก์ชัน checkRoute($check)
{
  $route = \Drupal::routeMatch()->getRouteName();
  ส่งคืน $route == $check;
}

// รับข้อโต้แย้ง ส่งผ่านไปยังมุมมอง
ฟังก์ชัน getArg_0()
{
  // และอีกครั้ง arg_0 อาจไม่ใช่อาร์กิวเมนต์ของคุณ ตรวจสอบอีกครั้งด้วย var_dump() หรือ ksm()
  ส่งคืน Drupal::routeMatch()->getParameter('arg_0');
}

และอีกวิธีหนึ่ง หากคุณไม่มีป้ายกำกับฟิลด์จำนวนมาก คุณสามารถใช้สิ่งนี้ในฟิลด์แทนที่ชื่อมุมมอง (รองรับ twig):

{% if arguments.field_NAME_value == 1 %} ชื่อของคุณ 1 {% elseif arguments.field_NAME_value == 2 %} ชื่อของคุณ 2 {% endif %}

หวังว่านี่จะช่วยใครซักคน!

โพสต์คำตอบ

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