सक्रिय रूप से सक्रिय Drupal विषय को बदलने का सही तरीका?


22

सक्रिय रूप से सक्रिय Drupal विषय को बदलने का सही तरीका क्या है?

जवाबों:


15

Drupal 6 समाधान:

आप यह सुनिश्चित करना चाहते हैं कि आप $custom_themeपृष्ठ निष्पादन में वैश्विक चर को काफी पहले बदल दें ।

global $custom_theme;
$custom_theme = 'garland';

हुक के कुछ जोड़े जो पृष्ठ निष्पादन में बहुत प्रारंभिक हैं (यदि आप कस्टम मॉड्यूल का उपयोग कर रहे हैं) हुक_बूट () और हुक_इनिट () हैं।
डेविड लानियर

कहाँ $custom_themeपरिभाषित किया गया है? क्या यह विषय बदलने के लिए पर्याप्त है?
मोहम्मद अली अकबरी


1
सफलता को पुन: पेश नहीं कर सका। : <
Starlocke

मेरे लिए काम किया। मैंने इसे हुक_बूट ()
मार्क

15

मुझे पता है कि आपने पूछा कि इसे प्रोग्रामेटिक तरीके से कैसे किया जाता है, लेकिन इस मामले में आपका समाधान, वास्तविक समस्या नहीं है, तो आप थीमकूट मॉड्यूल का भी उपयोग कर सकते हैं । यह आपको शर्तों को सेट करने की अनुमति देता है, जो जब मिलते हैं, तो थीम को बदलते हैं। आप पथ, वर्गीकरण, सामग्री प्रकार, दिनांक और अधिक बनाने या संपादित करने के आधार पर स्थितियां बना सकते हैं। तुम भी अधिक विकल्प प्राप्त करने के लिए Themekey Properties मॉड्यूल मॉड्यूल में जोड़ सकते हैं।

फिर से, मुझे पता है कि यह प्रोग्रामेटिक रूप से नहीं है, लेकिन मुझे यकीन नहीं है कि अगर आपके सवाल के पीछे असली सवाल यह है कि स्थितियों के आधार पर थीम कैसे बदलें।


4
हाँ, यदि आप इसे UI के माध्यम से प्रबंधित करना चाहते हैं, तो मैं ThemeKey की सलाह दूंगा।
डेव रीड

या कम से कम चेकआउट drupalcode.org/project/themekey.git/blob/refs/heads/7.x-2.x:// जहां ThemeKey अपना जादू करता है
Capi Etheriel

@Chaulky सही है: मैं थोड़ी देर से ThemeKey का उपयोग कर रहा हूं, यह उपयोगकर्ता के नाम, भूमिका, पृष्ठ, जो भी आप चाहते हैं, उन पर कस्टमाइज़ेशन प्रबंधित करने का सबसे आसान तरीका है। मेरा यही सुझाव है।
बेंज

14

ऐसा करने का सबसे अच्छा तरीका एक मॉड्यूल में अपडेट हुक बनाना है:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}

यह सही उत्तर होना चाहिए ..
निक बैरेट

यह तभी सही होगा जब आप विश्व स्तर पर थीम बदलना चाहते हैं। मैंने इस सवाल से मान लिया था कि ओपी किसी विशेष पृष्ठ पर, या किसी विशेष संदर्भ में विषय को बदलना चाहता है।
इवान डोनोवन

7

Drush के माध्यम से सक्रिय विषय बदलना

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

एक मॉड्यूल के माध्यम से सक्रिय विषय को बदलना

डिफ़ॉल्ट विषय और प्रशासन विषय को बदलने की मूल बातें:

// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);

बार्टिक या गारलैंड जैसे ड्रुपल विषयों को डिफ़ॉल्ट रूप से वापस सेट करने के लिए यहां एक छोटा सा कार्य है (Drupal 6 और 7 में परीक्षण किया गया है):

/**
 * Set the active Drupal themes (the default and the administration theme) to default ones.
 * Tested in Drupal 6, 7 (but possibly working in version 8 too according to the documentations [some similarities between 7 and 8]).
 */
