Jak programowo ustawić pierwszą stronę?

22

Chcę ustawić stronę główną Drupal programowo w czasie wykonywania.
W jaki sposób mogę to zrobić? czy to możliwe?

Ek Kosmos
źródło

Odpowiedzi:

22

Możesz variable_set()do tego użyć .

variable_set('site_frontpage', $value);
Rafael Caceres
źródło
18
Jest to poprawne, ale nie należy tego robić zbyt często lub w oparciu o akcję use. Wywołanie zmiennej_set () zawsze powoduje „cache_clear_all („ zmienne ”,„ cache_bootstrap ”);” więc następne żądanie będzie musiało ponownie pobrać zmienne i informacje dotyczące ładowania początkowego z bazy danych.
Berdir,
1
@Berdir - wpływa to w jakiś sposób na wydajność witryny?
Ek Kosmos,
7
Tak, wpłynie to na wydajność, cache_bootstrap zawiera wiele pamięci podręcznych, które z czasem zostaną odbudowane, na przykład implementacje hook. Alternatywnym rozwiązaniem byłoby użycie widoków, paneli lub niestandardowego modułu do dynamicznego wyświetlania treści na stronie głównej. Na przykład możesz zbudować widok pokazujący najnowszy węzeł typu zawartości, a następnie wskazać na to stronę site_front.
Berdir,
Korzystanie z tego w sposób hook_installalbo hook_update_Nczym powinno być dobrze.
leymannx
16

Istnieje moduł ( Frontpage , który utrzymałem), który pozwala ustawić inną stronę główną dla użytkowników anonimowych i użytkowników uwierzytelnionych. Moduł umożliwia modułom zewnętrznym modyfikowanie strony, do której przekierowywani są użytkownicy, lub modyfikowanie tablicy struktury używanej do renderowania strony. Moduły innych firm mogą zmieniać adres URL przekierowania tylko wtedy, gdy strona główna anonimowego lub uwierzytelnionego nie została ustawiona w module Frontpage lub gdy wystąpił błąd podczas ładowania węzła; moduł prawdopodobnie zostanie zmieniony w przyszłości, aby umożliwić modułom zewnętrznym przekierowywanie użytkowników na wybraną stronę.

Alternatywnie możesz utworzyć niestandardowy moduł, który za pomocą kodu podobnego do tego używanego przez Frontpage przekierowuje użytkowników na określoną stronę w oparciu o określone kryteria.

Moduł powinien zaimplementować hook_menu () i powiązać wywołanie zwrotne menu na przykład z http://example.com/frontpage ; wywołanie zwrotne strony tego elementu menu powinno po prostu zweryfikować, czy warunek jest zweryfikowany, a następnie przekierować użytkowników do określonego adresu URL.

Szkielet kodu może być podobny do następującego:

/**
 * 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
źródło
9

Bardzo elastycznym rozwiązaniem byłoby użycie paneli . Różne wyświetlacze mogą być prezentowane w oparciu o dowolne kryteria i są kontrolowane przez interfejs użytkownika.

tim.plunkett
źródło
4

Naprawiłem tak:

/**
 * 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
źródło
1
Witaj. Miło z twojej strony, że udostępniasz swój kod. Byłoby jeszcze przyjemniej, gdybyś mógł nam powiedzieć, jak dokładnie Twój kod to naprawia. Wiesz, rozumowanie innych może być przestrzegane, jeśli z jakiegoś powodu skopiowany kod nie będzie dla nich działał.
Mołot
@molot - ta metoda, którą należy dodać do niestandardowego modułu, implementuje hook_page_alteri używa drupal_is_front_pagedo przekierowywania użytkowników, używając drupal_goto, w oparciu o pewne warunki (w tym przypadku $ user-> uid nie powinien wynosić 0)
commonpike
@commonpike to nie tak, że tego nie rozumiem. Mój komentarz dotyczył ogólnej jakości odpowiedzi, a zwłaszcza jej użyteczności dla nowych, niedoświadczonych użytkowników.
Mołot
1

Zasady moduł może być stosowany również do ustawienia FrontPage „programowo”.

Właściwie tworzona reguła byłaby odmianą odpowiedzi w Przekieruj zalogowanych (uwierzytelnionych) użytkowników na inną stronę główną za pomocą reguł lub kodu php .

Opcjonalnie połączenie go z modułem Flag może jeszcze bardziej poprawić wrażenia użytkownika. Np. Dla zalogowanych użytkowników, aby wskazać, które z możliwych stron internetowych uważają za „ulubione”.

Pierre.Vriens
źródło
1

Jeśli chcesz programowo ustawić to globalnie, możesz ustawić zmienną w settings.php:

$conf['site_frontpage'] = 'some/custom/path';
Charlie Schliesser
źródło
0

Zmieniłem węzeł strony głównej (w subdomenach), ustawiając zmienną w hook_url_outbound_alter ()

variable_set('site_frontpage', $value);

A następnie przekierowanie:

$_GET['q'] = 'node/' . $domain_homepage_node_id;
TvC
źródło