मैं पृष्ठ का शीर्षक कैसे निर्धारित करूं?


29

मुझे पता है कि मैं पेज का शीर्षक बदल सकता हूं drupal_set_title(t('Amy page title')), लेकिन जब मैं ड्रुपल 8 में कोशिश करता हूं तो मुझे लगता है कि ऐसा कोई फंक्शन एरर नहीं है।

मैं Drupal 8 में पेज का शीर्षक कैसे बदल सकता हूँ?

जवाबों:


30

जैसा कि आप यहाँ देख सकते हैं कि Drupal 8 में फंक्शन्स को दर्शाया गया है।

मार्गों पर शीर्षक अब आपके उपयोग के मामले के आधार पर, विभिन्न तरीकों से सेट किए जा सकते हैं। पहले सिर्फ drupal_set_title()जो भी जगह पर बुलाया जाता था। निम्नलिखित उपयोग के मामले मौजूद हैं:

स्थैतिक शीर्षक

स्थैतिक शीर्षक के लिए आप रूटिंग परिभाषा पर एक '_title' सेट करते हैं:

block.admin_add:
  path: '/admin/structure/block/add/{plugin_id}/{theme}'
  defaults:
    _controller: '\Drupal\block\Controller\BlockAddController::blockAddConfigureForm'
    _title: 'Configure block'
  requirements:
    _permission: 'administer blocks'

गतिशील शीर्षक

यदि आप एक नियंत्रक लिखते हैं और आपको एक गतिशील शीर्षक की आवश्यकता होती है, उदाहरण के लिए साइट कॉन्फ़िगरेशन के आधार पर, मार्ग डिफ़ॉल्ट में _title_callback का उपयोग करें।

mymodule.test:
  path: '/mymodule/test'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Test::getContent'
    _title_callback: '\Drupal\mymodule\Controller\Test::getTitle'

<?php
class Test {

  /**
   * Returns a page title.
   */
  public function getTitle() {
    return  'Foo: ' . \Drupal::config()->get('system.site')->get('name');
  }

  /**
   * Returns a page render array.
   */
  public function getContent() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    return $build;
  }
}
?>

अंतिम शीर्षक ओवरराइड

यदि आप एक नियंत्रक लिखते हैं और आपको मार्ग से शीर्षक को ओवरराइड करने की आवश्यकता है, तो आप रेंडर सरणी में #title वापस कर सकते हैं। इसे आम तौर पर टाला जाना चाहिए, क्योंकि पृष्ठ के लिए शीर्षक जब पूरी तरह से गाया जाता है, तो अन्य संदर्भों (जैसे ब्रेडक्रंब) में शीर्षक से अलग हो सकता है।

<?php
class Test {

  /**
   * Renders a page with a title.
   *
   * @return array
   *   A render array as expected by drupal_render()
   */
  public function getContentWithTitle() {
    $build = array();
    $build['#markup'] = 'Hello Drupal';
    $build['#title'] = 'Foo: ' . Drupal::config()->get('system.site')->get('name');

    return $build;
  }

}
?>

का आउटपुट झंडा drupal_set_title()

Drupal 8 में आउटपुट सत्यापन Drupal 7 के विपरीत है। हमें स्पष्ट रूप से PASS_THROUGH को निर्दिष्ट करना है और CHECK_PLAIN को Drupal 7 में डिफ़ॉल्ट रूप से है, जबकि Drupal 8 में स्थिति अलग है। जब तक यह सुरक्षित नहीं है तब तक आउटपुट ऑटो बच जाता है। दोनों t()और new FormattableMarkupवापसी ऑब्जेक्ट्स जो ऑटो नहीं बचेंगे।

$form['#title'] = $this->t('Add new shortcut');
$form['#title'] = $this->t("'%name' block", array('%name' => $info[$block->delta]['info']));

Drupal 8.5+

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

