sovrascrive node.tpl.php in un modulo


8

Ho creato un modulo che dovrebbe essere in grado di visualizzare il contenuto di un determinato tipo di contenuto. La visualizzazione è piuttosto complessa e per poterlo spegnere e raggruppare tutto insieme ho creato un modulo per questo.

Ma alla fine dovrebbe semplicemente sovrascrivere il normale node.tpl.php con un file .tpl.php personalizzato. Quando inserisco il file nella cartella del modello, questo viene prelevato e le pagine vengono visualizzate come previsto, ma non riesco a farlo funzionare quando il file si trova nella cartella del modulo.

Ho letto molte cose su regsiter il file .tpl e la preelaborazione, ma niente che combini i pezzi di cui ho bisogno.

Questo è quello che ho finora

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
Potrei essere richiamato su questo, ma secondo la mia (non così) modesta opinione, un modulo non dovrebbe preoccuparsi di come appare un nodo quando viene visualizzato, tutto ciò che dovrebbe interessare è passare quei dati al tema, che poi fa il porzione di visualizzazione. Ora, se vuoi che il tuo modulo crei un oggetto personalizzato che viene visualizzato in un nodo, questa è un'altra storia, allora potresti creare un modello per quello. Ma, se vuoi cortocircuitare quel passaggio, mettere il tuo node.tpl.php nella directory del tema è l'unico modo "giusto" per farlo.
Jimajamma,

Se qualcuno sta cercando di fare questo in particolare in Drupal 6, controlla questa risposta: stackoverflow.com/a/6153043/1154642
bryanbraun

Risposte:


3

Non è chiaro nella tua domanda se stai inserendo il tuo modello dentro sites/all/custom/moduleso dentro sites/all/custom/modules/the_name_of_mymodule. Deve essere il dopo.

Tuttavia, se tu:

  • Metti il ​​tuo modello nel posto giusto.
  • Visitato il admin/appearancepercorso per forzare un aggiornamento del registro dei temi.
  • Svuotare tutte le cache in avanti.

... ma ancora nessun dado, puoi sempre specificare nella tua implementazione hook_theme () la theme_pathchiave:

<?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;
}

non funziona ancora, ho bisogno di theme_hook_suggestions o dovrei sceglierlo raccogliendo il modello da solo? 'App' è il tipo di contenuto, 'App' il nome del modulo
dazz

Forse il problema che stai riscontrando è il nome della funzione tema node--app. Un nome migliore sarebbe node_app, e tu chiameresti la funzione tematica facendo theme('node_app', [$vars]);Non sono sicuro che theme('node--app')sia qualcosa che io abbia mai visto, e quasi sicuro che non funzionerebbe.
barista dilettante

Inoltre, viene fornita la variabile $ path in modo da non dover eseguire la danza drupal_get_path (). $ path è la posizione del modulo che sta implementando hook_theme, in questo caso il modulo denominato app.
barista dilettante

1
il nome del tema deve essere 'node__app'(doppio trattino basso) non'node_app'
Junaid

3

Ho pensato di pubblicare la soluzione che ho trovato:

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',
    ),
  );
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.