मैं URL के आधार पर विषय को कैसे बदलूं?


38

मैं एक Drupal उदाहरण example.org पर चल रहा हूं। जिसमें एक थीम X स्थापित और सक्रिय है। अब सीमित अवधि के लिए साइट पर एक आयोजन होना चाहिए, जिसके लिए एक विशेष खंड "नक्काशीदार" किया गया है। उस घटना से संबंधित सभी चीजें example.org/event2011 पर जाएँगी।

मैं चाहता हूं कि जब भी इस अनुभाग के तहत कोई पृष्ठ देखा जाए, तो एक अलग विषय दिखाया जाए (जैसे http://example.org/event2011/about , http://example.org/event2011/node/123 )। मैं उसको कैसे करू?

मैं कई मॉड्यूलों से गुज़रा हूं, लेकिन उनमें से कोई भी ड्रुपल 7 का समर्थन नहीं कर रहा है। अधिमानतः, मैं चाहूंगा कि इसे मॉड्यूल का उपयोग किया जाए और कोड स्तर पर अपने आप को कुछ भी बदलना नहीं चाहता।


1
क्या आप पथ / Event2011 / नोड / 123 के तहत एक पूरी अलग साइट देखना चाहते हैं जैसे आप हैं?
जेरेमी फ्रेंच

जवाबों:


33

यह देखते हुए कि परिवर्तन सीमित समय के लिए है, और यह कि इस तरह के कोड को लागू करना difficulT नहीं है, मैं एक कस्टम मॉड्यूल को लागू करने का सुझाव दूंगा जो विशिष्ट पृष्ठों के लिए उपयोग किए जा रहे विषय को बदलता है।

यह hook_custom_theme()इस प्रकार लागू करने के लिए पर्याप्त है:

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

यदि आपको केवल http://example.com/event2011 के लिए थीम बदलने की आवश्यकता है , लेकिन http://example.com/event2011/node/123 के लिए नहीं , तो कोड को बदल दिया जाना चाहिए

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

मेनू कॉलबैक की परिभाषा में थीम कॉलबैक का उपयोग करने के लिए, प्रलेखन कहता है:

एक सामान्य नियम के रूप में, थीम कॉलबैक फ़ंक्शंस का उपयोग उन पृष्ठों तक सीमित होना चाहिए जिनकी कार्यक्षमता किसी विशेष विषय से बहुत निकट से जुड़ी हुई है, क्योंकि वे केवल मॉड्यूल द्वारा ओवरराइड कर सकते हैं जो विशेष रूप से उन पृष्ठों को लक्षित करते हैं hook_menu_alter()। अधिक सामान्य विषय स्विचिंग कार्यक्षमता को लागू करने वाले मॉड्यूल (उदाहरण के लिए, एक मॉड्यूल जो थीम को वर्तमान उपयोगकर्ता की भूमिका के आधार पर गतिशील रूप से सेट करने की अनुमति देता है) को hook_custom_theme()इसके बजाय उपयोग करना चाहिए ।


मैं current_path () फ़ंक्शन api.drupal.org/api/drupal/includes%21path.inc/function/… का सुझाव दूंगा । आप "के लिए" हालत एक आसान होगा
ऑगस्टो

22

एक कस्टम समाधान जैसा कि अन्य टिप्पणी से पता चलता है, शायद सबसे अच्छा है, लेकिन अगर आप वास्तव में एक मॉड्यूल का उपयोग करना चाहते हैं, तो आपका सबसे अच्छा शर्त थीमकेय है । 5/23/11 के अनुसार, इसकी एक स्थिर रिलीज है।


8

वैकल्पिक रूप से आप theme callbackमेनू सिस्टम के नए विकल्प का उपयोग hook_menu_alter()नीचे बताए अनुसार कर सकते हैं। ps Checkout hook_menu () के बारे में अधिक जानकारी के लिएtheme 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();
}
?>

इसके अतिरिक्त अधिक पारंपरिक का उपयोग करने का एक उदाहरण भी है 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';
  }
}
?>

