我想在运行时以编程方式设置Drupal主页。
我怎样才能做到这一点?这可能吗?
我想在运行时以编程方式设置Drupal主页。
我怎样才能做到这一点?这可能吗?
Answers:
您可以使用variable_set()
它。
variable_set('site_frontpage', $value);
hook_install
或hook_update_N
之后使用此选项应该没问题。
有一个模块(Frontpage,我维护了一个模块),该模块允许为匿名用户和经过身份验证的用户设置不同的首页。该模块允许第三方模块更改将用户重定向到的页面,或更改用于呈现页面的结构数组。仅当未在Frontpage模块中设置匿名或已认证的首页或在节点加载过程中发生错误时,才允许第三方模块更改重定向URL。该模块将来可能会更改,以允许第三方模块将用户重定向到他们选择的特定页面。
或者,您可以创建一个自定义模块,该模块使用类似于Frontpage的代码,根据特定条件将用户重定向到特定页面。
该模块应实现hook_menu()并将菜单回调关联到例如http://example.com/frontpage;该菜单项的页面回调应仅验证条件是否经过验证,然后将用户重定向到特定的URL。
代码框架可能类似于以下内容:
/**
* Implements hook_menu().
*/
function mymodule_menu() {
$items = array();
$items['frontpage'] = array(
'page callback' => 'mymodule_frontpage_view',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function mymodule_frontpage_view() {
// These variables can be useful to redirect the users
// to specific pages, basing on the language currently set for
// the content, or on the fact the user is logged in.
$langcode = $GLOBALS['language_content']->language;
$logged_in = user_is_logged_in();
if ($condition) {
drupal_goto($redirect);
}
}
我固定像这样:
/**
* Implements hook_page_alter.
* @param type $page
*/
function my_module_page_alter(&$page){
global $user;
$is_fron_page = drupal_is_front_page();
if($is_fron_page && $user->uid){
$redirect = 'users/'.$user->name.'/my-argument';
drupal_goto($redirect);
}
}
hook_page_alter
并用于根据某种条件使用drupal_is_front_page
来重定向用户drupal_goto
(在这种情况下,$ user-> uid不应为0)
该规则模块还可以用于设置FrontPage中的“编程”。
实际要创建的规则是使用规则或php代码将登录(经过身份验证的)用户重定向到其他首页的答案的变体。
并可选地将其与Flag模块结合使用,可能会进一步增强用户体验。例如,用于登录的用户指示他们将哪些可能的首页视为其“收藏夹”。
如果要通过编程方式全局设置此值,可以在settings.php中设置变量:
$conf['site_frontpage'] = 'some/custom/path';
我通过在hook_url_outbound_alter()中设置变量来更改了主页节点(在子域上)
variable_set('site_frontpage', $value);
然后重定向:
$_GET['q'] = 'node/' . $domain_homepage_node_id;