1. Code
  2. JavaScript

Cómo Elaborar un Recorrido del Usuario Con Shepherd en JavaScript

Scroll to top
This post is part of a series called Building Your Startup With PHP.
Using Faker to Generate Filler Data for Automated Testing
Programming With Yii: Generating Documentation

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

What You'll Be Creating
Lo Que Vas A Crear
Visual Tour With Shepherd - Example of Shepherd Tour with Default ThemeVisual Tour With Shepherd - Example of Shepherd Tour with Default ThemeVisual Tour With Shepherd - Example of Shepherd Tour with Default Theme

Introducción

Sin importar qué tan sencillas tratamos de hacer nuestras aplicaciones web, es a menudo útil guiar a los nuevos usuarios a través de su primera experiencia. Los recorridos visuales son probablemente la manera más fácil.

Si has seguido mi serie Creando Tu Startup Con PHP de Envato Tuts+, estás familiarizado con Meeting Planner. Después de ver a los usuarios programar su primera reunión, decidí que sería mejor elaborar alguna clase de guía.

Al principio, considerá crear la mía, pero luego encontré una opción de código abierto, Shepherd.

En el tutorial de hoy, te introduciré a la creación de un recorrido visual del usuario con Shepherd. Usar Shepherd es relativamente sencillo, y revisaré algo de mi propio código que usé para agilizar el proceso de autoría.

Shepherd es una oferta de código abierto de HubSpot, un servicio de mercadotecnia de atracción. Felicítalos por ofrecer una robusta biblioteca con buena documentación.

Yo sí participo en la sección de comentarios abajo, así que por favor con toda confianza formula preguntas y comparte tu respuesta. Especialmente estaría interesado en tu experiencia con otras soluciones de la guía del recorrido visual. También puedes contactarme en Twitter @lookahead_io.

Cómo Funciona Shepherd

Transitemos por un sencillo escenario para Shepherd.

Integrar un recorrido básico con Shepherd a tu aplicación es sencillo. Primero, eliges un archivo de tema e integras su JavaScript así:

1
<link rel="stylesheet" href="shepherd-theme-arrows.css" />
2
<script src="tether.min.js"></script>
3
<script src="shepherd.min.js"></script>

Puedes descargar los archivos de la página de Shepherd en Github. Estoy usando el shepherd-theme-arrows.css arriba, pero puedes elegir cualquiera de los predeterminados abajo y personalizarlos:

Visual Tour With Shepherd - Default Theme CSS FilesVisual Tour With Shepherd - Default Theme CSS FilesVisual Tour With Shepherd - Default Theme CSS Files

A continuación, creas un objeto tour (recorrido):

1
var tour;
2
 
3
tour = new Shepherd.Tour({
4
  defaults: {
5
    classes: 'shepherd-theme-arrows',
6
    scrollTo: true
7
  }
8
});

Los defaults (predeterminados) pueden ser definidos para todos los pasos cuando creas el recorrido. Las clases se refieren a las definiciones de tema que usaste, por ejemplo, shepherd-theme-arrows. Y scrollTo afortunadamente asegura que todos los pasos aparezcan en la ventana gráfica visible.

Luego, agregas pasos individuales al recorrido:

1
tour.addStep('example-step', {
2
  text: 'This step is attached to the bottom of the <code>.

3
         example-css-selector</code> element.',
4
  attachTo: '.example-css-selector bottom',
5
  classes: 'example-step-extra-class',
6
  buttons: [
7
    {
8
      text: 'Next',
9
      action: tour.next
10
    }
11
  ]
12
});

El text es lo que aparece en el cuerpo del recorrido visual. attachTo apunta a un selector CSS para el elemento que quieres que apunte la ventana emergente del recorrido en éste paso. El buttons te permite definir uno o más botones y sus acciones, por ejemplo Next.

Y finalmente, comienzas el recorrido:

1
tour.start();

Shepherd se elabora a partir de Tether, otra oferta de código abierto de HubSpot, que ayuda a colocar elementos a otros elementos en una página. Tether asegura que tus pasos nunca se desborden en la pantalla o se corten.

Mientras que no tuve ningún problema con Tether, no encontré problemas con Shepherd al no mostrar adecuadamente flechas en algunos elementos. Ésto ocurrió aleatoriamente, y no soy el único con éste problema. El equipo de HubSpot no ha respondido a cualquiera de mis peticiones en Github después de dos semanas, lo cual es un poco decepcionante. Aún, Shepherd es en general una gran biblioteca JavaScript.

Integrando Tether En Tu Propia Aplicación

