Se encuentra usted aquí

19
Jul
2014
Author:
Raul
 
Buenas drupaleros un dia mas os traigo un videotutorial instructivo a la par de divertido!. En este videotutorial veremos como poder mostrar nodos de cualquier tipo en nuestro calendar block.
 
Antes de empezar como siempre vamos a descargarnos los módulos necesarios para esta demo. El primero es, como no, el block calendar y el otro es el date. Como siempre los descargamos e instalamos y activamos el block calendar, el date y el date pop-up.
 
PASO 1
 
Una vez instalado el modulo block calendar a primera vista no hace nada, pero si nos dirigimos a estructura > boques, veremos como al final nos ha aparecido un bloque llamado "calendar" este es el que tenemos que activar y posicionar en la region de la web que queramos.
 
 
PASO 2
 
Ahora nos dirigiremos a nuestro "content type" y agregaremos un campo de tipo "date" en el widget yo os recomiendo "pop-up date" que es el que uso en el video. El nombre del campo que usare para esta demo es "fecha", pero vosotros podéis usar el que queráis solamente recordad modificar el resto del código. En la configuracion del campo ya os lo dejo a vuestra elección yo use solamente día, mes y año.
 
 
PASO 3
 
Nos iremos a nuestro tema y buscaremos el archivo "template.php" y si no existe que lo dudo!, asi que buscarlo bien, pues lo creamos.  Dentro y al final escribiremos el siguiente codigo:
 
function MY_THEME_preprocess_calendar_block(&$variables) {
  $query = db_select('node', 'n');
  $query->fields('n',array('nid'))
          ->condition('n.type', array('article'))
          ->where('MONTH(foo.field_fecha_value)=:var', array('var' => $variables['calendar']->month));
  $query->addExpression('DAY(foo.field_fecha_value)');
  $query->join('field_data_field_fecha', 'foo', 'foo.entity_id = n.nid');
  $nodes = $query->execute()->fetchAll();

  if ($nodes) {
    foreach ($nodes as $node => $day) {
      $variables['nodes'][$day->expression][]['nid'] = $day->nid;
    }
    foreach ($variables['rows_dates'] as $key => $row) {
      foreach ($row['data'] as $datas => $data) {
        if (array_key_exists($data["#date"]->day, $variables['nodes']) &&
           !(in_array("disabled", $data["#attributes"]["class"]))) {
          $variables['rows_dates'][$key]['data'][$datas]["#attributes"]['class'][] = "today";
        }
      }
    }
  } 
}
 
Como podemos ver tenemos que hacer ligeros cambios en función de valores que posiblemente hayan cambiado de vuestro proyecto. 
 
Para empezar, comenzaremos modificando el nombre de la función, recordad que siempre que queramos hacer un hook de este tipo tiene que empezar por el nombre del modulo o del tema, asi que modificar "MY_THEME" por vuestro tema.
 
Acto seguido vemos las lineas que hacen una consulta a la base de datos, si habies modificado o vuestro campo es diferente, por favor modificar los campos necesarios, en el videotutorial os explico como hacerlo afondo así que no entrare en esto aquí. 
 
Una vez modificado todo, solamente tendréis que limpiar caches y listo! os debería de empezar a aparecer los nodos en el calendario.
 
 
CONCLUSIÓN
 
Este modulo es realmente bastante potente, puesto que con pocas modificaciones te permite hacer grandes cosas, aunque con este videotutorial solamente muestro como poder "activar" un dia en funcion de si hay un nodo con esa fecha, usando un poco la imaginacion se pueden hacer grandes cosas, las ids de los nodos ya las tenéis asi que el resto es ponerle ingenio.
 
Lo ideal hubiera sido actualizar el modulo y poder dar la opción al usuario que elija que tipo de contenidos y que campo desea mostrar, para hacerlo mas customizable, eso ya os lo dejo a vosotros, el que tenga mas tiempo y se sienta aventurero le animo a que lo actualice! la función mas complicada que es esta ya lo tenéis así que el resto es solo parametrizarlo!
 
 
Como siempre espero que os haya gustado y espero oir comentarios y ver como compartis!!! ;)
 
 

7 Comentarios

Imagen de Pablo

Pablo (no verificado)
|
27 Sep 2015

Hola, ¿se podría activar AJAX para este modulo?¿como? para el tema de que si queremos ver el mes siguiente o anterior no tenga que recargarse la pagina entera, soy un poco nuevo en Drupal y no se si se podría hacer o no.
Un saludo y gracias.

Imagen de Raul

Raul
|
27 Sep 2015

Buenas pablo, te consejo que mires las incidencias del modulo, he encontrado esto ( https://www.drupal.org/node/2134659 ) parece ser un parche para que funcione con ajax.. parece ser que este modulo esta bastante abandonado asi que te recomiendo dos cosas o que busques otro que cumpla tus expectativas o simplemente apliques el parche y prueba a ver que tal si no sabes como aplicar un parche te aconsejo que mires esto ( https://www.drupal.org/patch/apply ) o que pruebes este modulo que es muy facil de usar y de administrar eso si este modulo solo te funcionara correctamente si usas linux o mac ( https://www.drupal.org/project/patch_manager ). Tambien pruede probar este modulo ( https://www.drupal.org/project/fullcalendar ) Ya me contaras como fue... Saludos!!

Imagen de Pablo

Pablo (no verificado)
|
28 Sep 2015

Es cierto que esos modulos son muchos mas completos y faciles de usar que el otro pero por lo que he visto con ellos no puedo tener un bloque (pequeño) en la portada de mi web :(

Imagen de Raul

Raul
|
28 Sep 2015

El problema que mas alla de eso ya necesitarias tocar codigo y modificarlo a tu gusto... y eso no es algo que te pueda explicar con 4 comentario... de todas formas creo que el fullcalendar y el calendar si que tienen para un block... lo has comprobado bien??

Imagen de Pablo

Pablo (no verificado)
|
29 Sep 2015

Si, lo he mirado y de bloques lo unico que traen es un bloque de legenda pero de calendario "en miniatura" no traen ninguno, solo el de tu video :(

Imagen de Pablo

Pablo (no verificado)
|
29 Sep 2015

Una pregunta, antes de intentar modificar el codigo me gustaria saber si ¿se podría modificar el código para que ademas de que saliera el color cuando el raton pasara por "el dia" apareciera un textito con el Titulo del Evento por ejemplo? no se si me he explicado bien.

Imagen de Raul

Raul
|
29 Sep 2015

Si, entiendo lo que dices.. En teoria si y no tendria que ser muy complicado, pero llegado a este punto tendrias que plantearte si es este modulo el que necesitas o seria mejor crear un modulo custom donde creases el calendario que realmente quisieras... nosotros hicimos un modulo que puedes ver aqui (https://pro.skeyndor.com). No se si es eso lo que buscas, si quieres creo que realice un modulo para poder utilizarlo para cualquier web... el problema que no sea como de optimizado estara...


Añadir nuevo comentario