function TESTMODULE_set_active_theme_to_default($affect_admin_theme = TRUE) {

  // Provides a list of currently available themes.
  $list_themes = list_themes(TRUE);
  // 6, 7, 8, etc.
  $major_version = (int)VERSION;

  $theme_default = isset($list_themes['bartik']) ? 'bartik' : 'garland';
  $admin_theme   = isset($list_themes['seven']) ? 'seven' : 'garland';

  // Changes the theme to Garland
  variable_set('theme_default', $theme_default);

  // Changes the administration theme to Garland if argument is TRUE
  if($affect_admin_theme){
    variable_set('admin_theme', $admin_theme);
  }

  // if Switchtheme module (https://drupal.org/project/switchtheme) is enabled, use it
  if (module_exists('switchtheme')) {
    if (empty($_GET['theme']) || $_GET['theme'] !== $theme_default) {
      $query = array(
        'theme' => $theme_default
      );
      // in D6, drupal_goto's second argument is the query string,
      // in >=D7, a more general $options array is used
      if($major_version < 7){
        $options = $query;
      }
      else{
        $options = array('query' => $query);
      }

      drupal_goto($_GET['q'], $options);
    }
  }

  drupal_set_message(t('Default theme has been changed to %theme_default, administration theme has been changed to %admin_theme.', array(
    '%theme_default' => $theme_default,
    '%admin_theme' => $admin_theme
  )));

}

आप इसे एक हुक_इनिट () कार्यान्वयन में कह सकते हैं (टिप्पणी के बाद इसकी आवश्यकता नहीं है):

/**
 * Implements hook_init()
 */
function TESTMODULE_init() {  
  // ATTENTION! Comment out the following line if it's not needed anymore!
  TESTMODULE_set_active_theme_to_default();
}

यह वह विधि भी है जिसका उपयोग आप एक प्रोफ़ाइल में एक थीम को सक्षम करते समय करते हैंvariable_set('theme_default','yourtheme');
डंकनमो

7

Drupal 7 में, उपयोग करें hook_custom_theme():

/**
 * Implements hook_custom_theme()
 * Switch theme for a mobile browser
 * @return string The theme to use
 */
function mymodule_custom_theme()  {
    //dpm($_SERVER['HTTP_USER_AGENT']);
    $theme = 'bartik'; // core theme, used as fallback
    $themes_available = list_themes(); // get available themes
    if (preg_match("/Mobile|Android|BlackBerry|iPhone|Windows Phone/", $_SERVER['HTTP_USER_AGENT'])) {
        if (array_key_exists('custommobiletheme', $themes_available)) $theme = 'custommobiletheme';
        else { drupal_set_message("Unable to switch to mobile theme, because it is not installed.", 'warning'); }
    }
    else if (array_key_exists('nonmobiletheme', $themes_available)) $theme = 'nonmobiletheme';
    // else, fall back to bartik

    return $theme;
}

<Emoticode /> से अनुकूलित किया गया

वर्तमान पृष्ठ के लिए उपयोग करने के लिए थीम का मशीन-पठनीय नाम लौटाएं।

इस समारोह के लिए टिप्पणियाँ पढ़ने लायक हो सकती हैं:

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

ध्यान दें कि एक ही पथ के लिए अलग-अलग थीम वापस करने पर पृष्ठ कैशिंग के साथ काम नहीं कर सकता है। यह एक समस्या है यदि किसी दिए गए पथ पर एक अनाम उपयोगकर्ता विभिन्न स्थितियों के तहत लौटाए जा सकने वाले अलग-अलग विषय हो सकता है।

चूँकि एक समय में केवल एक ही थीम का उपयोग किया जा सकता है, अंतिम (यानी, सबसे अधिक भारित) मॉड्यूल जो इस हुक से एक वैध थीम नाम देता है, प्रबल होगा।


3

ड्रुपल 8 के लिए:

सेटिंग्स में

$config['system.theme']['default'] = 'my_custom_theme';

प्रोग्रामेटिक रूप से अपडेट करें:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.