Como definir programaticamente a primeira página?

22

Quero definir a primeira página do Drupal programaticamente em tempo de execução.
Como posso fazer isso? Isso é possível?

Ek Kosmos
fonte

Respostas:

22

Você pode usar variable_set()para isso.

variable_set('site_frontpage', $value);
Rafael Caceres
fonte
18
Isso está correto, mas não é algo que deva ser feito com muita frequência ou com base em uma ação de uso. Uma chamada variable_set () sempre resulta em "cache_clear_all ('variable', 'cache_bootstrap');" portanto, a próxima solicitação precisará buscar novamente as variáveis ​​e as informações de autoinicialização do banco de dados.
Berdir
1
@ Berdir - isso afeta de alguma forma o desempenho do site?
Ek Kosmos
7
Sim, isso afetará o desempenho, cache_bootstrap contém vários caches que serão reconstruídos apenas ao longo do tempo, por exemplo, implementações de gancho. Soluções alternativas estariam usando Views, Panels ou um módulo personalizado para exibir dinamicamente o conteúdo na primeira página. Por exemplo, você pode criar uma exibição para mostrar o nó mais recente de um tipo de conteúdo e apontar site_frontpage para ele.
Berdir
Usar isso em um hook_installou hook_update_Nentão deve ser bom.
leymannx 30/09
16

Existe um módulo ( Frontpage , que eu mantive) que permite definir uma página inicial diferente para usuários anônimos e usuários autenticados. O módulo permite que módulos de terceiros alterem a página para a qual os usuários são redirecionados ou alterem a matriz de estrutura usada para renderizar a página. Os módulos de terceiros têm permissão para alterar o URL de redirecionamento somente quando a página inicial de anônimos ou autenticados não foi configurada no módulo Frontpage ou quando ocorreu um erro durante o carregamento do nó; o módulo provavelmente será alterado no futuro para permitir que módulos de terceiros redirecionem os usuários para uma página específica que eles selecionarem.

Como alternativa, você pode criar um módulo personalizado que, usando código semelhante ao usado pelo Frontpage, redirecione os usuários para uma página específica, com base em critérios específicos.

O módulo deve implementar hook_menu () e associar um retorno de chamada de menu a, por exemplo, http://example.com/frontpage ; o retorno de chamada da página desse item de menu deve simplesmente verificar se uma condição foi verificada e, em seguida, redirecionar os usuários para um URL específico.

O esqueleto do código pode ser algo semelhante ao seguinte:

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

Uma solução muito flexível seria usar painéis . Diferentes telas podem ser apresentadas com base em qualquer critério e são controladas por meio de uma interface do usuário.

tim.plunkett
fonte
4

Corrigi assim:

/**
 * 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
fonte
1
Olá. Foi muito gentil da sua parte compartilhar seu código. Seria ainda melhor se você pudesse nos dizer exatamente como o seu código o corrige. Você sabe, o raciocínio de outras pessoas pode seguir se, por algum motivo, o código colado por cópia não funcionar para eles.
Mołot 30/01
@molot - este método, que deve ser adicionado ao seu módulo personalizado, implementa hook_page_altere usa drupal_is_front_pagepara redirecionar usuários, usando drupal_goto, com base em alguma condição (neste caso, $ user-> uid não deve ser 0)
commonpike
@compike não é que eu não entendo. Meu comentário foi sobre a qualidade geral da resposta e, especificamente, sobre a usabilidade para usuários novos e inexperientes.
Mołot
1

O módulo Regras também pode ser usado para definir a página inicial "programaticamente".

A regra realmente a ser criada seria uma variação da resposta nos usuários logados no Redirect (autenticados) em uma página inicial diferente usando regras ou código php .

E, opcionalmente, combiná-lo com o módulo Flag , pode melhorar ainda mais a experiência do usuário. Por exemplo, para usuários logados, para indicar quais das possíveis páginas da frente eles consideram seus "favoritos".

Pierre.Vriens
fonte
1

Se você deseja definir programaticamente isso globalmente, pode definir a variável em settings.php:

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