Bagaimana cara mengubah tema berdasarkan URL?

38

Saya memiliki instance Drupal yang berjalan di example.org. Yang memiliki tema X diinstal dan diaktifkan. Sekarang untuk periode terbatas, sebuah acara seharusnya diadakan di situs yang bagian khususnya telah "diukir". Semua hal yang terkait dengan acara itu akan masuk ke example.org/event2011.

Saya ingin memiliki tema yang berbeda untuk ditampilkan setiap kali halaman di bawah bagian ini dilihat (misalnya http://example.org/event2011/about , http://example.org/event2011/node/123 ). Bagaimana aku melakukan itu?

Saya telah melalui banyak modul, tetapi tidak ada satupun yang mendukung Drupal 7. Lebih disukai, saya ingin itu dilakukan menggunakan modul dan tidak ingin mengubah apa pun diri saya di level kode.

Samyak Bhuta
sumber
1
Apakah Anda ingin memiliki seluruh situs terpisah di bawah path / event2011 / node / 123 seperti Anda?
Jeremy French

Jawaban:

33

Menimbang bahwa perubahan itu untuk jangka waktu terbatas, dan menerapkan kode seperti itu tidak sulit, saya akan menyarankan untuk menerapkan modul khusus yang mengubah tema yang digunakan untuk halaman tertentu.

Cukup untuk diimplementasikan hook_custom_theme()sebagai berikut:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

Jika Anda perlu mengubah tema hanya untuk http://example.com/event2011 , tetapi tidak untuk http://example.com/event2011/node/123 , maka kode harus diubah menjadi

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

Adapun untuk menggunakan panggilan balik tema dalam definisi panggilan balik menu, dokumentasi mengatakan:

Sebagai aturan umum, penggunaan fungsi panggilan balik tema harus dibatasi pada halaman yang fungsinya sangat terkait dengan tema tertentu, karena mereka hanya dapat ditimpa oleh modul yang secara spesifik menargetkan halaman tersebut hook_menu_alter(). Modul yang menerapkan fungsi hook_custom_theme()alih tema yang lebih umum (misalnya, modul yang memungkinkan tema disetel secara dinamis berdasarkan peran pengguna saat ini) harus digunakan sebagai gantinya.

kiamlaluno
sumber
Saya akan menyarankan fungsi current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Anda akan memiliki lebih mudah "untuk" kondisi
augusto
22

Solusi khusus seperti yang disarankan komentar lain mungkin yang terbaik, tetapi jika Anda benar-benar ingin menggunakan modul, taruhan terbaik Anda adalah ThemeKey . Pada 5/23/11, ia memiliki rilis yang stabil.

tim.plunkett
sumber
8

Atau Anda dapat menggunakan theme callbackopsi baru dari sistem menu hook_menu_alter()seperti diuraikan di bawah ini. ps Periksa hook_menu () untuk detail lebih lanjut tentangtheme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

Selain itu ada juga contoh menggunakan yang lebih tradisional hook_custom_theme()

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

Diambil dari: http://drupal.org/node/224333#custom_theme

electblake
sumber
6

Anda cukup menggunakan Konteks dan menggunakan tema untuk diterapkan ketika path adalah / event2011 / Anda dapat dengan mudah mengatur path dalam kondisi cotext dan mengubah tema dalam aksi konten. Ini adalah Anda dapat dengan mudah beralih antar tema di situs berdasarkan URL. Bahkan berfungsi untuk ponsel;)

Amitav Roy
sumber
aksi tema melewati variabel khusus ke tema, itu tidak benar-benar mengubahnya
Alex Weber
6

Menggunakan ThemeKey sederhana dan merupakan modul yang paling populer dan kuat sejauh ini (dengan dukungan untuk 8.x) untuk aturan pengalihan tema yang memungkinkan pemilihan tema secara otomatis tergantung pada jalur saat ini, istilah taksonomi, bahasa, tipe-simpul, dan banyak lagi, banyak properti lainnya. Itu juga dapat dengan mudah diperluas untuk mendukung properti tambahan yang diekspos oleh modul lain. Di samping fitur standar, ThemeKey secara otomatis memperluas fitur dari banyak modul contrib dan memiliki modul yang memperluasnya.

Penggunaan (7.x)