Visual Tour With Shepherd - Demo Scheduling at Meeting PlannerVisual Tour With Shepherd - Demo Scheduling at Meeting PlannerVisual Tour With Shepherd - Demo Scheduling at Meeting Planner

Como comencé a experimentar con Shepherd, descubrí rápidamente que crear una guía con muchos pasos podría ser algo muy extenso. Ésto es algo que abordé en mi propia implementación.

No quería crear el recorrido con un paquete largo de código JavaScript que necesitara ser mantenido con el paso del tiempo. Mejor, elegí crear un array (arreglo) y programáticamente personalizar los botones en base a si los usuarios estaban al principio o al final del tour.

Por ejemplo, creo un array steps[] y definí el recorrido al llenar el array:

1
var tour;
2
var steps =[];
3
steps.push(['.nav-tabs top','Welcome','Allow me to show you how to plan a '+title+'. <p>If you prefer, you can <a href="javascript::return false;" onclick="turnOffGuide();">turn off this guide</a>.<br /><br />']);
4
steps.push(['#headingWho top','Who would you like to invite?','You can add one person or a group of people to your '+title+'. <p>Click the person button to add participants.</p>']);
5
steps.push(['#invitation-url bottom','Inviting by email','Alternately, you can email the meeting link to your participant(s)']);
6
steps.push(['#headingWhat bottom','What is your meeting about?','You can customize the subject of your '+title+'. We\'ll use it for the invitation and reminder emails.<p>Click the pencil button to edit the subject.</p>']);
7
if ($('#headingActivity').length>0) {
8
  steps.push(['#headingActivity top','What do you want to do?','You can suggest one or more activity ideas. With multiple ideas, your participants can help you select their favorite. <p>Click the plus button to suggest activities.</p>']);
9
}
10
steps.push(['#headingWhen top','When do you want to meet?','Suggest one or more dates and times for your '+title+'. With more than one, your participants can help you choose. <p>Click the + button to add them.</p>']);
11
steps.push(['#headingWhere top','Where do you want to meet?','Suggest one or more places for your '+title+'. With multiple places, your participants can help you choose. <p>We use Google Places to simplify adding them. Click the + button to begin.</p>']);
12
steps.push(['.virtualThing top','Is this a virtual meeting?','Switch between <em>in person</em> and <em>virtual</em> '+title+'s such as phone calls or online conferences.']);
13
steps.push(['#actionSend top','Sending invitations','Scheduling is collaborative. After you add times and places, you can <strong>Invite</strong> participants to select their favorites. <em>A place isn\'t necessary for virtual '+title+'\s.</em>']);
14
steps.push(['#actionFinalize right','Finalizing the plan','Once you choose a time and place, you can <strong>Complete</strong> the plan. We\'ll email the invitations and setup reminders.']);
15
steps.push(['#tourDiscussion left','Share messages with participants ','You can write back and forth with participants on the <strong>Messages</strong> tab. <p>Messages are delivered via email.</p>']);    
16
steps.push(['.container ','Ask a question','Need help? <a href="'+$('#url_prefix').val()+'/ticket/create">Ask a question</a> and we\'ll respond as quickly as we can. <p>If you prefer, you can <a href="'+$('#url_prefix').val()+'/user-setting?tab=guide">turn off the guide</a> in settings.</p>']);

Cada elemento del array que agregué incluía tres elementos:

  1. El elemento visual CSS al que apunta éste paso y donde, por ejemplo '#headingWho top'
  2. Texto para la cabecera, por ejemplo '¿Cuándo quieres reunirte?'
  3. Texto para la instrucción

Mantener éste array fue mucho más sencillo para mí que definir los botones para cada paso del tutorial. Sin embargo, ésto significó que necesitaba programáticamente definir botones cuando cargaba los pasos en el recorrido.

Esribí éste código para añadir y responder a botones para el recorrido adecuadamente. Con cada paso, crea un array button, que de otra manera tendría que definir manualmnete:

1
for (i = 0; i < steps.length; i++) {
2
  buttons=[];
3
  // no back button at the start

4
  if (i>0) {
5
    buttons.push({
6
      text: 'Back',
7
      classes: 'shepherd-button-secondary',
8
      action: function() {
9
        return tour.back();
10
      }
11
    });
12
  }
13
  // no next button on last step

14
  if (i!=(steps.length-1)) {
15
    buttons.push({
16
      text: 'Next',
17
      classes: 'shepherd-button-primary',
18
      action: function() {
19
        return tour.next();
20
      }
21
    });
22
  } else {
23
    buttons.push({
24
      text: 'Close',
25
      classes: 'shepherd-button-primary',
26
      action: function() {
27
        return tour.hide();
28
      }
29
    });
30
  }

Por ejemplo, el primer paso no tiene botón Back, y el último paso no tiene botón Next. Pero el último paso si tiene un botón Close.

Luego, cada step de mi array y cada array button es agregado al recorrido.

1
tour.addStep('step_'+i,{
2
    text: steps[i][2],
3
    title: steps[i][1],
4
    attachTo: steps[i][0],
5
    //classes: 'shepherd shepherd-open shepherd-theme-arrows shepherd-transparent-text',

6
    buttons: buttons,
7
  });

Usando éste planteamiento, no tuve que redefinir reiteradamente los mismos buttons (botones) para cada paso de mi tutorial. También ofrece alguna capacidad programática para personalizar el recorrido dinámicamente para el futuro.

Usando Yii, mi elegido framework para programar en PHP, agregué los necesarios archivos a mi archivo asset. Éste se carga en páginas particulares donde el recorrido es necesario. En mi caso, la página para programar la reunión:

1
<?php
2
namespace frontend\assets;
3
use yii\web\AssetBundle;
4
5
class MeetingAsset extends AssetBundle
6
{
7
    public $basePath = '@webroot';
8
    public $baseUrl = '@web';
9
    public $css = [
10
      ...
11
      'css/shepherd-theme-arrows.css',      
12
    ];
13
    public $js = [
14
      'js/meeting.js',
15
      ...
16
      'js/tether.min.js',
17
      'js/shepherd.min.js',
18
      'js/meeting_tour.js',
19
    ];
20
    ...

Verás arriba el CSS para el tema Shepherd y el JavaScript para Tether, Shepherd y el archivo de definición de mi recorrido, meeting_tour.js.

También agregué CSS para controlar la anchura general de la ventana emergente de mi recorrido a 40% de la ventana gráfica.

1
.shepherd-element.shepherd-theme-arrows {
2
  max-width: 40%;
3
}

Puedes observar el video del recorrido de ejemplo arriba o en Vimeo. Si quisieras probarlo tú mismo, regístrate en Meeting Planner e inmediatamente serás llevado al recorrido de programación.

Otras Cosas a Considerar

Desactivando el Recorrido Visual

Creé una configuración de usuario para que las personas rápidamente desacativaran el recorrido. En lugar de incuir un botón Off que distrae en cada paso, agregué un enlace a turn of the guide (desacativar la guía) en el primero y en el último paso del recorrido:

Visual Tour with Shepherd - Turning off the guide via AJAX and seeing link to settingsVisual Tour with Shepherd - Turning off the guide via AJAX and seeing link to settingsVisual Tour with Shepherd - Turning off the guide via AJAX and seeing link to settings

Desactivarlo ocurre interactivamente vía AJAX y muestra un útil vínculo a la página de ajustes abajo. Ésto ayuda a los nuevos usuarios a encontrar fácilmente cómo volver a activar el recorrido:

Visual Tour with Shepherd - User setting for turning the tour on and offVisual Tour with Shepherd - User setting for turning the tour on and offVisual Tour with Shepherd - User setting for turning the tour on and off

Las Capacidades Avanzadas de Shepherd

Acabo de mostrarte las bases de Sheherd y cómo integrarlo rápidamente en tu aplicación web. Hasta ahora, funcionó bien para mí aparte de los problemas ocasionales con las flechas. Sin embargo, Shepherd ofrece mucho más de lo que he revisado, específicamente en cuanto al proceso y la gestión del evento. Ésto te permite adaptar tu recorrido a tu aplicación y el estado actual del usuario de una manera más personalizada. También tienen muy buena documentación.

Por ejemplo, si un usuario ingresa a algún área de tu página web, puedes tener que el evento automáticamente desencadene un salto a otro paso del recorrido. Podría ahondar en ésto en un futuro tutorial.

Concluyendo

Espero que hayas disfrutado aprendiendo sobre Shepherd. Ciertamente es un recorrido visual amigable con el desarrollador y visualmente pulcro que puedes rápidamente integrar en cualquier aplicación.

Por favor comparte tu experiencia con Shepherd y otras librerías para recorridos visuales en los comentarios. Y con toda confianza formula preguntas.

También siempre puedes contactarme en Twitter @lookahead_io directamente. Si quisieras leer más de mis tutoriales en Envato Tuts+, aquí están algunos interesantes:

Enlaces Relacionados