正确的方法以编程方式更改主动Drupal主题? -- theming 领域 和 6 领域 drupal 相关 的问题

Correct way to change the active Drupal theme programmatically?


23
vote

问题

中文

以编程方式更改主动渣元主题的正确方法是什么?

英文原文

What is the correct way to change the active Drupal theme programmatically?

     

回答列表

16
 
vote
vote
最佳答案
 

drupal 6解决方案:

要确保更改全局 <代码> $custom_theme 在页面执行中相当早期的变量。

  global $custom_theme; $custom_theme = 'garland';   
 

Drupal 6 solution:

You want to make sure you change the global $custom_theme variable fairly early in page execution.

global $custom_theme; $custom_theme = 'garland'; 
 
 
         
         
16
 
vote

我知道你询问了如何进行程序,但如果在那是你的解决方案,而不是实际问题,你也可以使用 themekey模块。这允许您设置在满足时更改主题时的条件。您可以根据路径,分类,内容类型,创建或编辑日期等条件。您还可以添加在 tumpekeity properties module 模块中以获得更多选项。

再次,我知道这不是编程的,但我不确定你的问题背后的真正问题是如何根据条件改变主题。

 

I know you asked how to do it programattically, but in case that's your solution, not the actual problem, you can also use the ThemeKey module. This allows you to set conditions which, when met, changes the theme. You can make conditions based on paths, taxonomy, content type, create or edit date and more. You can also add in the Themekey Properties module module to get even more options.

Again, I know this isn't programmattically, but I'm not sure if the real question behind your question is how to change themes based on conditions.

 
 
     
     
15
 
vote

这样做的最佳方法是在模块中创建更新挂钩:

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

The best way to do this is to create an update hook in a module:

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

通过疏水润发更改活动主题

  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);   

这是一个小功能,可以安全地将主题设置为默认的笨蛋主题,如Bartik或Garland(在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   )));  }   

您可以将其称为 hook_init()实施(在不需要之后注释出来):

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

Changing the active theme via Drush

drush vset theme_default garland drush vset admin_theme garland drush cc all 

Changing the active theme via a module

The basics of changing the default theme and administration theme:

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

Here's a small function to set back the themes safely to default Drupal themes like Bartik or Garland (tested in Drupal 6 and 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   )));  } 

You can call it in a hook_init() implementation (comment it out after it's not needed):

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

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

改编自&lt; emoticode /&gt;

返回主题的机器可读名称以用于当前页面。

此功能的注释可能值得读取:

此挂钩可用于动态设置电流的主题 页面要求。它应该由需要覆盖的模块使用 基于动态条件的主题(例如,允许的模块 基于当前用户的角色设置的主题)。 回报 除了有一个页面之外,将在所有页面上使用此钩子的值 通过主题回调函数设置有效的每页或每页主题 在hook_menu();这些页面上的主题只能被覆盖使用 hook_menu_alter()。

请注意,同一路径返回不同的主题可能无法正常工作 使用页面缓存。如果匿名的话,这最有可能是一个问题 给定路径上的用户可能会返回不同的主题 不同的条件。

因为只有一个主题可以一次使用,最后一个(即,最高的 加权)模块从此挂钩返回有效主题名称 占上风。

 

In Drupal 7, use 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; } 

Adapted from <emoticode />

Return the machine-readable name of the theme to use for the current page.

The comments for this function may be worth reading:

