Ändern des Titels Ihrer Seite entsprechend dem Titel Ihrer Registerkarten

7

Ich habe folgende Funktion:

function cvminterviews_menu() {

  $items = array();

  $items['admin/settings/cvminterviews'] = array(
    'title' => 'Interview Schedule Overview',
    'description' => 'Overview',
    'file' => 'cvminterviews_admin_overview.inc.php',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cvminterviews_overview_form'),
    'access arguments' => array('administer cvminterviews'),
  );

  $items['admin/settings/cvminterviews/overview'] = array(
    'title' => 'Overview',
    'description' => 'Overview',
    'file' => 'cvminterviews_admin_overview.inc.php',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cvminterviews_overview_form'),
    'access arguments' => array('administer cvminterviews'),
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );

  $items['admin/settings/cvminterviews/setup'] = array(
    'title' => 'Interview Schedule Setup',
    'description' => 'Setup',
    'file' => 'cvminterviews_admin_setup.inc.php',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cvminterviews_dateroomsetup_form'),
    'access arguments' => array('administer cvminterviews'),
    'type' => MENU_LOCAL_TASK,
  );


  return $items;
}

Dies gibt zwei Registerkarten oben auf der Seite aus. Wenn ich jedoch auf jede Registerkarte klicke, hat sie denselben Seitentitel wie der übergeordnete Menüpunkt "Interview-Zeitplanübersicht".

Gibt es eine Möglichkeit, eindeutige Seitentitel für jede Registerkarte festzulegen?

bkildow
quelle

Antworten:

2

Du musst anrufen

> 4.6  6   drupal_set_title($title = NULL)
> 7  8     drupal_set_title($title = NULL, $output = CHECK_PLAIN)

Sie müssen Ihren Code ein wenig ändern

  $items['admin/settings/cvminterviews/setup'] = array(
    'title' => 'Interview Schedule Setup',
    'description' => 'Setup',
    'file' => 'cvminterviews_admin_setup.inc.php',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cvminterviews_dateroomsetup_form'),
    'access arguments' => array('administer cvminterviews'),
    'type' => MENU_LOCAL_TASK,
  );

zu

  $items['admin/settings/cvminterviews/setup'] = array(
    'title' => 'Interview Schedule Setup',
    'description' => 'Setup',
    'file' => 'cvminterviews_admin_setup.inc.php',
    'page callback' => '_cvminterviews_admin_page',
    'page arguments' => array(
      'variables' => array(
        'form' => 'cvminterviews_dateroomsetup_form', 
        'title' => t('my_title')
      )
    ),
    'access arguments' => array('administer cvminterviews'),
    'type' => MENU_LOCAL_TASK,
  );

function _cvminterviews_admin_page($variables = NULL) {
  if(isset($variables['title'])) {
    drupal_set_title($variables['title']);
  }
  if(isset($variables['form'])) {
    return drupal_get_form($variables['form']);
  }
}

Dann machen Sie dasselbe für $items[admin/settings/cvminterviews']&$items['admin/settings/cvminterviews/setup']

Wenn Sie Ihren Code ändern, müssen Sie sich eines weiteren Problems bewusst sein.

Es gibt zwei Registerkarten für admin / settings / cvminterviews, eine mit den Optionen "Übersicht" und "Setup des Interviewplans". 'Übersicht' verlinkt auf admin / settings / cvminteviews NICHT admin / settings / cvminterviews / summary. admin / settings / cvminterviews / summary wird niemals aufgerufen (es sei denn, Sie geben dies in die Adressleiste ein), da dies die Standardregisterkarte ist, die von festgelegt wird 'type' => MENU_DEFAULT_LOCAL_TASK.

iStryker
quelle
1
Ich denke, es ist vorzuziehen, das String-Literal an t()eine Variable zu übergeben. Sie haben auch Anführungszeichen um den Schlüssel vergessen Form und Titel .
Andy
Wenn jemand ein ähnliches Problem hatte, aber entity_ui_get_form als Seitenrückruf verwendet, überprüfen Sie $ form ['# after_build'], zum Beispiel: drupalcode.org/project/crm_core.git/blob/…
Favio
1

Ich habe diesen Code verwendet (in meiner Funktion, die den Breadcrumb festlegt, aber dies könnte auch in einem Seitenrückruf verwendet werden)

<?php
// get current menu item informations. This contain the title of the tab.
$item = menu_get_item();
// use it as page title.
drupal_set_title($item['title']);
?>
yann_yinn
quelle
-1

Ich glaube, im Allgemeinen behalten Sie bei der Verwendung lokaler Aufgaben den gleichen Titel bei. Die Aufgaben selbst sind Aktionen, die Sie für ein gemeinsames Objekt / einen gemeinsamen Bereich ausführen können. In diesem Fall ist es also sinnvoll, den gleichen Titel für jeden lokalen Titel beizubehalten Aufgabe, auf der du bist.

Andy
quelle
In dieser Situation ändert der Rückgabewert von 'title callback' den Titel der Registerkarte und nicht den Titel der Seite. Sie können drupal_set_title ('my_new_title') in die Rückruffunktion einfügen und es funktioniert.
iStryker
Feedback zum Downvoting?!
Andy
@iStryker - danke für das Feedback. Nach meinem Verständnis wird der Titel als Argument an den Titelrückruf übergeben, sodass Sie entweder a) einen Titelrückruf von drupal_set_title(der umgangen werden würde t()) oder b) einen benutzerdefinierten Rückruf verwenden können, der den Titel weiterleitet t()und drupal_set_title()manuell aufruft . Sehen Sie ein Problem mit diesem Ansatz?
Andy
In meiner myshift Demo. Ich habe 'title callback' => 'example_title_callback' für alle 3 Menüpunkte hinzugefügt. Auf allen 3 Seiten wird die Funktion example_title_callback mehr als 2 Mal aufgerufen. Dies liegt daran, dass die Menüelemente in hook_menu () für jeden gerenderten (Tab-) Link auf der Seite aufgerufen werden. (und example_title_callback wird jedes Mal aufgerufen, um zu versuchen, den Titel des Links zu ermitteln). Wenn Sie also drupal_set_title in example_title_callback haben, wird es 2+ Mal aufgerufen. Das ist schlecht. Wenn Sie drupal_set_title in den Seitenrückruf einfügen, wird dieser nur einmal aufgerufen.
iStryker
1
@iStryker Danke, das ist ein sehr guter Punkt - die Methode wird nicht nur mehrmals aufgerufen, sondern ist auch von Natur aus fehlerhaft, da die letzte Registerkarte, deren Titel durch den Rückruf geführt wird, diejenige ist, die den Titel der Seite festlegt (selbst wenn dies der Fall ist) nicht die aktuell aktive Registerkarte).
Andy