Come impostare programmaticamente la prima pagina?


22

Voglio impostare la prima pagina di Drupal a livello di codice in fase di esecuzione.
Come posso fare questo? È possibile?

Risposte:


22

Puoi usarlo variable_set()per questo.

variable_set('site_frontpage', $value);

18
Questo è corretto, ma non è qualcosa che dovrebbe essere fatto troppo frequentemente o sulla base di un'azione d'uso. Una chiamata variabile_set () si traduce sempre in "cache_clear_all ('variabili', 'cache_bootstrap');" quindi la prossima richiesta dovrà recuperare nuovamente le variabili e le informazioni di bootstrap dal database.
Berdir,

1
@Berdir - questo influenza in qualche modo le prestazioni del sito?
Ek Kosmos,

7
Sì, influirà sulle prestazioni, cache_bootstrap contiene più cache che verranno ricostruite solo nel tempo, ad esempio le implementazioni hook. Soluzioni alternative sarebbero l'utilizzo di viste, pannelli o un modulo personalizzato per visualizzare dinamicamente il contenuto sulla prima pagina. Ad esempio, è possibile creare una vista per mostrare il nodo più recente di un tipo di contenuto e quindi puntare site_frontpage a quello.
Berdir,

Usarlo in un hook_installo hook_update_Npoi dovrebbe andare bene.
leymannx,

16

Esiste un modulo ( Frontpage , che è quello che ho mantenuto) che consente di impostare una prima pagina diversa per utenti anonimi e utenti autenticati. Il modulo consente ai moduli di terze parti di modificare la pagina a cui vengono invece reindirizzati gli utenti o di modificare l'array della struttura utilizzato per eseguire il rendering della pagina. I moduli di terze parti sono autorizzati a modificare l'URL di reindirizzamento solo quando la pagina iniziale per anonimo o autenticato non è stata impostata nel modulo Frontpage o quando si è verificato un errore durante il caricamento del nodo; il modulo verrà probabilmente modificato in futuro per consentire ai moduli di terze parti di reindirizzare gli utenti a una pagina specifica selezionata.

In alternativa, è possibile creare un modulo personalizzato che, utilizzando un codice simile a quello utilizzato da Frontpage, reindirizza gli utenti a una pagina specifica, basandosi su criteri specifici.

Il modulo dovrebbe implementare hook_menu () e associare un callback di menu, ad esempio, http://example.com/frontpage ; il callback di quella voce di menu dovrebbe semplicemente verificare che una condizione sia verificata, quindi reindirizzare gli utenti a un URL specifico.

Lo scheletro del codice potrebbe essere qualcosa di simile al seguente:

/**
 * 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);
  }
}

9

Una soluzione molto flessibile sarebbe quella di utilizzare i pannelli . Display diversi possono essere presentati in base a qualsiasi criterio ed è controllato tramite un'interfaccia utente.


4

Ho risolto in questo modo:

/**
 * 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);
  }
}

1
Ciao. Gentile da parte tua condividere il tuo codice. Sarebbe ancora più bello se potessi dirci come esattamente il tuo codice lo risolve. Sai, il ragionamento che altri possono seguire se per qualche ragione il codice incollato non funzionerà per loro.
Mołot,

@molot - questo metodo, che dovrebbe essere aggiunto al tuo modulo personalizzato, implementa hook_page_altere usa drupal_is_front_pageper reindirizzare gli utenti, usando drupal_goto, in base a una condizione (in questo caso $ user-> uid non dovrebbe essere 0)
commonpike

@commonpike non è che non lo capisca. Il mio commento riguardava la qualità generale della risposta, e in particolare la sua usabilità per i nuovi utenti inesperti.
Mołot,

1

Il modulo Regole può essere utilizzato anche per impostare la pagina iniziale "a livello di programmazione".

La regola effettivamente da creare, sarebbe una variante della risposta di Redirect che ha effettuato l'accesso (autenticato) agli utenti a una prima pagina diversa usando le regole o il codice php .

E opzionalmente combinandolo con il modulo Flag , potrebbe eventualmente migliorare ulteriormente l'esperienza dell'utente. Ad esempio per gli utenti che hanno effettuato l'accesso per indicare quale delle possibili prime pagine considerano il loro "preferito".


1

Se stai cercando di impostarlo programmaticamente a livello globale, puoi impostare la variabile in settings.php:

$conf['site_frontpage'] = 'some/custom/path';

0

Ho modificato il nodo della home page (nei sottodomini) impostando la variabile in hook_url_outbound_alter ()

variable_set('site_frontpage', $value);

E quindi reindirizzare:

$_GET['q'] = 'node/' . $domain_homepage_node_id;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.