überschreiben Sie node.tpl.php in einem Modul


8

Ich habe ein Modul erstellt, das den Inhalt eines bestimmten Inhaltstyps anzeigen soll. Die Anzeige ist etwas komplex und um es ausschalten und alles zusammenfassen zu können, habe ich ein Modul dafür erstellt.

Aber am Ende sollte es nur die normale node.tpl.php mit einer benutzerdefinierten .tpl.php-Datei überschreiben. Wenn ich die Datei in meinen Vorlagenordner lege, wird sie aufgenommen und die Seiten werden wie beabsichtigt angezeigt, aber ich kann sie nicht zum Laufen bringen, wenn sich die Datei im Modulordner befindet.

Ich habe viele Dinge über das Registrieren der .tpl-Datei und den Vorprozess gelesen, aber nichts, was die Teile kombiniert, die ich brauche.

Das habe ich bisher

function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node--app' => array(
            'template' =>  drupal_get_path('module', 'app') . '/node--app',
            'variables' => array('node' => (object)array())
        )
    );
    return $items;
}

function apps_preprocess_node(&$vars) {
    $variables['theme_hook_suggestions'][] = 'node__app';
}

1
Ich werde vielleicht darauf hingewiesen, aber meiner (nicht so) bescheidenen Meinung nach sollte sich ein Modul nicht darum kümmern, wie ein Knoten aussieht, wenn er angezeigt wird. Es sollte sich nur darum kümmern, diese Daten an das Thema zu übergeben, das dann das tut Anzeigeteil. Wenn Sie möchten, dass Ihr Modul ein benutzerdefiniertes Objekt erstellt, das in einem Knoten angezeigt wird, ist dies eine andere Geschichte. Dann können Sie eine Vorlage dafür erstellen. Wenn Sie diesen Schritt jedoch kurzschließen möchten, ist das Einfügen Ihrer node.tpl.php in das Themenverzeichnis die einzig richtige Methode.
Jimajamma

Wenn jemand dies speziell in Drupal 6 tun möchte,
lesen Sie

Antworten:


3

In Ihrer Frage ist nicht klar, ob Sie Ihre Vorlage in sites/all/custom/modulesoder in platzieren sites/all/custom/modules/the_name_of_mymodule. Es muss das spätere sein.

Wenn Sie jedoch:

  • Bewahren Sie Ihre Vorlage an der richtigen Stelle auf.
  • Besuchte den admin/appearancePfad, um eine Aktualisierung der Themenregistrierung zu erzwingen.
  • Löschte alle Caches danach.

... aber immer noch keine Würfel, Sie können in Ihrer hook_theme () - Implementierung immer den theme_pathSchlüssel angeben :

<?php
function apps_theme($existing, $type, $theme, $path) {
    $items = array(
        'node_app' => array(
            // Don't specify the path in the template name.
            // Unless you have your template inside a directory within this module.
            'template' =>  'node--app',
            'variables' => array('node' => (object)array()),
            // If you want to put the tpl in another location, you can use this key.
            'theme path' => drupal_get_path('module', 'another_module'),
        ),
    );
    return $items;
}

funktioniert immer noch nicht, brauche ich die theme_hook_suggestions oder sollte ich sie abholen und die Vorlage selbst abholen? 'App' ist der Inhaltstyp, 'Apps' der
Modulname

Möglicherweise ist das Problem, das Sie haben, der Name der Themenfunktion node--app. Ein besserer Name wäre node_app, und Sie würden die Themenfunktion aufrufen, indem Sie tun. theme('node_app', [$vars]);Ich bin mir nicht sicher, ob theme('node--app')ich das jemals gesehen habe, und fast sicher, dass es nicht funktionieren würde.
Amateur Barista

Außerdem wird die Variable $ path bereitgestellt, damit Sie den Tanz drupal_get_path () nicht ausführen müssen. $ path ist der Speicherort des Moduls, das das hook_theme implementiert, in diesem Fall das Modul mit dem Namen apps.
Amateur Barista

1
Themenname muss sein 'node__app'(doppelter Unterstrich) nicht'node_app'
Junaid

3

Ich dachte, ich würde die Lösung posten, die ich gefunden habe:

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'node__NODETYPE' => array(
      'render element' => 'content',
      'base hook' => 'node',
      'template' => 'node--NODETYPE',
      'path' => drupal_get_path('module', 'MYMODULE') . '/templates',
    ),
  );
}

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.