รับเส้นทางไปยังเนื้อหาชุดรูปแบบในแม่แบบ Twig


22

ฉันมีคำถามเกี่ยวกับการหาเส้นทางไปยังรูปภาพในเทมเพลต Twig รูปภาพไม่ได้ถูกกำหนดให้กับเขตข้อมูลหรือบางสิ่ง เพียงแค่ภาพนิ่งที่ถูกเก็บไว้ใน "MYTHEME / image / icon / my-icon.png"

ใน Drupal 7 ฉันได้รับเส้นทางใน node.template ของฉันด้วยรหัสต่อไปนี้:

<img src="<?php print base_path() . path_to_theme(); ?>/image/icons">/my-icon.png

มันทำงานร่วมกับใน Drupal 8 ได้อย่างไร template_preprocess_node()ผมพยายามที่จะส่งผ่านตัวแปรใน

MYTHEME.theme:

$variables['images_path'] = \Drupal::theme()->getActiveTheme()->getPath() . '/image/';

แม่แบบกิ่งไม้:

<img src="{{ images_path  ~ 'icons/' ~ 'my-icon.png' }}">

มันไม่ทำงาน ไม่มีข้อผิดพลาด PHP เป็น แต่เส้นทางถูกผิดบอกว่าจะเป็นhttp: //localhost/node/themes/template/image/icons/my-icon.png


"เส้นทางไม่ถูกต้อง" - ไม่เป็นประโยชน์มาก :) นอกจากนี้คุณควรดำเนินการประมวลผลล่วงหน้าในไฟล์ธีมของชุดรูปแบบไม่ได้อยู่ในฟังก์ชั่น tmeplate_preprocess_hook ส่วนกลางและคุณควรใช้ drupal_get_path

@ user21641 drupal_get_pathสำหรับ D7 :)
Chapabu

1
สำหรับ8 คนด้วย @Chapabu ...
Clive

เป่าฉันด้วยขนนก! ทำให้สีถูกต้องแล้ว :)
Chapabu

มันก็มีไว้สำหรับ D8 เช่นกัน ฉันใช้มันแบบนี้:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

คำตอบ:


51

คุณสามารถใช้{{ base_path ~ directory }}ซึ่งจะแก้ไขปัญหาที่แน่นอนไม่จำเป็นต้องทำการประมวลผลล่วงหน้าใด ๆ ทั้งสองตัวแปรเหล่านี้จะรวมอยู่ในแกน

ตัวอย่างเช่น

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

PS ~ผู้ช่วยในกิ่งมี concatenate

แก้ไข: อย่างน้อยในหน้า * .html.twig รวมตัวแปร base_path เป็นไปได้ว่าคุณจะต้องทำการประมวลผลล่วงหน้าสำหรับแม่แบบอื่น ๆ คุณสามารถตรวจสอบได้อย่างง่ายดาย{{ dump() }}ว่ามีตัวแปรอยู่หรือไม่

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}

3
ขอบคุณสำหรับการแบ่งปันการแก้ปัญหาของคุณ. หนึ่งความคิดเห็นอย่างรวดเร็ว: ฉันต้องเพิ่มตัวแปร $ ['base_path'] = base_path (); ไปที่ THEME_preprocess_html theme hook ของฉันเพื่อให้สามารถใช้ได้กับไฟล์เทมเพลต html.html.twig
Marcos Buarque

1
ระวังเกี่ยวกับการใช้{{ directory }}ตัวแปร Twig ในชุดรูปแบบที่คุณตั้งใจจะใช้เป็นชุดรูปแบบพื้นฐานและสร้างชุดรูปแบบย่อยสำหรับ: drupal.stackexchange.com/questions/277278
JamesWilson

1
ข้อเสนอแนะกิ่งแม่แบบโมดูลให้{{ base_bath }}ทุกเทมเพลต; มิฉะนั้นสำหรับเทมเพลตบางตัวที่คุณต้องทำอย่างที่ Marcos Buarque ทำในความคิดเห็นข้างต้นหรือ Matoeil ทำในdrupal.stackexchange.com/a/238535/4195
mlncn

9

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

ดังนั้นคุณต้องเพิ่ม a / ข้างหน้ามัน สิ่งนี้จะแตกถ้าติดตั้ง Drupal ในโฟลเดอร์ย่อย คุณสามารถ hardcode นั้นในเทมเพลตของคุณหรือใช้ต่อไปbase_path()ตามที่คุณทำใน 7.x ในตัวแปรที่กำหนดเอง


วิธีการใช้ภาพจาก/sites/default/files/MyFolder? ฉันมีรูปภาพ MyImage.jpg ใน MyFolder ตอนนี้ในแม่แบบกิ่งไม้ถ้าฉันเขียนที่<img src={{ url }} alt={{ text }}>นี่ตัวแปร url มีเส้นทาง /MyFolder/MyImage.jpg แต่มันไม่ทำงาน
Jasodeep Chatterjee

2
ดังที่ Berdir เขียนไว้: เราสามารถใช้<img src="/{{ directory }}/path/to/image"/>เพื่อหาเส้นทางที่สมบูรณ์
daniels

7
<img src="/{{ directory }}/images/logo.png"/> 

ทำงานให้ฉันเมื่อ

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

ไม่ได้

สำหรับเทมเพลตเนื้อหาฉันต้องใช้ใน. โมดูล

   function hook_preprocess(&$variables, $hook) {

  $module_handler = Drupal::service('module_handler');
  $path = $module_handler->getModule('myModuleName')->getPath();

  if(isset($variables['region']) && $variables['region'] == 'content'){
    $variables['module_path'] = $path;
    $variables['http_host'] = $_SERVER['HTTP_HOST'];

และ

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />

3
คำตอบนี้ควรทำเครื่องหมายว่าถูกต้องแทน
Jignesh Rawal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.