Plugin Hooks
============

Hooks de aplicación
-----------------

Los hooks pueden extender , reemplazar, filtar datos o cambiar los comportamientos por default, cad hook es identificado con unico nombre, ejemplo : `controller:calendar:user:events`

### Escuchar en eventos hook 

En tu  metodo `initialize()` tu necesitas llamar al metodo `on()` de la clase `Kanboard\Core\Plugin\Hook`:

```php
$this->hook->on('hook_name', $callable);
```

El primer argumento es el nombre del hook y el segundo es un callable PHP

### Hooks ejecutado sólo una vez

Algunos hooks solo tienen un  listener:

#### model:subtask-time-tracking:calculate:time-spent

- Anular el cálculo del tiempo anterior cuando se detiene el temporizador de la subtarea
- Argumentos :
    - `$user_id` (integer)
    - `$start` (DateTime)
    - `$end` (DateTime)

### Fusionar hooks

"Fusionar hooks" actuar de la misma manera que la función de `array_merge`. el hook callback solo regresa un array. Este array se fusionará con la que viene por defecto.

Ejemplo para agregar eventos en el calendario del usuario:

```php
class Plugin extends Base
{
    public function initialize()
    {
        $container = $this->container;

        $this->hook->on('controller:calendar:user:events', function($user_id, $start, $end) use ($container) {
            $model = new SubtaskForecast($container);
            return $model->getCalendarEvents($user_id, $end); // Return new events
        });
    }
}
```

Ejemplo para sobrescribir los valores por default de las tareas:

```php
class Plugin extends Base
{
    public function initialize()
    {
        $this->hook->on('controller:task:form:default', function (array $default_values) {
            return empty($default_values['score']) ? array('score' => 4) : array();
        });
    }
}
```

Lista de fusión de hooks:

#### controller:task:form:default

- sobrescribir los valores por default de las tareas
- Argumentos:
    - `$default_values`: actual default values (array)

#### controller:calendar:project:events

- Agregar mas eventos a el calendario del projecto
- Argumentos:
    - `$project_id` (integer)
    - `$start` Calendar start date (string, ISO-8601 format)
    - `$end` Calendar` end date (string, ISO-8601 format)

#### controller:calendar:user:events

- Agregar mas eventos a el calendario de usuario
- Argumentos:
    - `$user_id` (integer)
    - `$start` Calendar start date (string, ISO-8601 format)
    - `$end` Calendar end date (string, ISO-8601 format)

Asset Hooks
-----------

Asset hooks pueden ser usados para agregar nuevas stylesheet facilmente o un nuevo archivo JavaScript en el layout. tu puedes usar estas caracteristicas para crear un tema y sobreescribir todo los estilos por dafault del kanboard.

Ejemplo para agregar un stylesheet **hoja de estilo**

```php
<?php

namespace Kanboard\Plugin\Css;

use Kanboard\Core\Plugin\Base;

