Wie übergebe ich eine Variable aus einem benutzerdefinierten Modul an die Vorlagendatei?


8

Ich muss die einfachste Methode kennen, um Variablen vom benutzerdefinierten Modul an die Vorlagendatei zu übergeben. Ich habe die Datei custom.module erstellt und die Datei custom.tpl.php im Modulordner abgelegt.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {

    $setVar = 'this is custom module';
    return theme('custom', $setVar);    
}

Ich habe Theme-Funktion hinzugefügt, aber es funktioniert nicht. Kann mir jemand vorschlagen, was mit diesem Code nicht stimmt?

function theme_custom($arg) {
  return $arg['output'];
}

function custom_theme() {
  return array(
    'Bluemarine' => array(
        'variables' => 'output',
        'template' => 'Bluemarine',
     ),
  );
}

Antworten:


6

Unabhängig von der Drupal-Version, für die Sie das Modul schreiben, enthält Ihr Code zwei Fehler:

  • Sie definieren "Bluemarine" als Themenfunktion, rufen dann aber auf theme('custom'), was die "benutzerdefinierte" Themenfunktion aufrufen würde
  • Wenn Sie "benutzerdefiniert" als Designfunktion definieren, die eine Vorlagendatei verwendet, theme_custom()wird diese niemals aufgerufen

Wenn Sie Code für Drupal 6 schreiben, sollte der Code dem folgenden ähnlich sein. Ich gehe davon aus, dass der Name für die Themenfunktion lautet custom.

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_theme() {
  return array(
    'custom' => array(
      'arguments' => array('output' => NULL),
      'template' => 'custom',
     ),
  );
}

function custom_page() {
    $output = 'This is a custom module';
    return theme('custom', $output);    
}

function theme_custom($output) {
}

Die Vorlagendatei hat Zugriff auf $outputund auf alle eingestellten Variablen template_preprocess_custom(), wenn Ihr Modul dies implementiert.

Beispielsweise könnten Sie Code ähnlich dem folgenden implementieren:

function template_preprocess_custom(&$variables) {
  if ($variables['output'] == 'This is a custom module') {
    $variables['append'] = ' and I wrote it myself.";
  }
}

Mit diesem Code hat die Vorlagendatei Zugriff auf $outputund $append.

Als Beispiel für eine Designfunktion , die eine Vorlagendatei verwendet, können Sie sich theme_node () ansehen , das in node_theme () definiert ist und node.tpl.php als Vorlagendatei verwendet. Die vom Node-Modul für diese Theme-Funktion implementierte Vorverarbeitungsfunktion lautet template_preprocess_node () .


Vielen Dank, Kiam, hat offensichtlich den ersten Kommentar von OP zur Verwendung von D6 verpasst. +1
Laxman13

Danke Kiam, template_preprocess_custom (& $ variables) hat es geschafft
Kamran Akhter

Jetzt möchte ich tpl in den Themenordner verschieben. Wie kann ich das tun?
Kamran Akhter

@KamranAkhter Das ist eine andere Frage. :-)
Kiamlaluno

3

Sie rufen die falsche Themenfunktion auf. Stattdessen function theme_customsollte es sein function theme_Bluemarine. Sie müssen auch ein Array an das Variablenstück von hook_theme () übergeben . Sehen Sie ein einfaches Beispiel hier .

Verwenden Sie Ihr Beispiel (nachdem Sie die Vorlagen- und Themenfunktion in geändert haben custom):

function custom_menu(){
  $items = array();

  $items['custom'] = array(
    'title' => t('custom!'),
    'page callback' => 'custom_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function custom_page() {
  $setVar = 'this is custom module';
  return theme('custom', array('output' => $setVar));
}

function custom_theme() {
  $path = drupal_get_path('module', 'custom');
  return array(
    'custom' => array(
        'variables' => array('output' => null),
        'template' => 'custom',
     ),
  );
}

Jetzt in custom.tpl.php nur noch brauchen <?php print $output; ?>


Vielen Dank für die Antwort, das Beispiel, das Sie gegeben haben, ist Knotenmodul und ich habe kein Knotenmodul. Ich brauche nur eine Möglichkeit, Variable an tpl-Datei zu übergeben, ich benutze drupal 6.plz Hilfe
Kamran Akhter

Vielen Dank für die Antwort, es gibt mir den Fehler. Keine solche Datei oder kein solches Verzeichnis erwartet tatsächlich die Datei custom.tpl.php in dem Modulordner, den ich bereits im Code habe. Bluemarine wird von custom repliziert. Bluemarine ist das Drupal-Thema, das ich benutze.
Kamran Akhter

änderte den obigen Code und gab mir den weißen leeren Bildschirm, was soll ich tun, bitte helfen
Kamran Akhter

Ich habe den Code geändert und er funktioniert auf meiner Website.
Laxman13

Ich kopiere nur, füge den obigen Code ein, aber es funktioniert nicht
Kamran Akhter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.