और भी आप hook_preprocess_HOOK()इसे ओवरराइड करने के लिए उपयोग कर सकते हैं

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {
   // WRITE YOUR LOGIC HERE, 
  if ($YOUR_LOGICS === TRUE) {

    $variables['title'] = 'New Title';
  }
}

आपको सिस्टम को क्यों जोड़ना है? साइट-> नाम? यदि आप बिना शीर्षक शीर्षक प्रदान करते हैं तो यह उस शीर्षक के भाग के रूप में जोड़ा जाता है जो html सर में जाता है।
अनूपजोन

5

अपने HTML दस्तावेज़ के शीर्षक में शीर्षक टैग बदलें।

function mymodule_preprocess_html(&$variables) {

  $variables['head_title']['title'] = $something;
}

पृष्ठ सामग्री में दिखाई देने वाले शीर्षक को बदलें।

function mymodule_preprocess_block(&$variables) {

  if ('page_title_block' == $variables['plugin_id']) {
    $variables['content']['#title'] = $something;
  }
}

4

Drupal 8 में drupal_set_title ()

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

Drupal 8 में drupal_get_title ()

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $title = \Drupal::service('title_resolver')->getTitle($request, $route);
}

हो सकता है शीर्षक हर जगह ठीक काम करता है। मुझे आश्चर्य है कि शीर्षक कहाँ पर है, प्रीप्रोसेस पेज में कारण यह काम नहीं करता है।
लीमैनक्स

3

उस फंक्शन को Drupal 8. से हटा दिया गया था।
Change record: drupal_set_title () और drupal_get_title () हटा दिए गए थे

अब आप मार्गों को निर्धारित करते समय शीर्षक सेट कर सकते हैं modulename.routing.yml। यह कैसे किया जा सकता है, इसका उदाहरण ऊपर दिए गए परिवर्तन रिकॉर्ड लिंक को दिखाया गया है।


3

मैंने D8 में पाया कि यदि आप किसी इकाई दृश्य के लिए शीर्षक बदलना चाहते हैं, तो आप हुक_ENTITY_TYPE_view_alter () का उपयोग कर सकते हैं। उदाहरण के लिए, यहां उपयोगकर्ता "फ़ील्ड_डिसप्ले_नाम" पर एक उपयोगकर्ता इकाई का दृश्य बदल सकता है, बल्कि शीर्षक के रूप में उपयोगकर्ता आईडी के बजाय:

/**
* Implements hook_ENTITY_TYPE_view_alter().
*/
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
  $build['#title'] = $entity->get('field_display_name')->getString();
}

अच्छा और साफ दृष्टिकोण। D8 /
विशाल कुमार साहू

2

मुझे एक और रास्ता मिल गया है, जो आपके नियंत्रक के पास नहीं होने पर और आपकी वेबसाइट पर शीर्षक को संशोधित करना चाहते हैं तो यह सरल हो सकता है। आप वर्तमान नोड के आधार पर शीर्षक को संशोधित करने के लिए इसका उपयोग कर सकते हैं।

सबसे पहले, अपने html.html.twig में टैग को हटा दें, हुक hook_page_attachments_alter

function mytemplate_page_attachments_alter(array &$page) {
    $page['#attached']['html_head'][] = [
        [
          '#tag' => 'title',
          '#value' => "My title"
        ],
        'title'
    ];
}

आप के साथ वर्गीकरण शब्द की वर्तमान मात्रा प्राप्त कर सकते हैं

$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')

2

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

