ฉันจะสร้างลิงค์ได้อย่างไร


26

สมมติว่าฉันกำลังขยายblockBaseคลาสเพื่อสร้างบล็อกที่กำหนดเองและฉันกำลังใช้blockBuildวิธีในการสร้างมาร์กอัปสำหรับบล็อกของฉัน บางสิ่งเช่นนี้

 class YourModuleBlock extends BlockBase {

   /**
     * Implements \Drupal\block\BlockBase::blockBuild().
     */
     public function build() {
      return array(
        '#markup' => 'This is a block!',
      );
     }
   }

หากฉันต้องการให้ลิงค์ในมาร์กอัปนี้ใน D7 ฉันจะใช้lฟังก์ชั่นนี้ แต่ไม่สามารถใช้งานได้อีกต่อไป ( ดูที่นี่ ) ดังนั้นฉันต้องทำให้มีวิธี D8 ใหม่สำหรับการสร้างลิงก์ ฉันสามารถใช้<a>แท็กได้ แต่นี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุดใน D7

ดังนั้นวิธีการที่ถูกต้องที่จะใช้สำหรับการสร้างลิงค์คืออะไรและฉันจะทำให้มันพร้อมใช้งานในฟังก์ชั่นของฉันได้อย่างไร?


กรุณาตรวจสอบลิงค์ด้านล่างซึ่งมีตัวอย่างทุกประเภทเพื่อสร้างลิงค์ใน drupal 8 gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
Swapnil Bijwe

คำตอบ:


56

\ Drupal :: l เลิกใช้แล้ว บางทีกรณีนี้จะเป็นประโยชน์สำหรับใครบางคน

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  $url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
  $project_link = Link::fromTextAndUrl(t('Open Project'), $url);
  $project_link = $project_link->toRenderable();
  // If you need some attributes.
  $project_link['#attributes'] = array('class' => array('button', 'button-action', 'button--primary', 'button--small'));
  print render($project_link);

2
นี้toRenderable()เคล็ดลับคือมีประโยชน์มากขอบคุณ!
Nic

ยังคงใช้งานได้กับ Drupal 8.4 core
podarok

Brah คุณช่วยชีวิตฉันด้วยอันนี้ฉันยังใหม่กับ Drupal และสามารถหาวิธีเปลี่ยนคอลัมน์ชื่อโมดูลของกลุ่มเพื่อชี้ไปยังโหนดได้ด้วยสิ่งนี้!
Mike Q

24

หนึ่งนี้ยังไม่เสร็จสมบูรณ์ 100% ดูปัญหานี้ จากที่กล่าวไว้ให้ฉันเสนอราคารหัสบางส่วนจากการแจ้งการเปลี่ยนแปลง :

Drupal 7:

// Internal path.
$internal_link = l(t('Book admin'), 'admin/structure/book');

// External Uri.
$external_link = l(t('External link'), 'http://www.example.com/', array('external' => TRUE));

Drupal 8:

// Internal path (defined by a route in Drupal 8).
use Drupal\Core\Url;
$url = Url::fromRoute('book.admin');
$internal_link = \Drupal::l(t('Book admin'), $url);

// External Uri.
use Drupal\Core\Url;
$url = Url::fromUri('http://www.example.com/');
$external_link = \Drupal::l(t('External link'), $url);

แก้ไข: ชื่อเส้นทางอยู่ในmoduledirectory/modulename.routing.ymlไฟล์และ (โดยค่าเริ่มต้น) ใน{router}ตาราง


2
ฉันพบ $ router_name ในตาราง {router}
24ma13wg

1
ฉันจะสร้างลิงค์สำหรับหน้าแรกได้อย่างไร ใน drupal 7 อาจเป็น l ('home', '<front>') แต่ใน drupal 8 ล่ะ
Guru

fromRoute('<front>')

7
\ Drupal :: l เลิกใช้แล้ว ใช้ \ Drupal \ Core \ Link :: fromTextAndUrl ($ text, $ url) แทน
Eyal