This hook can be used to dynamically set the theme for the current page request. It should be used by modules which need to override the theme based on dynamic conditions (for example, a module which allows the theme to be set based on the current user's role). The return value of this hook will be used on all pages except those which have a valid per-page or per-section theme set via a theme callback function in hook_menu(); the themes on those pages can only be overridden using hook_menu_alter().

Note that returning different themes for the same path may not work with page caching. This is most likely to be a problem if an anonymous user on a given path could have different themes returned under different conditions.

Since only one theme can be used at a time, the last (i.e., highest weighted) module which returns a valid theme name from this hook will prevail.

 
 
4
 
vote

用于Drupal 8:

在settings.php

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

更新配置方式:

  global $custom_theme; $custom_theme = 'garland'; 0  
 

For Drupal 8:

In settings.php

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

Update config programatically:

\Drupal::configFactory() ->getEditable('system.theme') ->set('default', 'my_custom_theme') ->save(); 
 
 
 
 

相关问题

4  如何使用子主题覆盖主题的Template.php的单一函数?  ( How to override single function of themes template php using sub theme ) 
目标: drupal 7子主题开发 我不想覆盖整个template.php文件。我只是想覆盖template.php文件的单一函数。 ...

3  如何处理博客标签在贡献主题中?  ( How to handle blog tags in a contrib theme ) 
在博客或博客的网站中,分类通常用于标签和类别。 在Drupal 6中,Node.TPL.php文件可以使用$分类系统,如果它们需要访问与当前节点相关联的UnRended分类链接数组。该变量通常是通过Control主题假设来包含帖子标记和或类别,并且相应地呈现。 在Drupal 7中,$分类学不再可用。 是什么选择...

11  hook_preprocess_page():如何讲述视图页面?  ( Hook preprocess page how to tell a views page ) 
im写一个需要在视图页面中插入一些javascript和css文件的自定义模块。 im使用hook_preprocess_page,但我无法判断当前页面是否来自视图: function mymodule_preprocess_page(&vars) { var_dump($vars); //outpu...

5  视图幻灯片VS列表视图+ jQuery Cycle Lite?  ( Views slideshow vs list viewjquery cycle lite ) 
在我的工作站主页上的旋转图像是以列表格式的视图创建。我正在使用 jquery循环Lite 插件,用于旋转效果。 CycliT.Lite.js文件在我的主题的.info文件中的脚本数组中设置,页面中有一点代码.TPL.php检查这是否是主页,如果是,则设置旋转器。< / p> 现在我正在第二个旋转器用于另一个部分,我一...

51  如何使用模板文件来主题表单?  ( How to a use a template file to theme a form ) 
虽然drupal中的节点,注释,块和许多其他东西使用主题模板文件(如node.tpl.php)主题,表单是一个不同的故事。表单没有主题模板文件。如何获得特定的表单来使用自定义主题模板? ...

5  从Drupal表单字段/标签中删除冒号  ( Remove colons from drupal form fields labels ) 
如何删除:从使用Drupal形式API制作的表单后出现: ...

5  主题Drupal表单API复选框作为网格  ( Theme drupal form api checkboxes as a grid ) 
我有一个自定义表单,显示大约2多个复选框的表单元素。如果可能,我想在表中每行输出3个。我怎么能做到这一点? $form['preference'] = array( '#type' => 'checkboxes', '#default_value' => 1373, '#require...

11  如何转换WordPress主题? [关闭]  ( How do i convert a wordpress theme ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并通过编辑此帖的问题。 关闭 2个月前。 ...

2  如何在节点/编辑页面上加载用hook_library()定义的库?  ( How do i load a library defined with hook library on node edit pages ) 
我已经定义了使用 hook_library() 的模块函数所需的JavaScript文件和CSS文件库。 如何在节点/编辑页面上加载此库? ...

8  移动设备的主题  ( Theme for mobile devices ) 
我希望Android,iPhone和其他移动平台可访问我的部位。是否有一个特定的主题我应该从中开始,或者我应该在一个主题中寻找的东西,除了干净简单吗? 我会更好地从头开始创造主题吗? ...

3  我该如何升级自定义主题?  ( How should i upgrade a customized theme ) 
我已经对我的主题文件模板,CSS和TPL文件进行了一些自定义更改。是否有最好的实践方法,在上传新主题之后通过线路并重新插入我的自定义更改以外更新主题的方法? 有没有更好的方法可以在未来接近这个? ...

5  定制登录/注册的最佳方法  ( Best method for custom login register ) 
我想创建一个自定义登录名和寄存器页面。我希望两种表格在彼此上方的模板的内容区域中显示在正面上,而不是在单独的节点上。此外,我想尝试重复使用已存在的代码以验证表单。 我已经四处寻找并找到了不同的方式来实现这一目标,所以我想知道做这个问题的最佳方法。案例块,模块或模板或......? 将欣赏到内容或特定示例的链接。 ...

1  使用打印机,电子邮件和PDF版本模块打印内容窗格  ( Printing a content pane with printer email and pdf versions module ) 
我正试图确定如何将内容窗格添加到与自定义tpl.php文件添加到打印版本的自定义tpl.php文件。我之前用过这个块完成了这个,添加了我需要用块打印出来的区域,但在这种情况下,我认为我不认为我可以打印出"content_bottom" 等。 ...

5  从给定页面删除特定样式表  ( Remove specific stylesheets from a given page ) 
将样式表添加到特定页面很简单:实现 hook_preprocess_page() ,呼叫 drupal_add_css(...) 并设置 $vars['styles'] = drupal_get_css() 。 但是,删除的适当方法一个样式表(或在我的情况下,所有的"媒体=屏幕" 样式表),而不会干扰缓存系统? (...

4  在模块中覆盖视图表布局  ( Overriding a view table layout in module ) 
我正在尝试从我的模块中覆盖视图表。我无法找到参数的假设是什么,并以什么顺序(对于我的hook_theme func)。我从视图/主题复制了主题文件,没有修改。有谁知道出现了什么问题,以及争论值应该是什么? 我的主题配置目前: 'views_view_table__opportunities_mentions' =...

2  如何将宽度提高到Omega子主题超过950个可用像素  ( How to increase the width to the omega sub theme more than 950 usable pixels ) 
我在Drupal 7中创建了omega主题(版本7.x-2.1)的新子主题。 但我想使用970个可用像素而不是950像素作为"默认容器宽度" 中的子主题。 我该怎么办?我是否应该从主题/ omega / omega / css / 960.css 更改960.css文件。或者我应该覆盖960.css文件形成我的子主...

2  hook_preprocess_page:“node_load()+ node_page_view()”Versus“%节点+ node_page_view()”  ( Hook preprocess page node load node page view versus node node page ) 
存在基本节点(NID"123" ),并且使用 hook_menu :注册了两个路径的模块 first/%node second 两个页面回调使用 node_page_view($node) 要显示节点的全部页面视图,除了第二个回调还使用 99887668 以获得 $node 。 因此 <div ...

3  如何使用条件逻辑在Page.tpl.php中显示<div>,基于节点ID?  ( How can i use conditional logic to not display a div in page tpl php based on ) 
我正在使用包含面板"禁用Drupal块/区域" 设置的区域的区域。我尝试在PHP中删除使用if语句,但我的php语法是错误的,或者我不使用正确的drupal变量。现在,该部分如下所示: <?php if ($node->nid != 51) { echo '<div id="left">'...

7  Drupal 7中的主题_Menu_Item是什么?  ( What is the equivalent of theme menu item in drupal 7 ) 
我知道在drupal 6存在: theme_menu_item ,但在drupal 7中没有。是否有替换,以便我修改主系统菜单的输出? 实际上我想做一个菜单项的过滤器,具体取决于一些标准,我将设置在功能中。 ...

39  如何根据URL更改主题?  ( How do i change a theme based on the url ) 
我有一个在example.org上运行的drupal实例。安装和激活了主题x。现在,有限时期,一个事件应该在网站上举行,该网站是一个特殊部分已被"雕刻出来" 。与该事件相关的所有事情都将转到example.org/event2011。 我想在查看本节下的页面时要显示不同的主题(例如 http://example.o...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.