(ध्यान दें कि 'पृष्ठ शीर्षक' 'इकाई लेबल' कहने का एक अधिक बोलचाल का तरीका है, जहाँ 'पृष्ठ' एक सामग्री इकाई है और 'लेबल' शीर्षक को शामिल करता है और अन्य संस्थाओं के लिए समतुल्य होता है जैसे टिप्पणी विषय, वर्गीकरण शब्द।

हालांकि ऑप कस्टम कोड लिखने पर मार्गदर्शन के लिए पूछ रहा है, यह उपलब्ध विवरणों से स्पष्ट नहीं है कि कस्टम कोड सबसे अच्छी सिफारिश है। योगदान कोड से उपलब्ध सुविधा की नकल करने के लिए बहुत विशिष्ट कारण के बिना पाठकों के लिए, Drupal समुदाय एक मौजूदा मॉड्यूल को अपनाने की दृढ़ता से सलाह देता है (और साइट के मालिक दृढ़ता से लाभ उठाते हैं)।


2

drupal_set_title()और drupal_get_title()दोनों को ड्रुपल 8 से निकाल दिया जाता है लेकिन सबसे अच्छी बात यह है कि इसके लिए एक अलग ब्लॉक है page_title। उपयोगकर्ता किसी भी पृष्ठ / क्षेत्र पर इस ब्लॉक को छिपा या जोड़ सकता है।

इसके लिए 2 समाधान हैं।

  1. title_blockविशेष पृष्ठ पर अक्षम करें और शीर्षक के लिए कुछ मार्कअप के साथ नया कस्टम ब्लॉक जोड़ें। अब इस ब्लॉक title_blockको ड्रुपल ब्लॉक सेक्शन के ठीक बाद लगाएं।
  2. hook_preprocess_block()अपनी custom_theme.themeफ़ाइल में फ़ंक्शन का उपयोग करके ।
    यहाँ कोड उदाहरण है:

    function custom_themename_preprocess_block(&$variables) {
      if ('page_title_block' == $variables['plugin_id']) {
        $request = \Drupal::request();
        $path = $request->getRequestUri(); // get current path
        if(strpos($path, 'user')) { //check current path is user profile page
          $variables['content']['#title'] = 'My Profile';
        }
      }
    }

    मेरे मामले में मैंने 2 विधि से ऊपर का उपयोग किया है, जो केवल उपयोगकर्ता प्रोफ़ाइल पृष्ठ के लिए काम करेगा।


1

मैं इससे जूझता रहा और उपरोक्त सभी समाधानों की कोशिश करता रहा। समाधान है कि अंत में काम किया था:

function mymodule_preprocess_html(&$variables) {
  $variables['head_title']['title'] = $something;
}

लेकिन इसके बाद ही मैंने अपना कस्टम मॉड्यूल वजन अपडेट किया:

drush php:eval "module_set_weight('mymodule', 10);"

1

पेज शीर्षक प्राप्त करना ठीक है जैसा कि @ rpayanm के उत्तर में लिखा गया है। लेकिन इसे स्थापित करना काफी जटिल हो गया। अंत में यह पता चला कि hook_preprocess_HOOK()इसका उपयोग पृष्ठ शीर्षक को आसानी से पूर्ववर्ती करने के लिए किया जा सकता है।

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {

  if ($MYLOGIC === TRUE) {

    $variables['title'] = 'New Title';
  }
}

और जैसा कि पहले ही अन्य उत्तरों में बताया जा चुका है कि आप hook_preprocess_html()HTML हेड शीर्षक टैग को तदनुसार सेट करने के लिए उपयोग कर सकते हैं ।


0

मैंने उपयोगकर्ता के लिए page_title ब्लॉक को बदल दिया है / इस तरह एक अलग कस्टम खाता फ़ील्ड नाम के लिए uid:

function hook_preprocess_block(&$variables) {  
  $path = \Drupal::request()->getpathInfo();
  $arg = explode('/', $path);
  if (isset($arg[2]) && $arg[2] == 'user' && isset($arg[3])) {
    if (isset($variables['elements']['content']['#type']) && $variables['elements']['content']['#type'] == 'page_title') {
      $account = \Drupal\user\Entity\User::load($arg[3]);
      if(isset($account) && isset($account->field_mycustomfield->value)){
        $variables['content']['#title']['#markup']=$account->field_mycustomfield->value;
      }
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.