¿Cómo configurar programáticamente la portada?

22

Quiero configurar la página principal de Drupal mediante programación en tiempo de ejecución.
¿Cómo puedo hacer esto? es posible?

Ek Kosmos
fuente

Respuestas:

22

Puedes usar variable_set()para eso.

variable_set('site_frontpage', $value);
Rafael Cáceres
fuente
18
Esto es correcto, pero no es algo que deba hacerse con demasiada frecuencia o basado en una acción de uso. Una llamada variable_set () siempre da como resultado "cache_clear_all ('variables', 'cache_bootstrap');" por lo tanto, la próxima solicitud deberá volver a buscar las variables y la información de arranque de la base de datos.
Berdir el
1
@ Berdir: ¿esto afecta de alguna manera el rendimiento del sitio?
Ek Kosmos el
77
Sí, afectará el rendimiento, cache_bootstrap contiene múltiples cachés que solo se reconstruirán con el tiempo, por ejemplo, implementaciones de enlace. Las soluciones alternativas serían utilizar Vistas, Paneles o un módulo personalizado para mostrar dinámicamente el contenido en la página principal. Por ejemplo, podría crear una vista para mostrar el nodo más reciente de un tipo de contenido y luego apuntar a site_frontpage hacia eso.
Berdir
Usar esto en un hook_installo hook_update_Nentonces debería estar bien.
leymannx
16

Hay un módulo ( Frontpage , que es uno que mantuve) que permite configurar una página principal diferente para usuarios anónimos y usuarios autenticados. El módulo permite que los módulos de terceros modifiquen la página a la que se redirige a los usuarios, o que modifiquen la matriz de estructura utilizada para representar la página. Los módulos de terceros pueden cambiar la URL de redireccionamiento solo cuando la página de inicio para anónimos o autenticados no se ha configurado dentro del módulo de Frontpage, o cuando ha habido un error durante la carga del nodo; el módulo probablemente se cambiará en el futuro para permitir que los módulos de terceros redirijan a los usuarios a una página específica que seleccionen.

Como alternativa, puede crear un módulo personalizado que, utilizando un código similar al utilizado por Frontpage, redirija a los usuarios a una página específica, basándose en criterios específicos.

El módulo debe implementar hook_menu () y asociar una devolución de llamada de menú a, por ejemplo, http://example.com/frontpage ; la devolución de llamada de la página de ese elemento del menú simplemente debe verificar que se verifique una condición y luego redirigir a los usuarios a una URL específica.

El esqueleto del código podría ser algo similar a lo siguiente:

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

Una solución muy flexible sería utilizar paneles . Se pueden presentar diferentes pantallas según cualquier criterio, y se controla a través de una interfaz de usuario.

tim.plunkett
fuente
4

Lo arreglé así:

/**
 * 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
fuente
1
Hola. Que amable de su parte compartir su código. Sería aún mejor si pudiera decirnos cómo lo soluciona exactamente su código. Ya sabes, puede seguir el razonamiento de otros si, por alguna razón, el código copiado y pegado no funciona para ellos.
Mołot
@molot: este método, que debe agregarse a su módulo personalizado, implementa hook_page_altery utiliza drupal_is_front_pagepara redirigir a los usuarios, utilizando drupal_goto, en función de alguna condición (en este caso $ user-> uid no debería ser 0)
commonpike
@commonpike no es que no lo entiendo. Mi comentario fue sobre la calidad de la respuesta en general, y específicamente sobre su usabilidad para usuarios nuevos e inexpertos.
Mołot
1

El módulo de Reglas también se puede usar para configurar la portada "programáticamente".

La regla que se creará en realidad, sería una variación de la respuesta en Redirigir a los usuarios registrados (autenticados) a una página principal diferente usando reglas o código php .

Y, opcionalmente, combinarlo con el módulo Flag podría posiblemente mejorar aún más la experiencia del usuario. Por ejemplo, para los usuarios registrados para indicar cuáles de las posibles portadas consideran que son sus "favoritos".

Pierre.Vriens
fuente
1

Si está buscando configurar esto globalmente mediante programación, puede configurar la variable en settings.php:

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

He alterado el nodo de la página de inicio (en subdominios) configurando la variable en un hook_url_outbound_alter ()

variable_set('site_frontpage', $value);

Y luego redireccionando:

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