mengganti node.tpl.php dalam sebuah modul


8

Saya membuat modul yang harus dapat menampilkan konten dari jenis konten tertentu. Tampilannya agak rumit dan untuk dapat mematikannya dan untuk mengelompokkan semuanya saya membuat modul untuk ini.

Tetapi pada akhirnya seharusnya hanya menimpa node.tpl.php normal dengan file .tpl.php kustom. Ketika saya meletakkan file di folder templat saya akan diambil dan halaman ditampilkan sebagaimana dimaksud, tetapi saya tidak bisa membuatnya berfungsi saat file ada di folder modul.

Saya membaca banyak hal tentang regsiter file .tpl dan preprocess tetapi tidak ada yang menggabungkan potongan-potongan yang saya butuhkan.

Inilah yang saya miliki sejauh ini

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
Saya mungkin dipanggil untuk hal ini, tetapi menurut pendapat saya (tidak begitu), sebuah modul seharusnya tidak peduli seperti apa bentuk sebuah node ketika ditampilkan, yang harus diperhatikan hanyalah meneruskan data itu ke tema, yang kemudian melakukan bagian tampilan. Sekarang, jika Anda ingin modul Anda membuat objek khusus yang ditampilkan dalam sebuah simpul, itu cerita lain, maka Anda bisa membuat templat untuk itu. Tetapi, jika Anda ingin membuat hubungan singkat langkah itu, maka menempatkan node.tpl.php Anda di direktori tema adalah satu-satunya cara yang 'benar' untuk melakukannya.
Jimajamma

Jika ada yang mencari untuk melakukan ini secara khusus di Drupal 6, periksa jawaban ini: stackoverflow.com/a/6153043/1154642
bryanbraun

Jawaban:


3

Tidak jelas dalam pertanyaan Anda jika Anda menempatkan template di sites/all/custom/modules, atau dalam sites/all/custom/modules/the_name_of_mymodule. Perlu nanti.

Namun, jika Anda:

  • Siapkan templat Anda di tempat yang tepat.
  • Mengunjungi admin/appearancejalan untuk memaksakan pembaruan registri tema.
  • Membersihkan semua cache aftewards.

... tetapi masih tidak ada dadu, Anda selalu dapat menentukan di hook_theme () implementasi theme_pathkunci:

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

masih tidak berfungsi, apakah saya memerlukan theme_hook_suggestions atau harus mengambilnya sendiri? 'Aplikasi' adalah tipe konten, 'Aplikasi' nama modul
dazz

Mungkin masalah yang Anda alami adalah nama fungsi tema node--app. Nama yang lebih baik adalah node_app, dan Anda akan memanggil fungsi theming dengan melakukan theme('node_app', [$vars]);Saya tidak yakin theme('node--app')adalah sesuatu yang pernah saya lihat, dan hampir yakin itu tidak akan berhasil.
amatir barista

Juga, variabel $ path disediakan sehingga Anda tidak perlu melakukan tarian drupal_get_path (). $ path adalah lokasi modul yang mengimplementasikan hook_theme, dalam hal ini modul tersebut bernama apps.
amatir barista

1
nama tema harus 'node__app'(garis bawah ganda) tidak'node_app'
Junaid

3

Kupikir saya akan memposting solusi yang saya temukan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.