Wie programmiert man die Titelseite?

22

Ich möchte die Drupal-Startseite zur Laufzeit programmgesteuert festlegen.
Wie kann ich das machen? Ist das möglich?

Ek Kosmos
quelle

Antworten:

22

Sie können dafür verwenden variable_set().

variable_set('site_frontpage', $value);
Rafael Caceres
quelle
18
Dies ist richtig, sollte jedoch nicht zu häufig oder auf der Grundlage einer Verwendungsaktion durchgeführt werden. Ein Aufruf von variable_set () führt immer zu "cache_clear_all ('variables', 'cache_bootstrap');" Bei der nächsten Anforderung müssen die Variablen und die Bootstrap-Informationen erneut aus der Datenbank abgerufen werden.
Berdir
1
@Berdir - wirkt sich das irgendwie auf die Site-Performance aus?
Ek Kosmos
7
Ja, dies wirkt sich auf die Leistung aus. Cache_bootstrap enthält mehrere Caches, die nur im Laufe der Zeit wiederhergestellt werden, z. B. Hook-Implementierungen. Alternative Lösungen wären die Verwendung von Ansichten, Bedienfeldern oder einem benutzerdefinierten Modul zur dynamischen Anzeige von Inhalten auf der Startseite. Sie können beispielsweise eine Ansicht erstellen, um den neuesten Knoten eines Inhaltstyps anzuzeigen, und dann site_frontpage darauf verweisen.
Berdir
Verwenden Sie dies in einem hook_installoder hook_update_Ndann sollte in Ordnung sein.
Leymannx
16

Es gibt ein Modul ( Frontpage , das ich gepflegt habe), mit dem Sie eine andere Frontpage für anonyme Benutzer und authentifizierte Benutzer einrichten können. Das Modul ermöglicht es Modulen von Drittanbietern, die Seite zu ändern, zu der die Benutzer umgeleitet werden, oder das Strukturarray zu ändern, das zum Rendern der Seite verwendet wird. Module von Drittanbietern dürfen die Umleitungs-URL nur ändern, wenn die Startseite für anonym oder authentifiziert im Frontpage-Modul nicht festgelegt wurde oder wenn beim Laden des Knotens ein Fehler aufgetreten ist. Das Modul wird wahrscheinlich in Zukunft geändert, damit Module von Drittanbietern die Benutzer zu einer bestimmten von ihnen ausgewählten Seite umleiten können.

Alternativ können Sie ein benutzerdefiniertes Modul erstellen, das mit einem Code ähnlich dem von Frontpage verwendeten Code Benutzer auf eine bestimmte Seite umleitet, wobei bestimmte Kriterien zugrunde gelegt werden.

Das Modul sollte hook_menu () implementieren und einen Menü-Callback beispielsweise mit http://example.com/frontpage verknüpfen . Der Seitenrückruf dieses Menüelements sollte einfach überprüfen, ob eine Bedingung überprüft wurde, und die Benutzer dann zu einer bestimmten URL umleiten.

Das Code-Gerüst könnte etwa so aussehen:

/**
 * 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
quelle
9

Eine sehr flexible Lösung wäre die Verwendung von Panels . Verschiedene Anzeigen können basierend auf beliebigen Kriterien dargestellt und über eine Benutzeroberfläche gesteuert werden.

tim.plunkett
quelle
4

Das habe ich so behoben:

/**
 * 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
quelle
1
Hallo. Schön, dass Sie Ihren Code teilen. Wäre noch schöner, wenn Sie uns mitteilen könnten, wie genau Ihr Code dies behebt. Sie wissen, dass andere argumentieren können, wenn kopierter Code aus irgendeinem Grund für sie nicht funktioniert.
Mołot
@molot - Diese Methode, die zu Ihrem benutzerdefinierten Modul hinzugefügt, implementiert hook_page_alterund verwendet werden sollte drupal_is_front_page, um Benutzer umzuleiten, unter Verwendung von drupal_goto(in diesem Fall sollte $ user-> uid nicht 0 sein)
commonpike 21.04.15
@commonpike es ist nicht so, dass ich es nicht verstehe. In meinem Kommentar ging es um die Qualität der Antwort insgesamt und insbesondere um die Benutzerfreundlichkeit für neue, unerfahrene Benutzer.
Mołot
1

Das Modul Regeln kann auch verwendet werden, um die Startseite "programmgesteuert" einzustellen.

Die tatsächlich zu erstellende Regel wäre eine Variation der bei Redirect angemeldeten (authentifizierten) Benutzer auf eine andere Startseite mittels Regeln oder PHP-Code .

Wenn Sie es optional mit dem Flag- Modul kombinieren , wird die Benutzerfreundlichkeit möglicherweise weiter verbessert. ZB für eingeloggte Benutzer, um anzugeben, welche der möglichen Frontpages sie als "Favorit" betrachten.

Pierre.Vriens
quelle
1

Wenn Sie dies global programmgesteuert festlegen möchten, können Sie die Variable in settings.php festlegen:

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

Ich habe den Homepage-Knoten (auf Subdomains) geändert, indem ich die Variable in a gesetzt habe hook_url_outbound_alter () gesetzt habe.

variable_set('site_frontpage', $value);

Und dann umleiten:

$_GET['q'] = 'node/' . $domain_homepage_node_id;
TVC
quelle