Je veux définir la page d'accueil Drupal par programme au moment de l'exécution).
Comment puis-je faire ceci? Est-ce possible?
Vous pouvez utiliser variable_set()
pour cela.
variable_set('site_frontpage', $value);
Il existe un module ( Frontpage , celui que j'ai maintenu) qui permet de définir une page d'accueil différente pour les utilisateurs anonymes et les utilisateurs authentifiés. Le module permet à des modules tiers de modifier la page vers laquelle les utilisateurs sont redirigés ou de modifier le tableau de structure utilisé pour rendre la page. Les modules tiers ne sont autorisés à modifier l'URL de redirection que lorsque la page d'accueil pour anonyme ou authentifié n'a pas été définie dans le module Frontpage, ou lorsqu'une erreur s'est produite lors du chargement du nœud; le module sera probablement modifié à l'avenir pour permettre aux modules tiers de rediriger les utilisateurs vers une page spécifique qu'ils sélectionnent.
Comme alternative, vous pouvez créer un module personnalisé qui, en utilisant un code similaire à celui utilisé par Frontpage, redirige les utilisateurs vers une page spécifique, en fonction de critères spécifiques.
Le module doit implémenter hook_menu () et associer un rappel de menu à, par exemple, http://example.com/frontpage ; le rappel de page de cet élément de menu doit simplement vérifier qu'une condition est vérifiée, puis rediriger les utilisateurs vers une URL spécifique.
Le squelette de code pourrait être quelque chose de semblable au suivant:
/**
* 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);
}
}
Une solution très flexible serait d'utiliser Panels . Différents affichages peuvent être présentés en fonction de tous les critères et sont contrôlés via une interface utilisateur.
J'ai corrigé comme ceci:
/**
* 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);
}
}
Le module Rules peut également être utilisé pour définir la page d'accueil "par programme".
La règle à créer serait une variante de la réponse à Rediriger les utilisateurs connectés (authentifiés) vers une page d'accueil différente en utilisant des règles ou du code php .
Et éventuellement le combiner avec le module Flag , pourrait éventuellement améliorer encore l'expérience utilisateur. Par exemple, pour les utilisateurs connectés pour indiquer laquelle des premières pages possibles ils considèrent comme leur "favori".
Si vous cherchez à définir cela globalement par programme, vous pouvez définir la variable dans settings.php:
$conf['site_frontpage'] = 'some/custom/path';
J'ai modifié le nœud de la page d'accueil (sur les sous-domaines) en définissant la variable dans un hook_url_outbound_alter ()
variable_set('site_frontpage', $value);
Et puis rediriger:
$_GET['q'] = 'node/' . $domain_homepage_node_id;