Más con Symfony

7.3. Personalizando el contenido del panel

Una vez creado e incluido el panel de depuración web a la barra, su contenido se puede añadir fácilmente mediante el método getPanelContent(). Symfony proporciona varios métodos para facilitar la creación de contenido avanzado y usable.

7.3.1. sfWebDebugPanel::setStatus()

Por defecto todos los paneles de la barra de depuración web muestran un color de fondo gris. Si se quiere llamar la atención sobre algún contenido del panel, su fondo se puede mostrar de color naranja o rojo.

Barra de depuración con error

Figura 7.3 Barra de depuración con error

Para modificar el color de fondo del panel se emplea el método setStatus(). Este método acepta cualquier constante de prioridad definida por la clase sfLogger. En concreto se han definido tres niveles de estado diferentes que se corresponden con los tres colores de fondo de los paneles (gris, naranja y rojo). Normalmente el método setStatus() se invoca desde el método getPanelContent() cuando se cumple alguna condición que merece una atención especial.

public function getPanelContent()
{
  // ...

  // mostrar el fondo gris (valor por defecto)
  $this->setStatus(sfLogger::INFO);

  // mostrar el fondo naranja
  $this->setStatus(sfLogger::WARNING);

  // mostrar el fondo rojo
  $this->setStatus(sfLogger::ERR);
}

7.3.2. sfWebDebugPanel::getToggler()

Uno de los elementos más comunes de los paneles de depuración web existentes es el toggler o alternador, un pequeño elemento con forma de flecha que muestra u oculta alternativamente cierto contenido cuando se pincha sobre él.

Alternador

Figura 7.4 Alternador

Esta funcionalidad se puede incluir fácilmente en un panel propio mediante la función getToggler(). Si por ejemplo se quiere alternar en el panel el contenido de una lista:

public function getPanelContent()
{
  $contenidoLista = '<ul id="debug_documentation_list" style="display: none;">
    <li>Elemento 1</li>
    <li>Elemento 2</li>
  </ul>';

  $toggler = $this->getToggler('debug_documentation_list', 'Muestra/oculta lista');

  return sprintf('<h3>Elementos de la lista %s</h3>%s',  $toggler, $contenidoLista);
}

El método getToggler requiere dos argumentos: el valor del atributo id del elemento DOM que se va a alternar y el título que se va a incluir como valor del atributo title del enlace asociado con el toggler. Obviamente debes crear el elemento DOM con ese atributo id y también tienes que crear todo el contenido que se va a mostrar/ocultar con el alternador.

7.3.3. sfWebDebugPanel::getToggleableDebugStack()

Este método es similar a getToggler(), ya que muestra una pequeña flecha que muestra u oculta alternativamente cierto contenido. En este caso, el contenido es el de una traza de depuración. Una de sus principales utilidades es la de mostrar los mensajes de log de una clase propia. Si suponemos que una clase llamada myCustomClass genera mensajes de log propios:

class myCustomClass
{
  public function doSomething()
  {
    $dispatcher = sfApplicationConfiguration::getActive()
      ->getEventDispatcher();

    $dispatcher->notify(new sfEvent($this, 'application.log', array(
      'priority' => sfLogger::INFO,
      'Begin execution of myCustomClass::doSomething()',
    )));
  }
}

El siguiente ejemplo muestra la lista de todos los mensajes de log de la clase myCustomClass junto con la traza de depuración de cada uno.

public function getPanelContent()
{
  // obtiene todos los mensajes de log de la petición actual
  $logs = $this->webDebug->getLogger()->getLogs();

  $listadoLogs = '';
  foreach ($logs as $log)
  {
    if ($log['type'] == 'myCustomClass')
    {
      $listadoLogs .= sprintf('<li>%s %s</li>',
        $log['message'],
        $this->getToggleableDebugStack($log['debug_backtrace'])
      );
    }
  }

  return sprintf('<ul>%s</ul>', $listadoLogs);
}
Información de depuración en la barra

Figura 7.5 Información de depuración en la barra

Nota Aunque no se cree un panel propio, los mensajes de log de la clase myCustomClass se pueden ver en el panel de mensajes de log. La ventaja de esta técnica es que se puede mostrar solamente un subconjunto pequeño de los mensajes de log y además controlar la forma en la que se muestran.

Una de las novedades de Symfony 1.3 es que se puede pinchar sobre el nombre de un archivo en la barra de depuración web para abrirlo con nuestro editor de texto favorito. Puedes obtener más información en el artículo "What's new" de Symfony 1.3.

Para hacer uso de esta característica para cualquier archivo, se emplea el método formatFileLink(). Además del propio archivo, se puede enlazar a una línea concreta. El código del siguiente ejemplo crea un enlace que abre el archivo config/ProjectConfiguration.class.php y posiciona el editor de texto en la línea 15:

public function getPanelContent()
{
  $contenido = '';

  // ...

  $ruta = sfConfig::get('sf_config_dir') . '/ProjectConfiguration.class.php';
  $contenido .= $this->formatFileLink($path, 15, 'Configuración del proyecto');

  return $contenido;
}

Tanto el segundo argumento (número de línea) como el tercero (el texto del enlace) son opcionales. Si no se indica el tercer argumento, el texto del enlace es la propia ruta del archivo.

Nota Antes de probar el ejemplo anterior, asegúrate de haber configurado la nueva opción de enlazar archivos. Esta opción se configura mediante la clave sf_file_link_format del archivo de configuración settings.yml o mediante la opción file_link_format de xdebug. La última forma asegura que el proyecto no sea dependiente de un IDE específico.