class Plugin extends Base
{
    public function initialize()
    {
        $this->hook->on('template:layout:css', array('template' => 'plugins/Css/skin.css'));
    }
}
```

Lista de asset Hooks:

- `template:layout:css`
- `template:layout:js`


Referencia de hooks
---------------

La reference hooks son pasados a una variable por referencia.

Ejemplo:

```php
$this->hook->on('formatter:board:query', function (\PicoDb\Table &query) {
    $query->eq('color_id', 'red');
});
```

El código anterior mostrará sólo las tareas en rojo en el tablero.

Lista de referencias de hooks:

| Hook                                       | Description                                                   |
|--------------------------------------------|---------------------------------------------------------------|
| `formatter:board:query`                    | Alterar consulta a la base antes de tablero de renderizado    |
| `pagination:dashboard:task:query`          | Alterar consulta de base de datos para las tareas de la paginación en el dashboard  |
| `pagination:dashboard:subtask:query`       | Alterar consulta a la base de la paginación en el subtareas del dashboard           |
| `model:task:creation:prepare`              | Alterar los valores del formulario antes de guardar una tarea                       |
| `model:task:modification:prepare`          | Alterar los valores del formulario antes de editar una tarea

Template Hooks
--------------

Template hooks permitirá añadir nuevos contenidos en las plantillas existentes.

Ejemplo para agregar nuevos contenidos en el sidebar del dashboard:

```php
$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar');
```

Ejemplo para adjuntar un template con variables locales:

```php
$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', array(
    'variable' => 'foobar',
));
```

Ejemplo para adjuntar un template con un callable:

```php
$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', function($hook_param1, $hook_param2) {
    return array('new_template_variable' => 'foobar'); // Inyectar una nueva variable en la plantilla Plugin
});
```

Este llamada es usualmente definida en el metodo `initialize()`
El primer argumento es el nombre del hook y el segundo argumento es el nombre del template.

Los nombres de plantillas con el prefijo del nombre del plugin y los dos puntos indican la ubicación de la plantilla.

Ejemplo con `myplugin:dashboard/sidebar`:

- `myplugin` Es el nombre de tu plugin (minusculas)
- `dashboard/sidebar` es el nombre del template
- En el filesystem, El plugin esta localizado aqui: `plugins\Myplugin\Template\dashboard\sidebar.php`
- Templates estan escritos en puro PHP (no se olvide de escapar los datos)

Los nombres de plantillas sin prefijo son plantillas básicas.

Lista de templates hooks:

| Hook                                       | Descripción                                      |
|--------------------------------------------|----------------------------------------------------|
| `template:analytic:sidebar`                | Sidebar en paginas analiticas                      |
| `template:app:filters-helper:before`       | Filtro helper dropdown (top)                       |
| `template:app:filters-helper:after`        | Filtro helper dropdown (bottom)                    |
| `template:auth:login-form:before`          | Pagina de login  (top)                             |
| `template:auth:login-form:after`           | Pagina de login (bottom)                           |
| `template:board:private:task:before-title` | Tarea en un tablero privado : despues del titulo   |
| `template:board:private:task:after-title`  | Tarea en un tablero privado : antes del titulo     |
| `template:board:public:task:before-title`  | Tarea en un tablero publico : despues del titulo   |
| `template:board:public:task:after-title`   | Tarea en un tablero publico : antes del titulo     |
| `template:board:task:footer`               | Tarea en el tablero : footer                       |
| `template:board:task:icons`                | Tarea en el tablero: tooltip icon                  |
| `template:board:column:dropdown`           | Menu Dropdown en las columnas del tablero          |
| `template:config:sidebar`                  | Sidebar pagina de configuración                    |
| `template:config:application `             | Aplicación de configuración del formulario         |
| `template:config:email`                    | Email settings page                                |
| `template:config:integrations`             | Integration page in global settings                |
| `template:dashboard:sidebar`               | Sidebar en la pagina del dashboard                 |
| `template:dashboard:show`                  | Pagina principal del dashboard                     |
| `template:export:sidebar`                  | Sidebar para exportar paginas                      |
| `template:import:sidebar`                  | Sidebar para importar paginas                      |
| `template:header:dropdown`                 | Dropdown menu Pagina header (icono avatar de usuario) |
| `template:header:creation-dropdown`        | Dropdown menu Pagina header (plus icon)            |
| `template:layout:head`                     | Layout de la pagina  `<head/>` tag                 |
| `template:layout:top`                      | Layout de la pagina top header                     |
| `template:layout:bottom`                   | Layout de la pagina footer                                 |
| `template:project:dropdown`                | "Actions" menu a la izquierda vista para diferentes proyectos |
| `template:project:header:before`           | Filtros de Proyectos  (antes)                           |
| `template:project:header:after`            | Filtros de Proyectos (despues)                     |
| `template:project:integrations`            | Pagina de integracion de configuración de proyectos|
| `template:project:sidebar`                 | Sidebar configuración de proyectos                 |
| `template:project-user:sidebar`            | Sidebar en la página de la información de usuario del proyecto            |
| `template:task:layout:top`                 | Task layout top (antes page header)                |
| `template:task:details:top`                | Resumen de tarea top                               |
| `template:task:details:bottom`             | Resumen de tarea bottom                            |
| `template:task:details:first-column`       | Resumen de tarea columna                           |
| `template:task:details:second-column`      | Resumen de tarea dos columnas                      |
| `template:task:details:third-column`       | Resumen de tarea tres columnas                     |
| `template:task:details:fourth-column`      | Resumen de tarea cuatro columnas                   |
| `template:task:dropdown`                   | Task dropdown menu en listado de paginas           |
| `template:task:sidebar:actions`            | Sidebar on task page (sección de acciones)         |
| `template:task:sidebar:information`        | Sidebar on task page (sección de información)         |
| `template:task:form:first-column`          | 1st columna en forma de tarea                           |
| `template:task:form:second-column`         | 2nd columna en forma de tarea                            |
| `template:task:form:third-column`          | 3nd columna en forma de tarea                            |
| `template:task:show:top   `                | Mostrar página de tareas : top                                |
| `template:task:show:bottom`                | Mostrar página de tareas : bottom                             |
| `template:task:show:before-description`    | Mostrar página de tareas : despues de la descripción            |
| `template:task:show:before-tasklinks`      | Mostrar página de tareas : despues tasklinks                   |
| `template:task:show:before-subtasks`       | Mostrar página de tareas : despues subtareas                   |
| `template:task:show:before-timetracking`   | Mostrar página de tareas : despues timetracking                |
| `template:task:show:before-attachments`    | Mostrar página de tareas : despues archivos adjuntos                 |
| `template:task:show:before-comments`       | Mostrar página de tareas : despues comentarios                  |
| `template:user:authentication:form`        | "Editar autenticación" formulario de perfil de usuario  |
| `template:user:create-remote:form`         | "Crear un usuario remoto" formulario                         |
| `template:user:external`                   | "Autenticación externa" la página de perfil de usuario   |
| `template:user:integrations`               | Integración en el perfil de usuario                  |
| `template:user:sidebar:actions`            | Sidebar en el perfil de usuario (sección de acciones)          |
| `template:user:sidebar:information`        | Sidebar en el perfil de usuario (sección de información)      |


Otro de los ganchos plantilla se pueden añadir en caso necesario , sólo hay que preguntar en el seguimiento de incidencias  ** issue tracking **.