से लिया गया: http://drupal.org/node/224333#custom_theme


6

आप बस प्रसंग का उपयोग कर सकते हैं और जब पथ / event2011 है, तब लागू होने के लिए विषय का उपयोग कर सकते हैं / आप सरल कोटेक्स्ट की स्थिति में पथ सेट कर सकते हैं और सामग्री की क्रिया में विषय बदल सकते हैं। यह आप URL के आधार पर किसी साइट पर थीम के बीच आसानी से स्विच कर सकते हैं। यहां तक ​​कि मोबाइल के लिए भी काम करता है;)


थीम एक्शन थीम के लिए कस्टम चर पास करता है, यह वास्तव में इसे बदलता नहीं है
एलेक्स वेबर

6

ThemeKey का उपयोग करना सरल है और यह थीम स्विचिंग नियमों के लिए अब तक (8.x के लिए समर्थन के साथ) सबसे लोकप्रिय और शक्तिशाली मॉड्यूल है जो वर्तमान पथ, वर्गीकरण की शर्तों, भाषा, नोड-प्रकार और कई के आधार पर किसी विषय के स्वचालित चयन की अनुमति देता है। कई अन्य गुण। इसे अन्य मॉड्यूल द्वारा उजागर किए गए अतिरिक्त गुणों का समर्थन करने के लिए आसानी से बढ़ाया जा सकता है। मानक सुविधाओं के अलावा, ThemeKey स्वचालित रूप से कई कंट्रीब्यूट मॉड्यूल की विशेषताएं प्रदान करता है और इसमें विस्तार करने वाले मॉड्यूल होते हैं।

उपयोग (7.x)

