Як програмно встановити титульну сторінку?


22

Я хочу встановити передню сторінку Drupal програмно під час виконання.
Як я можу це зробити? Чи можливо це?

Відповіді:


22

Ви можете використовувати variable_set()для цього.

variable_set('site_frontpage', $value);

18
Це правильно, але це не те, що слід робити занадто часто або грунтуватися на використанні дії. Виклик змінної_set () завжди призводить до "cache_clear_all ('змінні", "cache_bootstrap"); " тому наступний запит потребуватиме повторного отримання змінних та завантажувальної інформації з бази даних.
Бердір

1
@Berdir - це якось впливає на ефективність сайту?
Ек Космос

7
Так, це вплине на продуктивність, cache_bootstrap містить декілька кеш-пам'яті, які будуть перебудовуватися лише з часом, наприклад реалізація гака. Альтернативними рішеннями було б використання Views, Panels або спеціального модуля для динамічного відображення вмісту на першій сторінці. Наприклад, ви можете створити подання, щоб показати останній вузол типу вмісту, а потім вказати на нього site_frontpage.
Бердір

Використовувати це в a hook_installабо hook_update_Nтоді повинно бути добре.
leymannx

16

Існує модуль ( Frontpage , який є одним із них, який я підтримував), який дозволяє встановлювати різні титульні сторінки для анонімних користувачів та аутентифікованих користувачів. Модуль дозволяє стороннім модулям змінювати сторінку, на яку користувачі замість цього перенаправлені, або змінювати структуру масиву, який використовується для візуалізації сторінки. Сторонні модулі дозволяють змінювати URL-адресу перенаправлення лише тоді, коли титульна сторінка для анонімного або автентифікованого не була встановлена ​​в модулі Frontpage або коли сталася помилка під час завантаження вузла; Модуль, ймовірно, буде змінено в майбутньому, щоб сторонні модулі могли перенаправляти користувачів на певну сторінку, яку вони обрали.

В якості альтернативи ви можете створити спеціальний модуль, який, використовуючи код, аналогічний тому, який використовується Frontpage, перенаправляє користувачів на певну сторінку, спираючись на конкретні критерії.

Модуль повинен реалізовувати прив'язку_меню () та пов'язувати зворотний виклик меню, наприклад, http://example.com/frontpage ; зворотний виклик сторінки цього пункту меню повинен просто перевірити, чи підтверджена умова, а потім перенаправити користувачів на певну URL-адресу.

Скелет коду може бути чимось подібним до наступного:

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

Дуже гнучким рішенням буде використання панелей . Різні дисплеї можуть бути представлені на основі будь-яких критеріїв і керуватися через інтерфейс користувача.


4

Я виправив так:

/**
 * 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
Привіт. Приємно, що ви поділилися своїм кодом. Було б навіть приємніше, якби ви могли сказати нам, як саме ваш код це виправляє. Ви знаєте, міркування інших можуть слідувати, якщо з якоїсь причини вставлений копіюваний код не буде працювати для них.
Молот

@molot - цей метод, який слід додати до вашого користувальницького модуля, застосувань hook_page_alterта застосувань drupal_is_front_pageдля перенаправлення користувачів, використовуючи drupal_goto, виходячи з певної умови (у цьому випадку $ user-> uid не має бути 0)
commonpike

@commonpike - це не те, що я не розумію цього. Мій коментар стосувався загальної якості відповіді, а саме до її зручності використання для нових, недосвідчених користувачів.
Молот

1

Модуль « Правила» також може бути використаний для встановлення фасадної сторінки «програмно».

Насправді правило, яке буде створене, буде варіантом відповіді на Redirect, який увійшов (автентифіковано) користувачів на іншу титульну сторінку, використовуючи правила або php-код .

І, можливо, комбінування його з модулем " Прапор" може, можливо, ще більше покращити роботу користувачів. Наприклад, для користувачів, які ввійшли в систему, щоб вказати, який із можливих фронтальних сторінок вони вважають своїм "улюбленим".


1

Якщо ви хочете програмно встановити це глобально, ви можете встановити змінну в settings.php:

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

0

Я змінив вузол домашньої сторінки (для субдоменів), встановивши змінну в moll_url_outbound_alter ()

variable_set('site_frontpage', $value);

А потім переадресація:

$_GET['q'] = 'node/' . $domain_homepage_node_id;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.