Drupal :: l การเลิกใช้แจ้งให้ทราบล่วงหน้าapi.drupal.org/api/drupal/core!lib!Drupal.php/function/…
leymannx

21

ตัวเลือกอื่นคือการสร้างลิงค์ในเรนเดอร์เรนเดอร์

$url = Url::fromRoute('entity.node.edit_form', array('node' => NID));
$link = [
  '#type' => 'link',
  '#url' => $url,
  '#title' => t('This link was rendered')
];

Drupal จัดหาวิธีการช่วยเหลือบางอย่างให้กับเราเพื่อสร้าง URL และลิงก์ไปยังเอนทิตี

$url = Node::load(NID)->toUrl('edit-form');

และ

$link = Node::load(NID)->toLink(t('link text'), 'edit-form');
$link_render_array = $link->toRenderable();

ฉันชอบคำตอบนี้ดีที่สุด นอกจากนี้#attributesสามารถเพิ่มเพราะเป็นRenderElement
mradcliffe

ลิงก์ควรเป็นapi.drupal.org/api/drupal/ …
mradcliffe

ฉันไม่สามารถแก้ไขได้เพราะฉันรอนานเกินไป
mradcliffe

19

นี่คือตัวอย่างของการสร้างลิงก์ใน Drupal 8 โปรดทราบว่า $ this-> t ('some text') นั้นมีอยู่ในบล็อกที่ขยาย BlockBase หากคุณคัดลอกเหล่านี้ไปยังชั้นอื่นที่ไม่ได้มีหรือใช้เหล่านี้ในไฟล์ .module คุณอาจจำเป็นต้องเปลี่ยนนี้เพื่อตัน () 1

ลิงก์พื้นฐานไปยังโหนด:

$node = Node::load($nid);
$build['node_link'] = $node->toLink()->toRenderable();

สิ่งนี้จะสร้างเรนเดอร์เรนเดอร์แบบนี้:

$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => 'Title of Node',
];

คุณสามารถสร้างอาร์เรย์การเรนเดอร์โดยไม่โหลดโหนดด้วยวิธีนี้:

$url_object = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = [
  '#type' => 'link',
  '#url' => $url_object,
  '#title' => $this->t('Read More'),
];

หรือใช้คลาสลิงก์หลัก:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

หากคุณต้องการใช้มาร์กอัปในข้อความลิงก์ของคุณคุณไม่สามารถใส่สตริงเข้าไปได้คุณต้องใช้อิลิเมนต์อาร์เรย์เรนเดอร์:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid]);
$link_text =  [
  '#type' => 'html_tag',
  '#tag' => 'span',
  '#value' => $this->t('Load More'),
];
$link = Link::fromTextAndUrl($link_text, $url);

ในการสร้างลิงค์สัมบูรณ์คุณเพิ่มตัวเลือกนี้ใน URL ไม่ใช่ลิงค์:

$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], ['absolute' => TRUE]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

ในการเพิ่มคลาสให้กับลิงค์ของคุณคุณต้องเพิ่มสิ่งนี้ใน URL ไม่ใช่ลิงค์:

$options = [
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

ในการเพิ่มสตริงการสืบค้นในลิงก์ของคุณคุณต้องใช้สิ่งนี้ใน URL ไม่ใช่ลิงค์:

$options = [
  'query' => [
    'car' => 'BMW',
    'model' => 'mini-cooper',
  ],
  'attributes' => [
    'class' => [
      'read-more-link',
    ],
  ],
];
$url = Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

หากต้องการตั้งค่าลิงก์ให้เปิดในหน้าต่างใหม่ที่มี target = _blank:

$options = [
  'attributes' => [
    'target' => '_blank'
  ],
];
$url = Url::fromRoute('entity.media.edit_form', ['media' => $entity->id()], $options);
$link = Link::fromTextAndUrl(t('Edit'), $url);
$form['entity']['edit_link'] = $link->toRenderable();

นี่คือลิงก์ไปยังหน้าคำศัพท์อนุกรมวิธาน:

$url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $tid]);
$link = Link::fromTextAndUrl($this->t('Read more'), $url);
$build['read_more'] = $link->toRenderable();