मॉड्यूल को सक्षम करने के बाद, पर जाएं admin/config/user-interface/themekey। विषय स्विच करने के लिए कई विकल्प हैं, लेकिन शायद आप में रुचि रखते हैं path:node_alias, इसलिए मान सेट करें जैसा आप चाहते हैं कि आप कहें / my_url और फिर उस विषय का चयन करें जिसे आप इस url पर सक्षम करना चाहते हैं। आप वाइल्डकार्ड जैसे web/*या का भी उपयोग कर सकते हैं /^web/.*

देखें: कैसे पथ के लिए एक विषय लोड

उन्नत उपयोग

ThemeKey 7.x में एक वैकल्पिक मॉड्यूल होता है जिसे ThemeKey उदाहरण कहा जाता है जो डेवलपर्स को प्रदर्शित करता है कि ThemeKey को कैसे बढ़ाया जाए।

मदद (7.x)

Mustardseed (7.x) द्वारा वीडियो ट्यूटोरियल देखें ।

उस विषय पर अधिक सहायता प्राप्त की जा सकती है /admin/help/themekey

से जुड़े अन्य एसई प्रश्न भी देखें ।


वैकल्पिक रूप से स्विचटैम (7.x) भी है जो उपयोगकर्ताओं को सक्षम थीम के बीच स्विच करने की अनुमति देने के लिए एक ब्लॉक जोड़ता है।


5

का उपयोग करते समय यूआरएल उपनाम या Pathauto मॉड्यूल , बारीकियों और मतभेदों के बारे में पता जब वर्तमान Drupal पथ के घटकों का उपयोग हो सकता है।

ऐसी स्थितियाँ हैं जहाँ आप arg () का उपयोग नहीं करना चाहते हैं । वास्तव में, Drupal API प्रलेखन वास्तव में इस फ़ंक्शन के उपयोग से बचने का सुझाव देता है जहां संभव हो, क्योंकि परिणामस्वरूप कोड को पढ़ना मुश्किल है।

Kiamlaluno द्वारा प्रस्तावित निम्न उदाहरण पर विचार करें :

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

Drupal 7 में, अगर किसी नोड में Event2011 का उपनाम है , तो उपयोग करते हुए उपनाम के रूप में, पहले URL घटक के रूप में arg(0)वापस आ जाएगा node

print_r(arg(0));

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

इसके बजाय, यदि आप एक उपनाम के साथ काम करने की जरूरत है देखते हैं Drupal में वर्तमान URL प्राप्त करने के कई तरीके , सहित menu_get_object(), current_path(), request_path()और अन्य।

यहाँ एक फिर से काम किया गया उदाहरण है जो थीम स्विच करने के लिए ट्रिगर के रूप में एक उपनाम का उपयोग करता है:

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

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

3

उपयोगकर्ता की भूमिका के आधार पर विषय को कैसे स्विच करें:

एक कस्टम मॉड्यूल बनाएं और निम्नलिखित को कॉपी और पेस्ट करें:

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

आपको प्रतिस्थापित करना होगा:

mymodule => आपके मॉड्यूल नाम के साथ

मेरी विशेष भूमिका => उस भूमिका के नाम के साथ जिसे आपके उपयोगकर्ताओं को एक अलग विषय देखने के लिए उनके पास होना चाहिए।

mytheme => उस थीम के नाम के साथ जिसे आप स्विच करना चाहते हैं


1

आप वास्तव में प्राप्त करने के लिए पेज थीम मॉड्यूल का उपयोग कर सकते हैं

पृष्ठ थीम मॉड्यूल का उपयोग करने के लिए एक सरल और आसान मॉड्यूल है जो विशिष्ट पृष्ठों पर साइट डिफ़ॉल्ट की तुलना में विभिन्न विषयों का उपयोग करने की अनुमति देता है।

विशेषताएं

  • एक पृष्ठ या पृष्ठों की सूची के लिए एक विषय असाइन करें। (Drupal पथ के रूप में एक पृष्ठ सेट करें)
  • Drupal पथ में वाइल्डकार्ड के रूप में '*' वर्ण का उपयोग करने की अनुमति दें।
  • थीम व्यवस्थित करने की अनुमति दें। (यदि पृष्ठ कई परिभाषित हैं, तो सूची में पहले विषय का उपयोग किया जाएगा)
  • किसी विषय को सक्षम / अक्षम करने की अनुमति दें।
  • ड्रुपल नौसिखिया अनुकूल।

0

आप इसे प्राप्त करने के लिए पेज थीम मॉड्यूल का उपयोग कर सकते हैं : पेज थीम मॉड्यूल का उपयोग करने के लिए एक सरल और आसान मॉड्यूल है जो विशिष्ट पृष्ठों पर साइट डिफ़ॉल्ट की तुलना में विभिन्न विषयों का उपयोग करने की अनुमति देता है।

विशेषताएं :

एक पृष्ठ या पृष्ठों की सूची के लिए एक विषय असाइन करें। (Drupal पथ के रूप में एक पृष्ठ सेट करें) Drupal पथ में वाइल्डकार्ड के रूप में '*' वर्ण का उपयोग करने की अनुमति दें। थीम व्यवस्थित करने की अनुमति दें। (यदि पृष्ठ कई परिभाषित हैं, तो सूची में पहले विषय का उपयोग किया जाएगा) किसी विषय को सक्षम / अक्षम करने की अनुमति दें। ड्रुपल नौसिखिया अनुकूल।

जैसा कि आप उपयोग कर सकते हैं: अनुभाग जिसमें पृष्ठ थीम के समान अधिकांश विशेषताएं हैं, लेकिन विषय चुनने के लिए एक भूमिका आधारित चयन और "php स्निपेट" क्षेत्र जोड़ता है।

लेकिन यदि आप सामग्री बनाने, संपादन, और देखने वाले पृष्ठों पर साइट डिफ़ॉल्ट से भिन्न विषयों का उपयोग करना चाहते हैं, तो आप सामग्री थीम का उपयोग कर सकते हैं, जो सामग्री बनाने, संपादन और देखने वाले पृष्ठों पर साइट डिफ़ॉल्ट की तुलना में विभिन्न विषयों का उपयोग करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.