Как программно установить титульную страницу?

22

Я хочу установить главную страницу Drupal программно во время выполнения.
Как я могу это сделать? Это возможно?

Эк Космос
источник

Ответы:

22

Вы можете использовать variable_set()для этого.

variable_set('site_frontpage', $value);
Рафаэль Касерес
источник
18
Это правильно, но это не то, что должно быть сделано слишком часто или основано на действии использования. Вызов variable_set () всегда приводит к "cache_clear_all ('variable', 'cache_bootstrap');" поэтому при следующем запросе необходимо будет повторно извлечь переменные и информацию о начальной загрузке из базы данных.
Бердир
1
@Berdir - это как-то влияет на производительность сайта?
Эк Космос
7
Да, это повлияет на производительность, cache_bootstrap содержит несколько кэшей, которые будут перестраиваться только с течением времени, например, реализации ловушек. Альтернативные решения будут использовать виды, панели или пользовательский модуль для динамического отображения контента на главной странице. Например, вы можете создать представление, чтобы показать самый последний узел типа контента, а затем указать на него site_frontpage.
Бердир
Использование этого в hook_installили hook_update_Nтогда должно быть хорошо.
Leymannx
16

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

В качестве альтернативы вы можете создать собственный модуль, который, используя код, похожий на тот, который используется Frontpage, перенаправляет пользователей на определенную страницу, основываясь на определенных критериях.

Модуль должен реализовывать hook_menu () и связывать обратный вызов меню, например, с 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

Очень гибким решением будет использование панелей . Различные отображения могут быть представлены на основе любых критериев, и управляется через пользовательский интерфейс.

tim.plunkett
источник
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);
  }
}
r0ber
источник
1
Здравствуйте. Хорошо, что вы поделились своим кодом. Было бы еще лучше, если бы вы могли рассказать нам, как именно ваш код это исправляет. Вы знаете, что другие могут следовать, если по какой-то причине скопированный код не будет работать для них.
Молот
@molot - этот метод, который должен быть добавлен в ваш пользовательский модуль, реализует hook_page_alterи использует drupal_is_front_pageдля перенаправления пользователей, используя drupal_goto, исходя из некоторых условий (в данном случае $ user-> uid не должно быть 0)
commonpike
@ commonpike это не значит, что я этого не понимаю. Мой комментарий касался качества ответа в целом и, в частности, его удобства для новых, неопытных пользователей.
Молот
1

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

Фактически создаваемое правило будет представлять собой вариант ответа в Redirect, вошедших в систему (прошедших проверку) пользователей на другой главной странице с использованием правил или кода php .

И, при желании, объединение его с модулем « Флаг » может улучшить пользовательский опыт. Например, для зарегистрированных пользователей, чтобы указать, какие из возможных лицевых страниц они считают своими «любимыми».

Pierre.Vriens
источник
1

Если вы хотите программно установить это глобально, вы можете установить переменную в settings.php:

$conf['site_frontpage'] = 'some/custom/path';
Чарли Шлиссер
источник
0

Я изменил узел домашней страницы (на поддоменах), установив переменную в hook_url_outbound_alter ()

variable_set('site_frontpage', $value);

И затем перенаправление:

$_GET['q'] = 'node/' . $domain_homepage_node_id;
ТВЦ
источник