Setelah mengaktifkan modul, buka admin/config/user-interface/themekey. Ada banyak opsi untuk mengganti tema, tetapi mungkin Anda akan tertarik path:node_alias, jadi tetapkan nilainya sesuai keinginan Anda seperti yang Anda katakan / my_url lalu pilih tema yang ingin Anda aktifkan di url ini. Anda juga dapat menggunakan wildcard seperti web/*atau /^web/.*.

Periksa: Bagaimana Muat Tema Untuk Path

Penggunaan tingkat lanjut

ThemeKey 7.x berisi modul opsional yang disebut Contoh ThemeKey untuk menunjukkan kepada pengembang cara memperluas ThemeKey.

Bantuan (7.x)

Lihatlah tutorial video dari Mustardeed (7.x).

Bantuan lebih lanjut tentang topik itu dapat ditemukan di /admin/help/themekey.

Periksa juga pertanyaan SE lainnya yang terkait dengan .


Atau ada juga Switchtheme (7.x) yang menambahkan blok untuk memungkinkan pengguna untuk beralih di antara tema yang diaktifkan.

kenorb
sumber
5

Saat menggunakan alias alias URL atau modul Pathauto , waspadai perbedaan dan perbedaan saat menggunakan komponen jalur Drupal saat ini.

Ada situasi di mana Anda mungkin tidak ingin menggunakan arg () . Bahkan, dokumentasi Drupal API sebenarnya menyarankan untuk menghindari penggunaan fungsi ini jika memungkinkan, karena kode yang dihasilkan sulit dibaca.

Pertimbangkan contoh berikut, seperti yang diusulkan oleh kiamlaluno :

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

Di Drupal 7, jika sebuah node memiliki alias event2011 , menggunakan arg(0)akan kembali nodesebagai komponen URL pertama, sebagai lawan dari alias.

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

Sebaliknya, jika Anda perlu untuk bekerja dengan alias ada beberapa cara untuk mendapatkan URL saat ini di Drupal , termasuk menu_get_object(), current_path(), request_path()dan lain-lain.

Berikut adalah contoh yang dikerjakan ulang yang menggunakan alias sebagai pemicu untuk mengalihkan tema:

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}
rjb
sumber
3

Cara beralih tema tergantung pada peran pengguna:

Buat modul khusus dan salin & tempel yang berikut ini:

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

Anda harus mengganti:

mymodule => dengan nama modul Anda

peran khusus saya => dengan nama peran yang harus dimiliki pengguna Anda agar mereka dapat melihat tema yang berbeda.

mytheme => dengan nama tema yang ingin Anda alihkan

drupalfever
sumber
1

Anda bisa menggunakan modul Tema Halaman untuk mencapai hal itu

Modul Tema Halaman adalah modul sederhana dan mudah digunakan yang memungkinkan untuk menggunakan tema yang berbeda dari standar situs pada halaman tertentu.

fitur

  • Tetapkan tema ke satu halaman atau daftar halaman. (Tetapkan halaman sebagai jalur Drupal)
  • Izinkan untuk menggunakan karakter '*' sebagai wildcard di jalur Drupal.
  • Izinkan untuk mengatur tema. (Jika beberapa halaman didefinisikan, tema pertama dalam daftar akan digunakan)
  • Izinkan untuk mengaktifkan / menonaktifkan tema.
  • Drupal pemula yang ramah.
Manajer Pro TI
sumber
0

Anda dapat menggunakan modul Tema Halaman untuk mencapai hal itu: Modul Tema Halaman adalah modul sederhana dan mudah digunakan yang memungkinkan untuk menggunakan tema yang berbeda dari standar situs pada halaman tertentu.

Fitur :

Tetapkan tema ke satu halaman atau daftar halaman. (Tetapkan halaman sebagai jalur Drupal) Izinkan untuk menggunakan karakter '*' sebagai wildcard di jalur Drupal. Izinkan untuk mengatur tema. (Jika beberapa halaman didefinisikan, tema pertama dalam daftar akan digunakan) Izinkan untuk mengaktifkan / menonaktifkan tema. Drupal pemula yang ramah.

seperti yang akan Anda gunakan: Bagian yang memiliki sebagian besar fitur yang sama dengan Page Theme, tetapi menambahkan pilihan berdasarkan peran dan area "php snippet" untuk memilih tema.

tetapi jika Anda ingin menggunakan tema yang berbeda dari standar situs pada pembuatan konten, pengeditan, dan melihat halaman Anda dapat menggunakan Tema Konten yang memungkinkan untuk menggunakan tema yang berbeda dari standar situs pada pembuatan konten, pengeditan, dan melihat halaman.

onlink
sumber