นี่คือลิงค์ไปยังหน้าแก้ไขโหนด:

$url = Url::fromRoute('entity.node.edit_form', ['node' => $nid]);
$link = Link::fromTextAndUrl($this->t('Edit'), $url);
$build['read_more'] = $link->toRenderable();

วิธีสร้างลิงค์ภายนอก:

$url = Url::fromUri('http://www.example.com/');
$link = Link::fromTextAndUrl($this->t('Vist this example site'), $url);
$build['external_link'] = $link->toRenderable();

ลิงก์ไปที่หน้าแรก:

$url = Url::fromRoute('<front>');
$link = Link::fromTextAndUrl($this->t('Home'), $url);
$build['homepage_link'] = $link->toRenderable();

โปรดทราบว่าในวัตถุ url เหล่านี้คุณสามารถรับ url เป็นสตริงได้ด้วยการโทร:

$url->toString();

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

$url_string = Url::fromRoute('<front>')->toString();

linkวิธีเลิก
Eyal

ฉันได้แก้ไขคำตอบของฉันเพื่อใช้ toLink () จากวัตถุโหนดเช่น $ node-> toLink () -> toRenderable ();
ตกลง

นี่เป็นการวิ่งที่ดี
เบรดี้

15

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

  1. ด้วยเส้นทาง สิ่งนี้สมเหตุสมผลที่สุดคุณสามารถจัดหาได้ในตัวเลือก

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. ด้วย url ภายนอก อันนี้แปลกเล็กน้อย ไม่มีอาร์กิวเมนต์ตัวเลือกดังนั้นจึงอาจดูเหมือนเป็นไปไม่ได้ แต่จริง ๆ แล้วก็ตกลง เหตุผลก็คือการเชื่อมโยงอย่างลึกลับไม่เคยมีตัวเลือกเฉพาะ URL ที่พวกเขาอธิบาย ซึ่งหมายความว่าคุณผ่านในชั้นเรียนไปยัง URL เมื่อคุณสร้างมันขึ้นมาและมันจะใช้งานได้

    Link::fromTextAndUrl('My link', 
      Url::FromUrl('https://example.com/about',
        ['attributes' => ['class' => 'special']]));

    ข้อพิสูจน์ทั้งหมดนี้คือคุณสามารถทำได้

    $link = Link::fromTextAndUrl('Example',  Url::fromUri('https://example.com/about'));
    $link->getUrl()->setOption('attributes', ['class' => 'superspecial']);

2

ตัวอย่างที่สมบูรณ์พร้อมคุณสมบัติและมาร์กอัป HTML ในข้อความลิงก์:

  $url = Url::fromRoute(
   'your.route.name', 
   [], 
   ['attributes' => ['id' => 'add-link', 'class' => ['btn', 'btn-sm', 'btn-primary']]]
  );
  $link = Link::fromTextAndUrl(
    Markup::create('<span class=\'glyphicon glyphicon-plus\'></span> ' . t('Add new item')), 
    $url
  );

0

ฉันต้องเพิ่มลิงก์ไปยังตารางเป็น #suffix แต่ต้องใส่เป็น html เพื่อให้บรรลุสิ่งที่ฉันทำ

\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();

โดยที่ mymodule.add_new_page เป็นเส้นทางจากไฟล์โมดูล yml ของฉัน


0

คำตอบที่นี่ให้คำแนะนำที่ดีแก่ฉัน ทั้งหมดที่ฉันต้องการคือการให้ลิงค์ไปยังโหนดในบันทึกของฉัน ... ดังนั้นนี่คือสิ่งที่ฉันจบลงด้วย

  use Drupal\Core\Url;
  use Drupal\Core\Link;
  /* ...
  .. */  
  $url = Url::fromRoute('entity.node.canonical', array('node' => $object->id()));
$strings = array(
  '!node' => Link::fromTextAndUrl($object->getTitle(), $url)->toString(),
  '%nid' => $nid,
);
\Drupal::logger('mymodule_actions')->notice('Updating !node (%nid)', $strings);

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