मैं एक लिंक कैसे बनाऊँ?


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>टैग का उपयोग कर सकता था, लेकिन डी 7 में यह सबसे अच्छा अभ्यास नहीं था।

तो, लिंक बनाने के लिए उपयोग करने की सही विधि क्या है और मैं इसे अपने फ़ंक्शन के लिए कैसे उपलब्ध कर सकता हूं?


लिंक जो Drupal 8 में लिंक उत्पन्न करने के लिए उदाहरण के सभी प्रकार है नीचे की जांच करें gist.github.com/r-daneelolivaw/b420b3dc0c40a6cacf76
स्वप्निल 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()ट्रिक बहुत उपयोगी है, धन्यवाद!
निक

अभी भी Drupal 8.4 कोर
podarok

ब्राह, आपने इस एक के साथ मेरी जान बचाई, मैं द्रुपाल के लिए नया हूं और यह पता लगाने में सक्षम था कि समूह मॉड्यूल नाम कॉलम को कैसे बदलें ताकि यह नोड्स को इंगित कर सके!
माइक क्यू

24

एक, यह 100% पूर्ण नहीं है, इस मुद्दे को देखें । उस ने कहा, मुझे परिवर्तन सूचना से कुछ कोड उद्धृत करें :

ड्रुपल 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));

ड्रुपल 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
मुझे {रूटर} तालिका में $ रूटर_नाम मिला।
24ma13wg

1
मैं फ्रंट पेज के लिए लिंक कैसे बना सकता हूं। ड्रुपल 7 में, यह l ('होम', '<फ्रंट>') हो सकता है। लेकिन ड्रुपल 8 में क्या है?
गुरु

fromRoute('<front>')

7
\ Drupal :: l पदावनत है। का प्रयोग करें \ Drupal \ कोर \ लिंक :: fromTextAndUrl ($ पाठ, $ url) के बजाय
ईयाल

Drupal :: l deprecation नोटिस api.drupal.org/api/drupal/core .lib
-Drupal.php/

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


मैं इसे संपादित करने में सक्षम नहीं था क्योंकि मैंने बहुत लंबा इंतजार किया था।
mradcliffe 16

19

यहाँ Drupal 8 में लिंक बनाने के कुछ उदाहरण दिए गए हैं। ध्यान दें कि इस ब्लॉक के भीतर $ $-> ('कुछ टेक्स्ट') उपलब्ध है। यदि आप इन्हें किसी अन्य वर्ग में कॉपी करते हैं, जिसमें यह नहीं है या इनको .module फ़ाइल में उपयोग नहीं किया है, तो आपको इसे बदलकर t () 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();

लक्ष्य के साथ एक नई विंडो में खोलने के लिए लिंक सेट करने के लिए = _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विधि मान्य नहीं है।
ईल

मैंने नोड ऑब्जेक्ट () $ नोड-> toLink () -> toRenderable () से उपयोग करने के लिए अपने उत्तर को संशोधित किया है;
oknate

यह एक अच्छा रन डाउन है।
ब्रैडी

15

विशेषताएँ सेट करने की क्षमता खो जाती है या पिछले उदाहरणों में जटिल लगती है क्योंकि कार्यक्षमता अभी स्पष्ट नहीं है। लिंक बनाने के दो तरीके हैं अगर यह एक मार्ग है या नहीं और प्रत्येक थोड़ा अलग व्यवहार करता है तो यहां उदाहरण हैं।

  1. एक मार्ग के साथ। यह सबसे अधिक समझ में आता है, आप इसे विकल्पों में आपूर्ति कर सकते हैं।

    Link::createFromRoute('My link', 
      'entity.node.canonical',
      ['node' => 123],
      ['attributes' => ['class' => 'special']]));
  2. बाहरी यूआरएल के साथ। यह थोड़ा अजीब है। कोई विकल्प तर्क नहीं है इसलिए यह असंभव लग सकता है लेकिन वास्तव में ठीक है। कारण यह है कि अकथनीय लिंक में कभी भी केवल उनके द्वारा वर्णित 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);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.