Comment définir par programmation la première page?

22

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?

Ek Kosmos
la source

Réponses:

22

Vous pouvez l'utiliser variable_set()pour cela.

variable_set('site_frontpage', $value);
Rafael Caceres
la source
18
C'est correct, mais ce n'est pas quelque chose qui devrait être fait trop fréquemment ou basé sur une action d'utilisation. Un appel variable_set () entraîne toujours "cache_clear_all ('variables', 'cache_bootstrap');" de sorte que la prochaine demande devra récupérer à nouveau les variables et les informations d'amorçage de la base de données.
Berdir
1
@Berdir - cela affecte en quelque sorte les performances du site?
Ek Kosmos
7
Oui, cela affectera les performances, cache_bootstrap contient plusieurs caches qui ne seront reconstruits qu'au fil du temps, par exemple les implémentations de hook. Des solutions alternatives consisteraient à utiliser des vues, des panneaux ou un module personnalisé pour afficher dynamiquement le contenu sur la première page. Par exemple, vous pouvez créer une vue pour afficher le nœud le plus récent d'un type de contenu, puis pointer site_frontpage vers celui-ci.
Berdir
L'utiliser dans un hook_installou hook_update_Nensuite devrait être bien.
leymannx
16

Il existe un module ( Frontpage , qui est 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 sont autorisés à modifier l'URL de redirection uniquement 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);
  }
}
kiamlaluno
la source
9

Une solution très flexible serait d'utiliser des panneaux . Différents affichages peuvent être présentés en fonction de tous les critères et sont contrôlés via une interface utilisateur.

tim.plunkett
la source
4

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);
  }
}
r0ber
la source
1
Bonjour. Ravi de partager votre code. Ce serait encore mieux si vous pouviez nous dire exactement comment votre code le corrige. Vous savez, le raisonnement que les autres peuvent suivre si, pour une raison quelconque, le code copié-collé ne fonctionne pas pour eux.
Mołot
@molot - cette méthode, qui devrait être ajoutée à votre module personnalisé, implémente hook_page_alteret utilise drupal_is_front_pagepour rediriger les utilisateurs, en utilisant drupal_goto, en fonction de certaines conditions (dans ce cas $ user-> uid ne doit pas être 0)
commonpike
@commonpike ce n'est pas que je ne le comprends pas. Mon commentaire portait sur la qualité globale de la réponse, et en particulier sur sa convivialité pour les nouveaux utilisateurs inexpérimentés.
Mołot
1

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 lors de la redirection des utilisateurs connectés (authentifiés) vers une page d'accueil différente à l'aide de règles ou de 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".

Pierre.Vriens
la source
1

Si vous cherchez à définir cela globalement par programme, vous pouvez définir la variable dans settings.php:

$conf['site_frontpage'] = 'some/custom/path';
Charlie Schliesser
la source
0

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;
TvC
la source