Convert Spanish documentation to UTF-8
This commit is contained in:
@@ -87,7 +87,7 @@ class DocumentationController extends BaseController
|
|||||||
private function getPageFilename($page)
|
private function getPageFilename($page)
|
||||||
{
|
{
|
||||||
return $this->getFileLocation($page . '.markdown') ?:
|
return $this->getFileLocation($page . '.markdown') ?:
|
||||||
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', 'index.markdown'));
|
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', 'en_US', 'index.markdown'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,7 +122,7 @@ class DocumentationController extends BaseController
|
|||||||
{
|
{
|
||||||
$files = array(
|
$files = array(
|
||||||
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', $this->languageModel->getCurrentLanguage(), $filename)),
|
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', $this->languageModel->getCurrentLanguage(), $filename)),
|
||||||
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', $filename)),
|
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', 'en_US', $filename)),
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($files as $filename) {
|
foreach ($files as $filename) {
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ API de Procedimientos de tarea de enlace externo
|
|||||||
|
|
||||||
## getExternalTaskLinkTypes
|
## getExternalTaskLinkTypes
|
||||||
|
|
||||||
- Propósito: **Obtener todos los proveedores registrados de enlaces externos**
|
- Propósito: **Obtener todos los proveedores registrados de enlaces externos**
|
||||||
- Parámetros: **ninguno**
|
- Parámetros: **ninguno**
|
||||||
- Resultado en caso de éxito: **dict**
|
- Resultado en caso de éxito: **dict**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -31,10 +31,10 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## getExternalTaskLinkProviderDependencies
|
## getExternalTaskLinkProviderDependencies
|
||||||
|
|
||||||
- Propósito: **Obtener las dependencias disponibles para un determinado proveedor**
|
- Propósito: **Obtener las dependencias disponibles para un determinado proveedor**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **providerName** (string, required)
|
- **providerName** (string, required)
|
||||||
- Resultado en caso de éxito: **dict**
|
- Resultado en caso de éxito: **dict**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -57,14 +57,14 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## createExternalTaskLink
|
## createExternalTaskLink
|
||||||
|
|
||||||
- Propósito: **Crear una nueva tarea de enlace externo**
|
- Propósito: **Crear una nueva tarea de enlace externo**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **task_id** (integer, required)
|
- **task_id** (integer, required)
|
||||||
- **url** (string, required)
|
- **url** (string, required)
|
||||||
- **dependency** (string, required)
|
- **dependency** (string, required)
|
||||||
- **type** (string, optional)
|
- **type** (string, optional)
|
||||||
- **title** (string, optional)
|
- **title** (string, optional)
|
||||||
- Resultado en caso de éxito: **link_id**
|
- Resultado en caso de éxito: **link_id**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -85,14 +85,14 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## updateExternalTaskLink
|
## updateExternalTaskLink
|
||||||
|
|
||||||
- Propósito: **Actualizar tarea de enlace externo**
|
- Propósito: **Actualizar tarea de enlace externo**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **task_id** (integer, required)
|
- **task_id** (integer, required)
|
||||||
- **link_id** (integer, required)
|
- **link_id** (integer, required)
|
||||||
- **title** (string, required)
|
- **title** (string, required)
|
||||||
- **url** (string, required)
|
- **url** (string, required)
|
||||||
- **dependency** (string, required)
|
- **dependency** (string, required)
|
||||||
- Resultado en caso de éxito: **true**
|
- Resultado en caso de éxito: **true**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -122,11 +122,11 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## getExternalTaskLinkById
|
## getExternalTaskLinkById
|
||||||
|
|
||||||
- Propósito: **Obtener un enlace de tarea externo**
|
- Propósito: **Obtener un enlace de tarea externo**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **task_id** (integer, required)
|
- **task_id** (integer, required)
|
||||||
- **link_id** (integer, required)
|
- **link_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **dict**
|
- Resultado en caso de éxito: **dict**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -157,10 +157,10 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## getAllExternalTaskLinks
|
## getAllExternalTaskLinks
|
||||||
|
|
||||||
- Propósito: **Obtener todos los enlaces externos conectados a una tarea**
|
- Propósito: **Obtener todos los enlaces externos conectados a una tarea**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **task_id** (integer, required)
|
- **task_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **list of external links**
|
- Resultado en caso de éxito: **list of external links**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -197,11 +197,11 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## removeExternalTaskLink
|
## removeExternalTaskLink
|
||||||
|
|
||||||
- Propósito: **Remover una tarea de enlace externo**
|
- Propósito: **Remover una tarea de enlace externo**
|
||||||
- Parametros:
|
- Parametros:
|
||||||
- **task_id** (integer, required)
|
- **task_id** (integer, required)
|
||||||
- **link_id** (integer, required)
|
- **link_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **true**
|
- Resultado en caso de éxito: **true**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ Group Member API Procedures
|
|||||||
|
|
||||||
## getMemberGroups
|
## getMemberGroups
|
||||||
|
|
||||||
- Propósito: **Obtener todos los grupos de un usuario determinado**
|
- Propósito: **Obtener todos los grupos de un usuario determinado**
|
||||||
- Parámetros:
|
- Parámetros:
|
||||||
- **user_id** (integer, required)
|
- **user_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **List of groups**
|
- Resultado en caso de éxito: **List of groups**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -39,10 +39,10 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## getGroupMembers
|
## getGroupMembers
|
||||||
|
|
||||||
- Propósito: **Obtener todos los miembros de un grupo**
|
- Propósito: **Obtener todos los miembros de un grupo**
|
||||||
- Parámetros:
|
- Parámetros:
|
||||||
- **group_id** (integer, required)
|
- **group_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **List of users**
|
- Resultado en caso de éxito: **List of users**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -90,11 +90,11 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## addGroupMember
|
## addGroupMember
|
||||||
|
|
||||||
- Propósito: **Agregar un usuario a un grupo**
|
- Propósito: **Agregar un usuario a un grupo**
|
||||||
- Parámetros:
|
- Parámetros:
|
||||||
- **group_id** (integer, required)
|
- **group_id** (integer, required)
|
||||||
- **user_id** (integer, required)
|
- **user_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **true**
|
- Resultado en caso de éxito: **true**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -123,11 +123,11 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## removeGroupMember
|
## removeGroupMember
|
||||||
|
|
||||||
- Propósito: **Quitar un usuario de un grupo**
|
- Propósito: **Quitar un usuario de un grupo**
|
||||||
- Parámetros:
|
- Parámetros:
|
||||||
- **group_id** (integer, required)
|
- **group_id** (integer, required)
|
||||||
- **user_id** (integer, required)
|
- **user_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **true**
|
- Resultado en caso de éxito: **true**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
@@ -156,11 +156,11 @@ Ejemplo de respuesta:
|
|||||||
|
|
||||||
## isGroupMember
|
## isGroupMember
|
||||||
|
|
||||||
- Propósito: **Comprobar si un usuario es miembro de un grupo**
|
- Propósito: **Comprobar si un usuario es miembro de un grupo**
|
||||||
- Parámetros:
|
- Parámetros:
|
||||||
- **group_id** (integer, required)
|
- **group_id** (integer, required)
|
||||||
- **user_id** (integer, required)
|
- **user_id** (integer, required)
|
||||||
- Resultado en caso de éxito: **true**
|
- Resultado en caso de éxito: **true**
|
||||||
- Resultado en caso de falla: **false**
|
- Resultado en caso de falla: **false**
|
||||||
|
|
||||||
Ejemplo de solicitud:
|
Ejemplo de solicitud:
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ Modo colapsar y expandir
|
|||||||
===========================
|
===========================
|
||||||
|
|
||||||
Las tares en el tablero pueden visualizarse en modo colapsado o en modo expandido.
|
Las tares en el tablero pueden visualizarse en modo colapsado o en modo expandido.
|
||||||
El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"s"** o usar el menu drop-down que esta parte superior izquierda.
|
El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"s"** o usar el menu drop-down que esta parte superior izquierda.
|
||||||
|
|
||||||
Modo de colapsado
|
Modo de colapsado
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- Si la tarea es asignada a alguien, las iniciales de la persona se muestran junto al número de tareas
|
- Si la tarea es asignada a alguien, las iniciales de la persona se muestran junto al número de tareas
|
||||||
- Si el titulo de la tarea es demasiado largo, tu puedes poner el puntero del ratón sobre la tarea de mostrar una información sobre herramientas con el título completo
|
- Si el titulo de la tarea es demasiado largo, tu puedes poner el puntero del ratón sobre la tarea de mostrar una información sobre herramientas con el título completo
|
||||||
|
|
||||||
Modo expansivo
|
Modo expansivo
|
||||||
--------------
|
--------------
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ Horizontal scrolling y modo compacto
|
|||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
Cuando el tablero no puede caber en su pantalla , una barra de scroll horizontal
|
Cuando el tablero no puede caber en su pantalla , una barra de scroll horizontal
|
||||||
When the board cannot fit on your screen, a horizontal scroll bar aparecerá en la parte inferior.
|
When the board cannot fit on your screen, a horizontal scroll bar aparecerá en la parte inferior.
|
||||||
|
|
||||||
Sin embargo, es posible cambiar a una vista de modo compacto para visualizar todas las columnas en su pantalla.
|
Sin embargo, es posible cambiar a una vista de modo compacto para visualizar todas las columnas en su pantalla.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Cambiar entre scrolling y vista compacta
|
Cambiar entre scrolling y vista compacta
|
||||||
El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"c"** o usar el menu drop-down que esta parte superior izquierda.
|
El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"c"** o usar el menu drop-down que esta parte superior izquierda.
|
||||||
|
|||||||
@@ -3,25 +3,25 @@ Como correr Kanboard en Cloudron
|
|||||||
|
|
||||||
[Cloudron](https://cloudron.io) es un smartserver privado con el cual tu puedes instalar web
|
[Cloudron](https://cloudron.io) es un smartserver privado con el cual tu puedes instalar web
|
||||||
apps como Kanboard. Puedes instalar Kanboard en un dominio personalizado y cada
|
apps como Kanboard. Puedes instalar Kanboard en un dominio personalizado y cada
|
||||||
instalación está respaldada y mantenida día a día con la liberación automática de Kanboard
|
instalación está respaldada y mantenida día a día con la liberación automática de Kanboard
|
||||||
|
|
||||||
[](https://cloudron.io/button.html?app=net.kanboard.cloudronapp)
|
[](https://cloudron.io/button.html?app=net.kanboard.cloudronapp)
|
||||||
|
|
||||||
Cuentas
|
Cuentas
|
||||||
--------
|
--------
|
||||||
|
|
||||||
La app se integra perfectamente con Cloudron en la gestión ( a través de LDAP ) del usuario . Solamente
|
La app se integra perfectamente con Cloudron en la gestión ( a través de LDAP ) del usuario . Solamente
|
||||||
los usuarios de Cloudron pueden acceder a Kanboard . Además , cualquier administrador Cloudron
|
los usuarios de Cloudron pueden acceder a Kanboard . Además , cualquier administrador Cloudron
|
||||||
se convierte en un administrador Kanboard automáticamente.
|
se convierte en un administrador Kanboard automáticamente.
|
||||||
|
|
||||||
Instalación de plugins
|
Instalación de plugins
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Los plugins pueden ser instalados y configurados por [Cloudron CLI](https://cloudron.io/references/cli.html)
|
Los plugins pueden ser instalados y configurados por [Cloudron CLI](https://cloudron.io/references/cli.html)
|
||||||
herramientas. Observar [descripción de la app](https://cloudron.io/appstore.html?app=net.kanboard.cloudronapp) for
|
herramientas. Observar [descripción de la app](https://cloudron.io/appstore.html?app=net.kanboard.cloudronapp) for
|
||||||
mas información.
|
mas información.
|
||||||
|
|
||||||
Código fuente de la aplicación
|
Código fuente de la aplicación
|
||||||
-------------------------------
|
-------------------------------
|
||||||
El código fuente de la app Cloudron esta [aqui](https://github.com/cloudron-io/kanboard-app).
|
El código fuente de la app Cloudron esta [aqui](https://github.com/cloudron-io/kanboard-app).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Estandares de codificación
|
Estandares de codificación
|
||||||
================
|
================
|
||||||
|
|
||||||
Código PHP
|
Código PHP
|
||||||
----------
|
----------
|
||||||
|
|
||||||
- Indentacion: 4 espacios
|
- Indentacion: 4 espacios
|
||||||
@@ -11,13 +11,13 @@ C
|
|||||||
- Siempre escribe comentarios PHPdoc para metodos y propiedades de la clase
|
- Siempre escribe comentarios PHPdoc para metodos y propiedades de la clase
|
||||||
- Codificar con estilo : [PSR-1](http://www.php-fig.org/psr/psr-1/) y [PSR-2](http://www.php-fig.org/psr/psr-2/)
|
- Codificar con estilo : [PSR-1](http://www.php-fig.org/psr/psr-1/) y [PSR-2](http://www.php-fig.org/psr/psr-2/)
|
||||||
|
|
||||||
Código JavaScript
|
Código JavaScript
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
- Indentacion: 4 espacios
|
- Indentacion: 4 espacios
|
||||||
- Linea de retorno: Unix => `\n`
|
- Linea de retorno: Unix => `\n`
|
||||||
|
|
||||||
Código CSS
|
Código CSS
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- Indentacion: 4 espacios
|
- Indentacion: 4 espacios
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
Archivo de configuración
|
Archivo de configuración
|
||||||
========================
|
========================
|
||||||
|
|
||||||
Puede personalizar la configuración predeterminada de Kanboard mediante la adición de un archivo ` config.php` en la raíz del proyecto o en la carpeta ` data` .
|
Puede personalizar la configuración predeterminada de Kanboard mediante la adición de un archivo ` config.php` en la raíz del proyecto o en la carpeta ` data` .
|
||||||
También puede cambiar el nombre del archivo `config.default.php` a `config.php` y cambiar los valores deseados .
|
También puede cambiar el nombre del archivo `config.default.php` a `config.php` y cambiar los valores deseados .
|
||||||
|
|
||||||
Habilitar/Deshabilitar el modo debug
|
Habilitar/Deshabilitar el modo debug
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
@@ -12,8 +12,8 @@ define('DEBUG', true);
|
|||||||
define('LOG_DRIVER', 'file'); // Otros drivers son: syslog, stdout, stderr or file
|
define('LOG_DRIVER', 'file'); // Otros drivers son: syslog, stdout, stderr or file
|
||||||
```
|
```
|
||||||
|
|
||||||
El controlador de registro se debe definir si se habilita el modo de depuración .
|
El controlador de registro se debe definir si se habilita el modo de depuración .
|
||||||
El modo de depuración registra todas las consultas SQL y el tiempo necesario para generar páginas .
|
El modo de depuración registra todas las consultas SQL y el tiempo necesario para generar páginas .
|
||||||
|
|
||||||
Plugins
|
Plugins
|
||||||
-------
|
-------
|
||||||
@@ -24,7 +24,7 @@ Folder de plugins:
|
|||||||
define('PLUGINS_DIR', 'data/plugins');
|
define('PLUGINS_DIR', 'data/plugins');
|
||||||
```
|
```
|
||||||
|
|
||||||
Enable/disable plugin de instalación para la interface de usuario:
|
Enable/disable plugin de instalación para la interface de usuario:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
define('PLUGIN_INSTALLER', true); // Default es true
|
define('PLUGIN_INSTALLER', true); // Default es true
|
||||||
@@ -44,7 +44,7 @@ Enable/disable url rewrite
|
|||||||
define('ENABLE_URL_REWRITE', false);
|
define('ENABLE_URL_REWRITE', false);
|
||||||
```
|
```
|
||||||
|
|
||||||
Configuración de Email
|
Configuración de Email
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@@ -54,7 +54,7 @@ define('MAIL_FROM', 'notifications@kanboard.local');
|
|||||||
// Mail transport para uso: "smtp", "sendmail" or "mail" (Funcion PHP mail)
|
// Mail transport para uso: "smtp", "sendmail" or "mail" (Funcion PHP mail)
|
||||||
define('MAIL_TRANSPORT', 'mail');
|
define('MAIL_TRANSPORT', 'mail');
|
||||||
|
|
||||||
// Configuración SMTP para usarse para elegir el trasporte de "smtp"
|
// Configuración SMTP para usarse para elegir el trasporte de "smtp"
|
||||||
define('MAIL_SMTP_HOSTNAME', '');
|
define('MAIL_SMTP_HOSTNAME', '');
|
||||||
define('MAIL_SMTP_PORT', 25);
|
define('MAIL_SMTP_PORT', 25);
|
||||||
define('MAIL_SMTP_USERNAME', '');
|
define('MAIL_SMTP_USERNAME', '');
|
||||||
@@ -65,7 +65,7 @@ define('MAIL_SMTP_ENCRYPTION', null); // Valid values are "null", "ssl" or "tls"
|
|||||||
define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs');
|
define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs');
|
||||||
```
|
```
|
||||||
|
|
||||||
Configuración de base de datos
|
Configuración de base de datos
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@@ -101,7 +101,7 @@ Configuraciones LDAP
|
|||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Habilitar la autenticación por LDAP (false por default)
|
// Habilitar la autenticación por LDAP (false por default)
|
||||||
define('LDAP_AUTH', false);
|
define('LDAP_AUTH', false);
|
||||||
|
|
||||||
// LDAP server hostname
|
// LDAP server hostname
|
||||||
@@ -116,7 +116,7 @@ define('LDAP_SSL_VERIFY', true);
|
|||||||
// Enable LDAP START_TLS
|
// Enable LDAP START_TLS
|
||||||
define('LDAP_START_TLS', false);
|
define('LDAP_START_TLS', false);
|
||||||
|
|
||||||
// Por defecto Kanboard tiene el nombre de usuario LDAP en minúscula para evitar usuarios duplicados ( la base de datos entre mayúsculas y minúsculas )
|
// Por defecto Kanboard tiene el nombre de usuario LDAP en minúscula para evitar usuarios duplicados ( la base de datos entre mayúsculas y minúsculas )
|
||||||
// Establece en true si desea conservar el caso
|
// Establece en true si desea conservar el caso
|
||||||
define('LDAP_USERNAME_CASE_SENSITIVE', false);
|
define('LDAP_USERNAME_CASE_SENSITIVE', false);
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ define('LDAP_USERNAME_CASE_SENSITIVE', false);
|
|||||||
define('LDAP_BIND_TYPE', 'anonymous');
|
define('LDAP_BIND_TYPE', 'anonymous');
|
||||||
|
|
||||||
// Nombre de usuario LDAP para utilizar con el modo de proxy
|
// Nombre de usuario LDAP para utilizar con el modo de proxy
|
||||||
// Patrón de nombre de usuario LDAP para utilizar con el modo de usuario
|
// Patrón de nombre de usuario LDAP para utilizar con el modo de usuario
|
||||||
define('LDAP_USERNAME', null);
|
define('LDAP_USERNAME', null);
|
||||||
|
|
||||||
// password LDAP para usar en modo proxy
|
// password LDAP para usar en modo proxy
|
||||||
@@ -175,7 +175,7 @@ define('LDAP_GROUP_ADMIN_DN', '');
|
|||||||
define('LDAP_GROUP_MANAGER_DN', '');
|
define('LDAP_GROUP_MANAGER_DN', '');
|
||||||
|
|
||||||
// Habilitiar proveedor LDAP de grupo para permisos de proyecto
|
// Habilitiar proveedor LDAP de grupo para permisos de proyecto
|
||||||
// El usuario final será capaz de navegar por los grupos LDAP desde la interfaz de usuario y permitir el acceso a proyectos específicos
|
// El usuario final será capaz de navegar por los grupos LDAP desde la interfaz de usuario y permitir el acceso a proyectos específicos
|
||||||
define('LDAP_GROUP_PROVIDER', false);
|
define('LDAP_GROUP_PROVIDER', false);
|
||||||
|
|
||||||
// LDAP Base DN for groups
|
// LDAP Base DN for groups
|
||||||
@@ -186,7 +186,7 @@ define('LDAP_GROUP_BASE_DN', '');
|
|||||||
define('LDAP_GROUP_FILTER', '');
|
define('LDAP_GROUP_FILTER', '');
|
||||||
|
|
||||||
// LDAP filtro por grupo de usuario
|
// LDAP filtro por grupo de usuario
|
||||||
// Si se configura este filtro , Kanboard buscará grupos de usuarios en LDAP_GROUP_BASE_DN
|
// Si se configura este filtro , Kanboard buscará grupos de usuarios en LDAP_GROUP_BASE_DN
|
||||||
// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s))
|
// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s))
|
||||||
define('LDAP_GROUP_USER_FILTER', '');
|
define('LDAP_GROUP_USER_FILTER', '');
|
||||||
|
|
||||||
@@ -194,11 +194,11 @@ define('LDAP_GROUP_USER_FILTER', '');
|
|||||||
define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn');
|
define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn');
|
||||||
```
|
```
|
||||||
|
|
||||||
Reverse-Proxy configuración de autenticación
|
Reverse-Proxy configuración de autenticación
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Enable/disable la autenticación reverse proxy
|
// Enable/disable la autenticación reverse proxy
|
||||||
define('REVERSE_PROXY_AUTH', false);
|
define('REVERSE_PROXY_AUTH', false);
|
||||||
|
|
||||||
// Nombre del header a utilizar para el nombre de usuario
|
// Nombre del header a utilizar para el nombre de usuario
|
||||||
@@ -207,15 +207,15 @@ define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER');
|
|||||||
// Nombre de usuario del administrador , por defecto en blanco
|
// Nombre de usuario del administrador , por defecto en blanco
|
||||||
define('REVERSE_PROXY_DEFAULT_ADMIN', '');
|
define('REVERSE_PROXY_DEFAULT_ADMIN', '');
|
||||||
|
|
||||||
// Dominio por defecto a utilizar para configurar la dirección de correo electrónico
|
// Dominio por defecto a utilizar para configurar la dirección de correo electrónico
|
||||||
define('REVERSE_PROXY_DEFAULT_DOMAIN', '');
|
define('REVERSE_PROXY_DEFAULT_DOMAIN', '');
|
||||||
```
|
```
|
||||||
|
|
||||||
Configuración para la autenticacion RememberMe
|
Configuración para la autenticacion RememberMe
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Enable/disable recuerdame autenticación
|
// Enable/disable recuerdame autenticación
|
||||||
define('REMEMBER_ME_AUTH', true);
|
define('REMEMBER_ME_AUTH', true);
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -244,14 +244,14 @@ define('LOG_DRIVER', '');
|
|||||||
define('LOG_FILE', __DIR__.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'debug.log');
|
define('LOG_FILE', __DIR__.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'debug.log');
|
||||||
```
|
```
|
||||||
|
|
||||||
Protección de Brute-force
|
Protección de Brute-force
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Habilitar captcha despues de 3 autenticaciones fallidas
|
// Habilitar captcha despues de 3 autenticaciones fallidas
|
||||||
define('BRUTEFORCE_CAPTCHA', 3);
|
define('BRUTEFORCE_CAPTCHA', 3);
|
||||||
|
|
||||||
// Bloquear la cuenta después de 6 autenticaciones fallidas
|
// Bloquear la cuenta después de 6 autenticaciones fallidas
|
||||||
define('BRUTEFORCE_LOCKDOWN', 6);
|
define('BRUTEFORCE_LOCKDOWN', 6);
|
||||||
|
|
||||||
// Bloquear la cuenta durante un minute
|
// Bloquear la cuenta durante un minute
|
||||||
@@ -270,7 +270,7 @@ define('SESSION_DURATION', 0);
|
|||||||
Clientes HTTP
|
Clientes HTTP
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Si las peticiones HTTP externas debe ser enviada a través de un proxy :
|
Si las peticiones HTTP externas debe ser enviada a través de un proxy :
|
||||||
|
|
||||||
```php
|
```php
|
||||||
define('HTTP_PROXY_HOSTNAME', '');
|
define('HTTP_PROXY_HOSTNAME', '');
|
||||||
@@ -293,15 +293,15 @@ Varias configuraciones
|
|||||||
// Escapar de HTML dentro del texto de markdown
|
// Escapar de HTML dentro del texto de markdown
|
||||||
define('MARKDOWN_ESCAPE_HTML', true);
|
define('MARKDOWN_ESCAPE_HTML', true);
|
||||||
|
|
||||||
// Cabecera de autenticación alternativo API , el valor predeterminado es la autenticación básica HTTP definido en RFC2617
|
// Cabecera de autenticación alternativo API , el valor predeterminado es la autenticación básica HTTP definido en RFC2617
|
||||||
define('API_AUTHENTICATION_HEADER', '');
|
define('API_AUTHENTICATION_HEADER', '');
|
||||||
|
|
||||||
// Oculatar el formulario de login, usarlo si todos tus usuarios usan Google/Github/ReverseProxy authentication
|
// Oculatar el formulario de login, usarlo si todos tus usuarios usan Google/Github/ReverseProxy authentication
|
||||||
define('HIDE_LOGIN_FORM', false);
|
define('HIDE_LOGIN_FORM', false);
|
||||||
|
|
||||||
// Desactivación de cierre de sesión ( SSO para la autenticación externa )
|
// Desactivación de cierre de sesión ( SSO para la autenticación externa )
|
||||||
define('DISABLE_LOGOUT', false);
|
define('DISABLE_LOGOUT', false);
|
||||||
|
|
||||||
// Invalidar token de la API almacenada en la base de datos , útil para pruebas automatizadas
|
// Invalidar token de la API almacenada en la base de datos , útil para pruebas automatizadas
|
||||||
define('API_AUTHENTICATION_TOKEN', 'My unique API Token');
|
define('API_AUTHENTICATION_TOKEN', 'My unique API Token');
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,31 +1,31 @@
|
|||||||
Creación de tarea
|
Creación de tarea
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Desde el tablero, haga clic en el signo más **plus** al lado del nombre de la columna
|
Desde el tablero, haga clic en el signo más **plus** al lado del nombre de la columna
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
A continuación, aparece el formulario de creación de tareas:
|
A continuación, aparece el formulario de creación de tareas:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Descripción de campos:
|
Descripción de campos:
|
||||||
|
|
||||||
- **Titulo**: El título de su tarea, que se podrá ver en el tablero.
|
- **Titulo**: El título de su tarea, que se podrá ver en el tablero.
|
||||||
- **Descripción**: Descripción que usa el formato [Markdown](syntax-guide.markdown).
|
- **Descripción**: Descripción que usa el formato [Markdown](syntax-guide.markdown).
|
||||||
- **Tags**: Lista de etiquetas asociadas a las tareas
|
- **Tags**: Lista de etiquetas asociadas a las tareas
|
||||||
- **Crear otra tarea**:Marque esta casilla si desea crear una tarea similar (serán pre-llenados algunos campos)..
|
- **Crear otra tarea**:Marque esta casilla si desea crear una tarea similar (serán pre-llenados algunos campos)..
|
||||||
- **Color**: Escoger el color de la tarjeta.
|
- **Color**: Escoger el color de la tarjeta.
|
||||||
- **Asignado**: Persona que trabajara en la tarea.
|
- **Asignado**: Persona que trabajara en la tarea.
|
||||||
- **Categoría**: Sólo una categoría puede ser asignado a una tarea (visibles sólo si los proyectos tienen categorías).
|
- **Categoría**: Sólo una categoría puede ser asignado a una tarea (visibles sólo si los proyectos tienen categorías).
|
||||||
- **Columna**: La columna en la que se creó la tarea, su tarea se coloca en la parte inferior.
|
- **Columna**: La columna en la que se creó la tarea, su tarea se coloca en la parte inferior.
|
||||||
- **Prioridad**: AL Prioridad de la tarea, el intervalo se puede definir en la configuración del proyecto, los valores por defecto son P0 a P3.
|
- **Prioridad**: AL Prioridad de la tarea, el intervalo se puede definir en la configuración del proyecto, los valores por defecto son P0 a P3.
|
||||||
- **Complejidad**: Se utiliza en la gestión de proyectos ágiles (Scrum), los puntos de complejidad o de la historia es un número que le dice al equipo lo difícil es la historia. A menudo, las personas utilizan la serie de Fibonacci.
|
- **Complejidad**: Se utiliza en la gestión de proyectos ágiles (Scrum), los puntos de complejidad o de la historia es un número que le dice al equipo lo difícil es la historia. A menudo, las personas utilizan la serie de Fibonacci.
|
||||||
- **Referencia**: ID externo para la tarea, por ejemplo, puede ser el número de entradas que provienen de otro sistema
|
- **Referencia**: ID externo para la tarea, por ejemplo, puede ser el número de entradas que provienen de otro sistema
|
||||||
- **Estimación original** : Estimación de horas para completar la tarea.
|
- **Estimación original** : Estimación de horas para completar la tarea.
|
||||||
- **Tiempo transcurrido** : El tiempo dedicado a trabajar en la tarea.
|
- **Tiempo transcurrido** : El tiempo dedicado a trabajar en la tarea.
|
||||||
- **Fecha de Inicio** : Se trata de un campo de fecha y hora.
|
- **Fecha de Inicio** : Se trata de un campo de fecha y hora.
|
||||||
- **Fecha de vencimiento** : Las tareas vencidas se tiene una fecha de vencimiento próxima rojo y las fechas de vencimiento será de color negro en el tablero. Varios formato de fecha se aceptan además del selector de fecha.
|
- **Fecha de vencimiento** : Las tareas vencidas se tiene una fecha de vencimiento próxima rojo y las fechas de vencimiento será de color negro en el tablero. Varios formato de fecha se aceptan además del selector de fecha.
|
||||||
|
|
||||||
|
|
||||||
Con el enlace de vista previa, se puede ver la descripción de la tarea convertiendo la sintaxis de Markdown.
|
Con el enlace de vista previa, se puede ver la descripción de la tarea convertiendo la sintaxis de Markdown.
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ Tu puedes recomendar un proveedor de web hosting para Kanboard?
|
|||||||
Kanboard funciona bien con cualquier VPS proveedor de hosting como [Digital Ocean](https://www.digitalocean.com/?refcode=4b541f47aae4),
|
Kanboard funciona bien con cualquier VPS proveedor de hosting como [Digital Ocean](https://www.digitalocean.com/?refcode=4b541f47aae4),
|
||||||
[Linode](https://www.linode.com/?r=4e381ac8a61116f40c60dc7438acc719610d8b11) o [Gandi](https://www.gandi.net/).
|
[Linode](https://www.linode.com/?r=4e381ac8a61116f40c60dc7438acc719610d8b11) o [Gandi](https://www.gandi.net/).
|
||||||
|
|
||||||
Para tener el mejor performance , elegir un proveedor con el disco rápido de I/O porque Kanboard utilizar SQLite de forma predeterminada .
|
Para tener el mejor performance , elegir un proveedor con el disco rápido de I/O porque Kanboard utilizar SQLite de forma predeterminada .
|
||||||
Evitar los proveedores de alojamiento que utilizan un punto de montaje NFS compartido.
|
Evitar los proveedores de alojamiento que utilizan un punto de montaje NFS compartido.
|
||||||
|
|
||||||
|
|
||||||
Me sale una página en blanco después de instalar o actualizar Kanboard
|
Me sale una página en blanco después de instalar o actualizar Kanboard
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
- Verificar si tienes instalados todos los requerimientos en tu servidor
|
- Verificar si tienes instalados todos los requerimientos en tu servidor
|
||||||
@@ -23,17 +23,17 @@ Me sale una p
|
|||||||
Si Tienes el error "No hay CSPRNG adecuado instalado en su sistema "
|
Si Tienes el error "No hay CSPRNG adecuado instalado en su sistema "
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
Si tu usas PHP < 7.0, Tu necesitas tener la extensión openssl habilitada o `/dev/urandom` accesible desde la aplicación si se
|
Si tu usas PHP < 7.0, Tu necesitas tener la extensión openssl habilitada o `/dev/urandom` accesible desde la aplicación si se
|
||||||
restringe por un `open_basedir`
|
restringe por un `open_basedir`
|
||||||
|
|
||||||
|
|
||||||
Página no encontrada y la URL parece mal (&amp;)
|
Página no encontrada y la URL parece mal (&amp;)
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
- La URL se mira como `/?controller=auth&action=login&redirect_query=` instanciada de `?controller=auth&action=login&redirect_query=`
|
- La URL se mira como `/?controller=auth&action=login&redirect_query=` instanciada de `?controller=auth&action=login&redirect_query=`
|
||||||
- Kanboard regresa el error "Page not found"
|
- Kanboard regresa el error "Page not found"
|
||||||
|
|
||||||
Este problema proviene de la configuración de PHP , el valor de ` arg_separator.output` no es defecto del PHP , hay diferentes maneras de solucionar que:
|
Este problema proviene de la configuración de PHP , el valor de ` arg_separator.output` no es defecto del PHP , hay diferentes maneras de solucionar que:
|
||||||
|
|
||||||
Cambiar el valor directamente en su ` php.ini` si es posible :
|
Cambiar el valor directamente en su ` php.ini` si es posible :
|
||||||
|
|
||||||
@@ -47,14 +47,14 @@ Sustituir el valor con un ` .htaccess` :
|
|||||||
arg_separator.output php_value "& "
|
arg_separator.output php_value "& "
|
||||||
`` `
|
`` `
|
||||||
|
|
||||||
De lo contrario Kanboard tratará de anular el valor directamente en PHP .
|
De lo contrario Kanboard tratará de anular el valor directamente en PHP .
|
||||||
|
|
||||||
|
|
||||||
Error de autenticación con la API y Apache + PHP - FPM
|
Error de autenticación con la API y Apache + PHP - FPM
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
|
|
||||||
Php-cgi bajo Apache HTTP basico no pasa user/pass forma predeterminada .
|
Php-cgi bajo Apache HTTP basico no pasa user/pass forma predeterminada .
|
||||||
Para que esta solución funcione , añadir estas líneas a su archivo ` .htaccess` :
|
Para que esta solución funcione , añadir estas líneas a su archivo ` .htaccess` :
|
||||||
|
|
||||||
```
|
```
|
||||||
RewriteCond %{HTTP:Authorization} ^(.+)$
|
RewriteCond %{HTTP:Authorization} ^(.+)$
|
||||||
@@ -66,16 +66,16 @@ Problemas conocidos con eAccelerator
|
|||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
Kanboard no funciona muy bien con [eAccelerator](http://eaccelerator.net).
|
Kanboard no funciona muy bien con [eAccelerator](http://eaccelerator.net).
|
||||||
El problema puede ser causado una página en blanco o un accidente de Apache :
|
El problema puede ser causado una página en blanco o un accidente de Apache :
|
||||||
|
|
||||||
```
|
```
|
||||||
[Wed Mar 05 21:36:56 2014] [notice] child pid 22630 exit signal Segmentation fault (11)
|
[Wed Mar 05 21:36:56 2014] [notice] child pid 22630 exit signal Segmentation fault (11)
|
||||||
```
|
```
|
||||||
|
|
||||||
La mejor manera de evitar este problema es desactivar eAccelerator o definir manualmente los archivos que desea almacenar en caché con el parámetro de configuración ` eaccelerator.filter` .
|
La mejor manera de evitar este problema es desactivar eAccelerator o definir manualmente los archivos que desea almacenar en caché con el parámetro de configuración ` eaccelerator.filter` .
|
||||||
|
|
||||||
The project [eAccelerator parece muerto y no se actualiza desde 2012](https://github.com/eaccelerator/eaccelerator/commits/master).
|
The project [eAccelerator parece muerto y no se actualiza desde 2012](https://github.com/eaccelerator/eaccelerator/commits/master).
|
||||||
Recomendamos para cambiar a la ultima versión de PHP por que el bundled viene con [OPcache](http://php.net/manual/en/intro.opcache.php).
|
Recomendamos para cambiar a la ultima versión de PHP por que el bundled viene con [OPcache](http://php.net/manual/en/intro.opcache.php).
|
||||||
|
|
||||||
|
|
||||||
Por que el requerimiento minimo es PHP 5.3.3?
|
Por que el requerimiento minimo es PHP 5.3.3?
|
||||||
@@ -91,7 +91,7 @@ Al parecer , CentOS y Debian tienen parches de seguridad en su back-port para PH
|
|||||||
Kanboard v1.0.10 y v1.0.11 requiere al menos PHP 5.3.7 , pero este cambio se ha vuelto a ser compatible con PHP 5.3.3 con Kanboard > = v1.0.12
|
Kanboard v1.0.10 y v1.0.11 requiere al menos PHP 5.3.7 , pero este cambio se ha vuelto a ser compatible con PHP 5.3.3 con Kanboard > = v1.0.12
|
||||||
|
|
||||||
|
|
||||||
Cómo probar Kanboard con el PHP incorporado en el servidor web?
|
Cómo probar Kanboard con el PHP incorporado en el servidor web?
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
|
|
||||||
Si tu no quieres instalar un servidor web como Apache en tu localhost, tu puedes testearlo con el [servidor web embebido de PHP](http://www.php.net/manual/en/features.commandline.webserver.php):
|
Si tu no quieres instalar un servidor web como Apache en tu localhost, tu puedes testearlo con el [servidor web embebido de PHP](http://www.php.net/manual/en/features.commandline.webserver.php):
|
||||||
@@ -112,7 +112,7 @@ Como instalar Kanboard en Yunohost?
|
|||||||
Existe un [paquete para instalar Kanboard en Yunohost facilmente](https://github.com/mbugeia/kanboard_ynh).
|
Existe un [paquete para instalar Kanboard en Yunohost facilmente](https://github.com/mbugeia/kanboard_ynh).
|
||||||
|
|
||||||
|
|
||||||
¿Dónde puedo encontrar una lista de proyectos relacionados?
|
¿Dónde puedo encontrar una lista de proyectos relacionados?
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
- [Kanboard API python client by @freekoder](https://github.com/freekoder/kanboard-py)
|
- [Kanboard API python client by @freekoder](https://github.com/freekoder/kanboard-py)
|
||||||
@@ -126,7 +126,7 @@ Existe un [paquete para instalar Kanboard en Yunohost facilmente](https://github
|
|||||||
- [Git hooks for integration with Kanboard by Gene Pavlovsky](https://github.com/gene-pavlovsky/kanboard-git-hooks)
|
- [Git hooks for integration with Kanboard by Gene Pavlovsky](https://github.com/gene-pavlovsky/kanboard-git-hooks)
|
||||||
|
|
||||||
|
|
||||||
¿Hay algunos tutoriales sobre Kanboard en otro idioma?
|
¿Hay algunos tutoriales sobre Kanboard en otro idioma?
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
|
||||||
- [Artículo serie alemana sobre Kanboard](http://demaya.de/wp/2014/07/kanboard-eine-jira-alternative-im-detail-installation/)
|
- [Artículo serie alemana sobre Kanboard](http://demaya.de/wp/2014/07/kanboard-eine-jira-alternative-im-detail-installation/)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Configuración Mysql/MariaDB
|
Configuración Mysql/MariaDB
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
|
||||||
@@ -9,25 +9,25 @@ Requirimientos
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
- Mysql server
|
- Mysql server
|
||||||
- Instalar la extensión `pdo_mysql` en PHP
|
- Instalar la extensión `pdo_mysql` en PHP
|
||||||
|
|
||||||
Nota: Kanboard esta testeada con **Mysql >= 5.5 y MariaDB >= 10.0**
|
Nota: Kanboard esta testeada con **Mysql >= 5.5 y MariaDB >= 10.0**
|
||||||
|
|
||||||
configuración Mysql
|
configuración Mysql
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
### Crear una base de datos
|
### Crear una base de datos
|
||||||
|
|
||||||
El primer paso es crear una base de datos en tu servidor MySQL
|
El primer paso es crear una base de datos en tu servidor MySQL
|
||||||
Por ejemplo, se puede hacer eso con el cliente de línea de comandos mysql:
|
Por ejemplo, se puede hacer eso con el cliente de línea de comandos mysql:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
CREATE DATABASE kanboard;
|
CREATE DATABASE kanboard;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Crear un archivo de configuración
|
### Crear un archivo de configuración
|
||||||
|
|
||||||
El archivo `config.php` debería contener estos valores:
|
El archivo `config.php` debería contener estos valores:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
@@ -47,7 +47,7 @@ Nota: Se puede renombrar el archivo de plantilla `config.default.php` a `config.
|
|||||||
### Importando SQL dump (metodo alternativo)
|
### Importando SQL dump (metodo alternativo)
|
||||||
|
|
||||||
|
|
||||||
Por primera vez, se ejecutará Kanboard uno por uno cada migración de base de datos y este proceso puede tardar algún tiempo de acuerdo a su configuración.
|
Por primera vez, se ejecutará Kanboard uno por uno cada migración de base de datos y este proceso puede tardar algún tiempo de acuerdo a su configuración.
|
||||||
|
|
||||||
Para evitar cualquier tiempo de espera de potencial se puede inicializar la base de datos directamente importando el esquema de SQL:
|
Para evitar cualquier tiempo de espera de potencial se puede inicializar la base de datos directamente importando el esquema de SQL:
|
||||||
|
|
||||||
@@ -55,12 +55,12 @@ Para evitar cualquier tiempo de espera de potencial se puede inicializar la base
|
|||||||
mysql -u root -p my_database < app/Schema/Sql/mysql.sql
|
mysql -u root -p my_database < app/Schema/Sql/mysql.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
El archivo `app/Schema/Sql/mysql.sql` es un dump SQL que representa la ultima versión de la base de datos
|
El archivo `app/Schema/Sql/mysql.sql` es un dump SQL que representa la ultima versión de la base de datos
|
||||||
|
|
||||||
SSL configuración
|
SSL configuración
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Estos parámetros tienen que ser definidas para permitir la conexión SSL Mysql:
|
Estos parámetros tienen que ser definidas para permitir la conexión SSL Mysql:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Mysql SSL key
|
// Mysql SSL key
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
Arquitectura de autenticación
|
Arquitectura de autenticación
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
Kanboard provee una flexible y conectable arquitectura de autenticación.
|
Kanboard provee una flexible y conectable arquitectura de autenticación.
|
||||||
|
|
||||||
Por default, el usuario puede autenticarse con multiple metodos:
|
Por default, el usuario puede autenticarse con multiple metodos:
|
||||||
|
|
||||||
- Autenticación por usuario y password (Base de datos local y LDAP)
|
- Autenticación por usuario y password (Base de datos local y LDAP)
|
||||||
- Autenticación OAuth2
|
- Autenticación OAuth2
|
||||||
- Autenticación Reverse-Proxy
|
- Autenticación Reverse-Proxy
|
||||||
- Autenticación basada en Cookie (Recuerdame)
|
- Autenticación basada en Cookie (Recuerdame)
|
||||||
|
|
||||||
Además, despues de una autenticación satisfactoria un puede hacerse post de autenticación Two-Factor .
|
Además, despues de una autenticación satisfactoria un puede hacerse post de autenticación Two-Factor .
|
||||||
Kanboard sopoarta nativamente el standart TOTP.
|
Kanboard sopoarta nativamente el standart TOTP.
|
||||||
|
|
||||||
Interfaces de autenticación
|
Interfaces de autenticación
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
Para tener un sistema conectable, los drivers de autenticación deben implementar un conjunto de interfaces
|
Para tener un sistema conectable, los drivers de autenticación deben implementar un conjunto de interfaces
|
||||||
|
|
||||||
| Interface | Rol |
|
| Interface | Rol |
|
||||||
|------------------------------------------|------------------------------------------------------------------|
|
|------------------------------------------|------------------------------------------------------------------|
|
||||||
| AuthenticationProviderInterface | Interface base para otras interfaces de autenticación |
|
| AuthenticationProviderInterface | Interface base para otras interfaces de autenticación |
|
||||||
| PreAuthenticationProviderInterface | The user is already authenticated al alcanzar la aplicación, Usualmente los servidores web definen algunas variables de entorno |
|
| PreAuthenticationProviderInterface | The user is already authenticated al alcanzar la aplicación, Usualmente los servidores web definen algunas variables de entorno |
|
||||||
| PasswordAuthenticationProviderInterface | El metodo de autenticación que usa el username y password provienen del formulario de login |
|
| PasswordAuthenticationProviderInterface | El metodo de autenticación que usa el username y password provienen del formulario de login |
|
||||||
| OAuthAuthenticationProviderInterface | Proveedores OAuth2 |
|
| OAuthAuthenticationProviderInterface | Proveedores OAuth2 |
|
||||||
| PostAuthenticationProviderInterface | Drivers de autenticación Two-Factor ,pide el código a confirmar |
|
| PostAuthenticationProviderInterface | Drivers de autenticación Two-Factor ,pide el código a confirmar |
|
||||||
| SessionCheckProviderInterface | Los proveedores que son capaces de comprobar si la sesión de usuario es válida |
|
| SessionCheckProviderInterface | Los proveedores que son capaces de comprobar si la sesión de usuario es válida |
|
||||||
|
|
||||||
### Ejemplos de autenticación de proveedores:
|
### Ejemplos de autenticación de proveedores:
|
||||||
|
|
||||||
- Database por default metodos a implementar `PasswordAuthenticationProviderInterface` y `SessionCheckProviderInterface`
|
- Database por default metodos a implementar `PasswordAuthenticationProviderInterface` y `SessionCheckProviderInterface`
|
||||||
- Reverse-Proxy metodos a implementar `PreAuthenticationProviderInterface` y `SessionCheckProviderInterface`
|
- Reverse-Proxy metodos a implementar `PreAuthenticationProviderInterface` y `SessionCheckProviderInterface`
|
||||||
@@ -36,64 +36,64 @@ Para tener un sistema conectable, los drivers de autenticaci
|
|||||||
- RememberMe cookie metodos a implementar `PreAuthenticationProviderInterface`
|
- RememberMe cookie metodos a implementar `PreAuthenticationProviderInterface`
|
||||||
- Two-Factor TOTP metodos a implementar `PostAuthenticationProviderInterface`
|
- Two-Factor TOTP metodos a implementar `PostAuthenticationProviderInterface`
|
||||||
|
|
||||||
flujo de trabajo de autenticación ** Workflow **
|
flujo de trabajo de autenticación ** Workflow **
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
Para cada peticion HTTP:
|
Para cada peticion HTTP:
|
||||||
|
|
||||||
1. Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa`SessionCheckProviderInterface`
|
1. Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa`SessionCheckProviderInterface`
|
||||||
2. Ejecuta todos los proveedores que implementa `PreAuthenticationProviderInterface`
|
2. Ejecuta todos los proveedores que implementa `PreAuthenticationProviderInterface`
|
||||||
3. Si el usuario final hace un submit al formulario del login, Los proveedores que implementa `PasswordAuthenticationProviderInterface` are executed
|
3. Si el usuario final hace un submit al formulario del login, Los proveedores que implementa `PasswordAuthenticationProviderInterface` are executed
|
||||||
4. Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar
|
4. Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar
|
||||||
5. Despues de una autenticación satisfactoria, el ultimo registro utilizará `PostAuthenticationProviderInterface`
|
5. Despues de una autenticación satisfactoria, el ultimo registro utilizará `PostAuthenticationProviderInterface`
|
||||||
6. Sincronizar la información del usuario si es necesario
|
6. Sincronizar la información del usuario si es necesario
|
||||||
|
|
||||||
Este workflow es manejado por la clase `Kanboard\Core\Security\AuthenticationManager`.
|
Este workflow es manejado por la clase `Kanboard\Core\Security\AuthenticationManager`.
|
||||||
|
|
||||||
Eventos disparados:
|
Eventos disparados:
|
||||||
|
|
||||||
- `AuthenticationManager::EVENT_SUCCESS`: autenticación satisfactoria
|
- `AuthenticationManager::EVENT_SUCCESS`: autenticación satisfactoria
|
||||||
- `AuthenticationManager::EVENT_FAILURE`: autenticación fallida
|
- `AuthenticationManager::EVENT_FAILURE`: autenticación fallida
|
||||||
|
|
||||||
Cada vez que se produce un evento de fallo , el contador de intentos fallidos se incrementa.
|
Cada vez que se produce un evento de fallo , el contador de intentos fallidos se incrementa.
|
||||||
|
|
||||||
La cuenta de usuario se puede bloquear para el período de tiempo configurado y un captcha puede ser mostrado para evitar ataques de fuerza bruta .
|
La cuenta de usuario se puede bloquear para el período de tiempo configurado y un captcha puede ser mostrado para evitar ataques de fuerza bruta .
|
||||||
|
|
||||||
Interface de usuario del proveedor
|
Interface de usuario del proveedor
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
Cuando la autenticación es satisfactoria, la `AuthenticationManager` pedura la información del usuario para que el driver llame al metodo `getUser()`.
|
Cuando la autenticación es satisfactoria, la `AuthenticationManager` pedura la información del usuario para que el driver llame al metodo `getUser()`.
|
||||||
Este metodo debe regresar un objeto que implementa la interface `Kanboard\Core\User\UserProviderInterface`.
|
Este metodo debe regresar un objeto que implementa la interface `Kanboard\Core\User\UserProviderInterface`.
|
||||||
|
|
||||||
Esta clase abstracta reune la información dede otro sistema.
|
Esta clase abstracta reune la información dede otro sistema.
|
||||||
|
|
||||||
Ejemplos :
|
Ejemplos :
|
||||||
|
|
||||||
- `DatabaseUserProvider` proporciona información para un usuario interno
|
- `DatabaseUserProvider` proporciona información para un usuario interno
|
||||||
- `LdapUserProvider` para un usuario LDAP
|
- `LdapUserProvider` para un usuario LDAP
|
||||||
- `ReverseProxyUserProvider` para un usuario Reverse-Proxy
|
- `ReverseProxyUserProvider` para un usuario Reverse-Proxy
|
||||||
- `GoogleUserProvider` represtan un usuario de Google
|
- `GoogleUserProvider` represtan un usuario de Google
|
||||||
|
|
||||||
Los métodos para la interface del proveedor de Usuario:
|
Los métodos para la interface del proveedor de Usuario:
|
||||||
|
|
||||||
- `isUserCreationAllowed()`: Regresa true para permitir la creación automática de usuarios
|
- `isUserCreationAllowed()`: Regresa true para permitir la creación automática de usuarios
|
||||||
- `getExternalIdColumn()`: Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...)
|
- `getExternalIdColumn()`: Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...)
|
||||||
- `getInternalId()`: Obtener el id interno de la base de datos
|
- `getInternalId()`: Obtener el id interno de la base de datos
|
||||||
- `getExternalId()`: Obtener el id externo(Unique id)
|
- `getExternalId()`: Obtener el id externo(Unique id)
|
||||||
- `getRole()`: Obtener el rol de usuario
|
- `getRole()`: Obtener el rol de usuario
|
||||||
- `getUsername()`: Obtener en nombre de usuario ** username **
|
- `getUsername()`: Obtener en nombre de usuario ** username **
|
||||||
- `getName()`: Obtener nombre completo del usuario
|
- `getName()`: Obtener nombre completo del usuario
|
||||||
- `getEmail()`: Obtener el correo electronico del usuario
|
- `getEmail()`: Obtener el correo electronico del usuario
|
||||||
- `getExternalGroupIds()`: Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presenta
|
- `getExternalGroupIds()`: Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presenta
|
||||||
- `getExtraAttributes()`: Obtiene los atributos extras para ser mostrados a el usuario durante la sincronización local
|
- `getExtraAttributes()`: Obtiene los atributos extras para ser mostrados a el usuario durante la sincronización local
|
||||||
|
|
||||||
No es obligatorio que el metodo devuelva un valor.
|
No es obligatorio que el metodo devuelva un valor.
|
||||||
|
|
||||||
Sincronización de un usuario local
|
Sincronización de un usuario local
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
La información del usuario puede ser sincronizada automáticamente con la base de datos local.
|
La información del usuario puede ser sincronizada automáticamente con la base de datos local.
|
||||||
|
|
||||||
- Si el metodo`getInternalId()` regresa un valor no realiza la sincronización
|
- Si el metodo`getInternalId()` regresa un valor no realiza la sincronización
|
||||||
- Los metodos `getExternalIdColumn()` y `getExternalId()` debe regresar un valor para sincronizar el usuario
|
- Los metodos `getExternalIdColumn()` y `getExternalId()` debe regresar un valor para sincronizar el usuario
|
||||||
- Las propiedades que regresan un ** String ** vacios no se sincronizan
|
- Las propiedades que regresan un ** String ** vacios no se sincronizan
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
Arquitecuta de autorización
|
Arquitecuta de autorización
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
Kanboard [soporta multiples roles](roles.markdown) a nivel de aplicación y a nivel de proyecto.
|
Kanboard [soporta multiples roles](roles.markdown) a nivel de aplicación y a nivel de proyecto.
|
||||||
|
|
||||||
Workflow de autorización
|
Workflow de autorización
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Para cada solicitud HTTP:
|
Para cada solicitud HTTP:
|
||||||
@@ -16,15 +16,15 @@ Para cada solicitud HTTP:
|
|||||||
Extendiendo mapa de accesos
|
Extendiendo mapa de accesos
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
Lista de accesos (ACL) se basa en el nombre de clase del controlador y el nombre del método
|
Lista de accesos (ACL) se basa en el nombre de clase del controlador y el nombre del método
|
||||||
La lista de acceso está a cargo de la clase `Kanboard\Core\Security\AccessMap`.
|
La lista de acceso está a cargo de la clase `Kanboard\Core\Security\AccessMap`.
|
||||||
|
|
||||||
Hay dos mapa de acceso: una para la aplicación y la otra para un proyecto.
|
Hay dos mapa de acceso: una para la aplicación y la otra para un proyecto.
|
||||||
|
|
||||||
- Acceso al mapa de aplicación : `$this->applicationAccessMap`
|
- Acceso al mapa de aplicación : `$this->applicationAccessMap`
|
||||||
- Acceso al mapa del proyecto: `$this->projectAccessMap`
|
- Acceso al mapa del proyecto: `$this->projectAccessMap`
|
||||||
|
|
||||||
Ejemplos para definir una nueva política para tu plugin:
|
Ejemplos para definir una nueva política para tu plugin:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// Todos los metodos de la clase MyController:
|
// Todos los metodos de la clase MyController:
|
||||||
@@ -36,4 +36,4 @@ $this->projectAccessMap->add('MyOtherController', array('create', 'save'), Role:
|
|||||||
|
|
||||||
Los roles estan defidos en la clase `Kanboard\Core\Security\Role`.
|
Los roles estan defidos en la clase `Kanboard\Core\Security\Role`.
|
||||||
|
|
||||||
Clase de autorización (`Kanboard\Core\Security\Authorization`) comprobará el acceso de cada página.
|
Clase de autorización (`Kanboard\Core\Security\Authorization`) comprobará el acceso de cada página.
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
Agregando acciones automáticas
|
Agregando acciones automáticas
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
Agregando una nueva acccion automática es bastante simple.
|
Agregando una nueva acccion automática es bastante simple.
|
||||||
|
|
||||||
Creando una nueva accion
|
Creando una nueva accion
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Tus acciones automáticas deben heradarse de la clase `Kanboard\Action\Base`.
|
Tus acciones automáticas deben heradarse de la clase `Kanboard\Action\Base`.
|
||||||
|
|
||||||
Varios métodos abstractos deben ser implementadas por sí mismo:
|
Varios métodos abstractos deben ser implementadas por sí mismo:
|
||||||
|
|
||||||
| Metodos | Descripción |
|
| Metodos | Descripción |
|
||||||
|-------------------------------------|------------------------------------------------------------------|
|
|-------------------------------------|------------------------------------------------------------------|
|
||||||
| `getDescription()` | Descripcion visible en la interface del usuario |
|
| `getDescription()` | Descripcion visible en la interface del usuario |
|
||||||
| `getCompatibleEvents()` | Obtener las listas de eventos compatibles |
|
| `getCompatibleEvents()` | Obtener las listas de eventos compatibles |
|
||||||
| `getActionRequiredParameters()` | Obtener los parametros requeridos para la acción (definidos por el usuario)|
|
| `getActionRequiredParameters()` | Obtener los parametros requeridos para la acción (definidos por el usuario)|
|
||||||
| `getEventRequiredParameters()` | Obtener los parametros requeridos para el evento |
|
| `getEventRequiredParameters()` | Obtener los parametros requeridos para el evento |
|
||||||
| `doAction(array $data)` | Ejecutar la acción, Debe regresar true si fue satisfactorio |
|
| `doAction(array $data)` | Ejecutar la acción, Debe regresar true si fue satisfactorio |
|
||||||
| `hasRequiredCondition(array $data)` | Comprobar si los datos de eventos cumplen la condición de acción |
|
| `hasRequiredCondition(array $data)` | Comprobar si los datos de eventos cumplen la condición de acción |
|
||||||
|
|
||||||
Tu accion automatica es identificada en kanboard utilizando el nombre de la clase absoluta con el espacio de nombre incluido
|
Tu accion automatica es identificada en kanboard utilizando el nombre de la clase absoluta con el espacio de nombre incluido
|
||||||
|
|
||||||
Agregando nuevos eventos
|
Agregando nuevos eventos
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
La lista de eventos de la aplicación está disponible en la clase `Kanboard\Core\Event\EventManager::getAll()`.
|
La lista de eventos de la aplicación está disponible en la clase `Kanboard\Core\Event\EventManager::getAll()`.
|
||||||
Sin embargo, si tu plugin dispara nuevos eventos, tu puedes registrar estos eventos :
|
Sin embargo, si tu plugin dispara nuevos eventos, tu puedes registrar estos eventos :
|
||||||
|
|
||||||
```php
|
```php
|
||||||
@@ -33,7 +33,7 @@ $this->actionManager->getAction('\Kanboard\Plugin\MyPlugin\MyActionName')->addEv
|
|||||||
|
|
||||||
Tu puedes extender la lista de eventos compatibles de acciones existentes para ser usada en algun metodo.
|
Tu puedes extender la lista de eventos compatibles de acciones existentes para ser usada en algun metodo.
|
||||||
|
|
||||||
Registra la acción
|
Registra la acción
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Tu tienes que llamar el metodo `register()` desde la clase `Kanboard\Core\Action\ActionManager`:
|
Tu tienes que llamar el metodo `register()` desde la clase `Kanboard\Core\Action\ActionManager`:
|
||||||
@@ -58,4 +58,4 @@ class Plugin extends Base
|
|||||||
Ejemplo
|
Ejemplo
|
||||||
-------
|
-------
|
||||||
|
|
||||||
- [Ejemplo de acción automatica](https://github.com/kanboard/plugin-example-automatic-action)
|
- [Ejemplo de acción automatica](https://github.com/kanboard/plugin-example-automatic-action)
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
Plugin de configuración del directorio
|
Plugin de configuración del directorio
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
Para instalar, actualizar y eliminar plugins dede la interface de usuario, debes tener estos requerimientos:
|
Para instalar, actualizar y eliminar plugins dede la interface de usuario, debes tener estos requerimientos:
|
||||||
|
|
||||||
- El directorio del plugin debe ser de escritura por el usuario del servidor web
|
- El directorio del plugin debe ser de escritura por el usuario del servidor web
|
||||||
- La extensión Zip debe estar disponible en tu server.
|
- La extensión Zip debe estar disponible en tu server.
|
||||||
- Los parametros de configuración `PLUGIN_INSTALLER` deben estar en `true`
|
- Los parametros de configuración `PLUGIN_INSTALLER` deben estar en `true`
|
||||||
|
|
||||||
Para desactivar esta función , cambie el valor de `PLUGIN_INSTALLER` a `false` en tu archivo de configuración.
|
Para desactivar esta función , cambie el valor de `PLUGIN_INSTALLER` a `false` en tu archivo de configuración.
|
||||||
También puede cambiar los permisos de la carpeta Plugin en el filesystem.
|
También puede cambiar los permisos de la carpeta Plugin en el filesystem.
|
||||||
|
|
||||||
Sólo los administradores pueden instalar plugins desde la interfaz de usuario.
|
Sólo los administradores pueden instalar plugins desde la interfaz de usuario.
|
||||||
|
|
||||||
Por defecto, sólo plug-in que aparece en la página web de Kanboard están disponibles .
|
Por defecto, sólo plug-in que aparece en la página web de Kanboard están disponibles .
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ $this->on('app.bootstrap', function($container) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
- El primer argumento es el nombre del evento (string)
|
- El primer argumento es el nombre del evento (string)
|
||||||
- El segundo argumento es una funcion PHP callable (finalización o metodos de la clase)
|
- El segundo argumento es una funcion PHP callable (finalización o metodos de la clase)
|
||||||
|
|
||||||
Agregando un nuevo evento
|
Agregando un nuevo evento
|
||||||
-------------------------
|
-------------------------
|
||||||
@@ -24,4 +24,4 @@ Para agregar un nuevo, tienes que llamar al metodo `register()` de la clase `Kan
|
|||||||
$this->eventManager->register('my.event.name', 'Mi descripcion del nuevo evento');
|
$this->eventManager->register('my.event.name', 'Mi descripcion del nuevo evento');
|
||||||
```
|
```
|
||||||
|
|
||||||
Estos eventos pueden ser utilizados por otros componentes de Kanboard como acciones automáticas .
|
Estos eventos pueden ser utilizados por otros componentes de Kanboard como acciones automáticas .
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Vinculación externa de proveedores
|
Vinculación externa de proveedores
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
Esta funcionalidad le permite vincular una tarea a los elementos adicionales almacenados en otro sistema.
|
Esta funcionalidad le permite vincular una tarea a los elementos adicionales almacenados en otro sistema.
|
||||||
@@ -14,14 +14,14 @@ Cada item tiene un tipo, u na URL, un tipo dedependencia y un titulo.
|
|||||||
|
|
||||||
Por default,Kanboard incluye dos tipos de proveedores
|
Por default,Kanboard incluye dos tipos de proveedores
|
||||||
|
|
||||||
- Vinculación Web : Copiar y pegar un enlace y Kanboard se ha podido ir a la página de título de forma automática.
|
- Vinculación Web : Copiar y pegar un enlace y Kanboard se ha podido ir a la página de título de forma automática.
|
||||||
- Datos adjuntos: Enlace a todo lo que no es una página web
|
- Datos adjuntos: Enlace a todo lo que no es una página web
|
||||||
|
|
||||||
Flujo de trabajo ** Workflow **
|
Flujo de trabajo ** Workflow **
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
1. El usuario final copia y pega el URL al submit del formulario.
|
1. El usuario final copia y pega el URL al submit del formulario.
|
||||||
2.- Si el tipo de link es "auto", Kanboard crea un bucle a través de todos los proveedores registrados hasta que hay una coincidencia
|
2.- Si el tipo de link es "auto", Kanboard crea un bucle a través de todos los proveedores registrados hasta que hay una coincidencia
|
||||||
3. Entonces , el proveedor de enlace devuelve un objeto que implementa la interfaz de `ExternalLinkInterface`
|
3. Entonces , el proveedor de enlace devuelve un objeto que implementa la interfaz de `ExternalLinkInterface`
|
||||||
4. El formulario se muestra al usuario con todos los datos precargados antes de guardar el enlace
|
4. El formulario se muestra al usuario con todos los datos precargados antes de guardar el enlace
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ Para implementar un nuevo vinculo al proveedor desde un plugin, es necesario cre
|
|||||||
| Method | Usage |
|
| Method | Usage |
|
||||||
|----------------------------|---------------------------------------------------------------------------------|
|
|----------------------------|---------------------------------------------------------------------------------|
|
||||||
| `getName()` | Obtener el nombre del proveedor(label) |
|
| `getName()` | Obtener el nombre del proveedor(label) |
|
||||||
| `getType()` | Obtener el tipo de link (se guardarán en la base de datos) |
|
| `getType()` | Obtener el tipo de link (se guardarán en la base de datos) |
|
||||||
| `getDependencies()` | Obtener un diccionario de los tipos de dependencia soportados por el proveedor |
|
| `getDependencies()` | Obtener un diccionario de los tipos de dependencia soportados por el proveedor |
|
||||||
| `setUserTextInput($input)` | Texto introducido por el usuario |
|
| `setUserTextInput($input)` | Texto introducido por el usuario |
|
||||||
| `match()` | Regresa true si el proveedor puede analizar correctamente la entrada del usuario|
|
| `match()` | Regresa true si el proveedor puede analizar correctamente la entrada del usuario|
|
||||||
|
|||||||
@@ -15,20 +15,20 @@ Flujo de trabajo del Grupo de Proveedores **Workflow**
|
|||||||
1. El usuario final **end-user** comienza a escribir el nombre del grupo y el campo se autocompleta
|
1. El usuario final **end-user** comienza a escribir el nombre del grupo y el campo se autocompleta
|
||||||
2. EL `GroupManager` la clase ejecuta la consulta para todos los proveedores de grupo registrados
|
2. EL `GroupManager` la clase ejecuta la consulta para todos los proveedores de grupo registrados
|
||||||
3. Los resultados son fusionados y regresados a la interface de usuario
|
3. Los resultados son fusionados y regresados a la interface de usuario
|
||||||
4. Antes de seleccionar un grupo, a información del grupo se sincronizan con la base de datos local si es necesario
|
4. Antes de seleccionar un grupo, a información del grupo se sincronizan con la base de datos local si es necesario
|
||||||
|
|
||||||
Interface del grupo de proveedores
|
Interface del grupo de proveedores
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
interface a implementar: `Kanboard\Core\Group\GroupProviderInterface`.
|
interface a implementar: `Kanboard\Core\Group\GroupProviderInterface`.
|
||||||
|
|
||||||
Las clases que implementa esta interface abstracta del grupo de información, solo hay 3 metodos:
|
Las clases que implementa esta interface abstracta del grupo de información, solo hay 3 metodos:
|
||||||
|
|
||||||
- `getInternalId()`: Obtiene el id interno de la base de datos, de otra manera regresa 0
|
- `getInternalId()`: Obtiene el id interno de la base de datos, de otra manera regresa 0
|
||||||
- `getExternalId()`: Obtiene un id unico externo
|
- `getExternalId()`: Obtiene un id unico externo
|
||||||
- `getName()`: Obtiene el nombre de grupo
|
- `getName()`: Obtiene el nombre de grupo
|
||||||
|
|
||||||
Kanboard utilizará el ID externo para sincronizar con la base de datos local.
|
Kanboard utilizará el ID externo para sincronizar con la base de datos local.
|
||||||
|
|
||||||
Interface Backend del grupo de proveedores
|
Interface Backend del grupo de proveedores
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Plugin Hooks
|
Plugin Hooks
|
||||||
============
|
============
|
||||||
|
|
||||||
Hooks de aplicación
|
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`
|
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`
|
||||||
@@ -16,13 +16,13 @@ $this->hook->on('hook_name', $callable);
|
|||||||
|
|
||||||
El primer argumento es el nombre del hook y el segundo es un callable PHP
|
El primer argumento es el nombre del hook y el segundo es un callable PHP
|
||||||
|
|
||||||
### Hooks ejecutado sólo una vez
|
### Hooks ejecutado sólo una vez
|
||||||
|
|
||||||
Algunos hooks solo tienen un listener:
|
Algunos hooks solo tienen un listener:
|
||||||
|
|
||||||
#### model:subtask-time-tracking:calculate:time-spent
|
#### model:subtask-time-tracking:calculate:time-spent
|
||||||
|
|
||||||
- Anular el cálculo del tiempo anterior cuando se detiene el temporizador de la subtarea
|
- Anular el cálculo del tiempo anterior cuando se detiene el temporizador de la subtarea
|
||||||
- Argumentos :
|
- Argumentos :
|
||||||
- `$user_id` (integer)
|
- `$user_id` (integer)
|
||||||
- `$start` (DateTime)
|
- `$start` (DateTime)
|
||||||
@@ -30,7 +30,7 @@ Algunos hooks solo tienen un listener:
|
|||||||
|
|
||||||
### Fusionar hooks
|
### 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.
|
"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:
|
Ejemplo para agregar eventos en el calendario del usuario:
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ class Plugin extends Base
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Lista de fusión de hooks:
|
Lista de fusión de hooks:
|
||||||
|
|
||||||
#### controller:task:form:default
|
#### controller:task:form:default
|
||||||
|
|
||||||
@@ -129,22 +129,22 @@ $this->hook->on('formatter:board:query', function (\PicoDb\Table &query) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
El código anterior mostrará sólo las tareas en rojo en el tablero.
|
El código anterior mostrará sólo las tareas en rojo en el tablero.
|
||||||
|
|
||||||
Lista de referencias de hooks:
|
Lista de referencias de hooks:
|
||||||
|
|
||||||
| Hook | Description |
|
| Hook | Description |
|
||||||
|--------------------------------------------|---------------------------------------------------------------|
|
|--------------------------------------------|---------------------------------------------------------------|
|
||||||
| `formatter:board:query` | Alterar consulta a la base antes de tablero de renderizado |
|
| `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: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 |
|
| `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: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
|
| `model:task:modification:prepare` | Alterar los valores del formulario antes de editar una tarea
|
||||||
|
|
||||||
Template Hooks
|
Template Hooks
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Template hooks permitirá añadir nuevos contenidos en las plantillas existentes.
|
Template hooks permitirá añadir nuevos contenidos en las plantillas existentes.
|
||||||
|
|
||||||
Ejemplo para agregar nuevos contenidos en el sidebar del dashboard:
|
Ejemplo para agregar nuevos contenidos en el sidebar del dashboard:
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ $this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/
|
|||||||
Este llamada es usualmente definida en el metodo `initialize()`
|
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.
|
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.
|
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`:
|
Ejemplo con `myplugin:dashboard/sidebar`:
|
||||||
|
|
||||||
@@ -180,11 +180,11 @@ Ejemplo con `myplugin:dashboard/sidebar`:
|
|||||||
- En el filesystem, El plugin esta localizado aqui: `plugins\Myplugin\Template\dashboard\sidebar.php`
|
- 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)
|
- Templates estan escritos en puro PHP (no se olvide de escapar los datos)
|
||||||
|
|
||||||
Los nombres de plantillas sin prefijo son plantillas básicas.
|
Los nombres de plantillas sin prefijo son plantillas básicas.
|
||||||
|
|
||||||
Lista de templates hooks:
|
Lista de templates hooks:
|
||||||
|
|
||||||
| Hook | Descripción |
|
| Hook | Descripción |
|
||||||
|--------------------------------------------|----------------------------------------------------|
|
|--------------------------------------------|----------------------------------------------------|
|
||||||
| `template:analytic:sidebar` | Sidebar en paginas analiticas |
|
| `template:analytic:sidebar` | Sidebar en paginas analiticas |
|
||||||
| `template:app:filters-helper:before` | Filtro helper dropdown (top) |
|
| `template:app:filters-helper:before` | Filtro helper dropdown (top) |
|
||||||
@@ -198,8 +198,8 @@ Lista de templates hooks:
|
|||||||
| `template:board:task:footer` | Tarea en el tablero : footer |
|
| `template:board:task:footer` | Tarea en el tablero : footer |
|
||||||
| `template:board:task:icons` | Tarea en el tablero: tooltip icon |
|
| `template:board:task:icons` | Tarea en el tablero: tooltip icon |
|
||||||
| `template:board:column:dropdown` | Menu Dropdown en las columnas del tablero |
|
| `template:board:column:dropdown` | Menu Dropdown en las columnas del tablero |
|
||||||
| `template:config:sidebar` | Sidebar pagina de configuración |
|
| `template:config:sidebar` | Sidebar pagina de configuración |
|
||||||
| `template:config:application ` | Aplicación de configuración del formulario |
|
| `template:config:application ` | Aplicación de configuración del formulario |
|
||||||
| `template:config:email` | Email settings page |
|
| `template:config:email` | Email settings page |
|
||||||
| `template:config:integrations` | Integration page in global settings |
|
| `template:config:integrations` | Integration page in global settings |
|
||||||
| `template:dashboard:sidebar` | Sidebar en la pagina del dashboard |
|
| `template:dashboard:sidebar` | Sidebar en la pagina del dashboard |
|
||||||
@@ -214,9 +214,9 @@ Lista de templates hooks:
|
|||||||
| `template:project:dropdown` | "Actions" menu a la izquierda vista para diferentes proyectos |
|
| `template:project:dropdown` | "Actions" menu a la izquierda vista para diferentes proyectos |
|
||||||
| `template:project:header:before` | Filtros de Proyectos (antes) |
|
| `template:project:header:before` | Filtros de Proyectos (antes) |
|
||||||
| `template:project:header:after` | Filtros de Proyectos (despues) |
|
| `template:project:header:after` | Filtros de Proyectos (despues) |
|
||||||
| `template:project:integrations` | Pagina de integracion de configuración de proyectos|
|
| `template:project:integrations` | Pagina de integracion de configuración de proyectos|
|
||||||
| `template:project:sidebar` | Sidebar 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: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:layout:top` | Task layout top (antes page header) |
|
||||||
| `template:task:details:top` | Resumen de tarea top |
|
| `template:task:details:top` | Resumen de tarea top |
|
||||||
| `template:task:details:bottom` | Resumen de tarea bottom |
|
| `template:task:details:bottom` | Resumen de tarea bottom |
|
||||||
@@ -225,25 +225,25 @@ Lista de templates hooks:
|
|||||||
| `template:task:details:third-column` | Resumen de tarea tres columnas |
|
| `template:task:details:third-column` | Resumen de tarea tres columnas |
|
||||||
| `template:task:details:fourth-column` | Resumen de tarea cuatro columnas |
|
| `template:task:details:fourth-column` | Resumen de tarea cuatro columnas |
|
||||||
| `template:task:dropdown` | Task dropdown menu en listado de paginas |
|
| `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:actions` | Sidebar on task page (sección de acciones) |
|
||||||
| `template:task:sidebar:information` | Sidebar on task page (sección de información) |
|
| `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:first-column` | 1st columna en forma de tarea |
|
||||||
| `template:task:form:second-column` | 2nd 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:form:third-column` | 3nd columna en forma de tarea |
|
||||||
| `template:task:show:top ` | Mostrar página de tareas : top |
|
| `template:task:show:top ` | Mostrar página de tareas : top |
|
||||||
| `template:task:show:bottom` | Mostrar página de tareas : bottom |
|
| `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-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-tasklinks` | Mostrar página de tareas : despues tasklinks |
|
||||||
| `template:task:show:before-subtasks` | Mostrar página de tareas : despues subtareas |
|
| `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-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-attachments` | Mostrar página de tareas : despues archivos adjuntos |
|
||||||
| `template:task:show:before-comments` | Mostrar página de tareas : despues comentarios |
|
| `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:authentication:form` | "Editar autenticación" formulario de perfil de usuario |
|
||||||
| `template:user:create-remote:form` | "Crear un usuario remoto" formulario |
|
| `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:external` | "Autenticación externa" la página de perfil de usuario |
|
||||||
| `template:user:integrations` | Integración en el 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: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) |
|
| `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 **.
|
Otro de los ganchos plantilla se pueden añadir en caso necesario , sólo hay que preguntar en el seguimiento de incidencias ** issue tracking **.
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ Por default Kanboard soporta 3 estadares de trasporte de email:
|
|||||||
Con la API del plugin tu puedes agregar un driver para cualquier proveedor de email.
|
Con la API del plugin tu puedes agregar un driver para cualquier proveedor de email.
|
||||||
Por ejemplo, nuestro plugin puede agregar un trasporte de email para un proveedor que usa un API HTTP.
|
Por ejemplo, nuestro plugin puede agregar un trasporte de email para un proveedor que usa un API HTTP.
|
||||||
|
|
||||||
Implementación
|
Implementación
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Nuestro plugin dede implementgar la interface `Kanboard\Core\Mail\ClientInterface` y extiende desde `Kanboard\Core\Base`.
|
Nuestro plugin dede implementgar la interface `Kanboard\Core\Mail\ClientInterface` y extiende desde `Kanboard\Core\Base`.
|
||||||
El único método que necesita para implementar es `sendEmail()`:
|
El único método que necesita para implementar es `sendEmail()`:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
interface ClientInterface
|
interface ClientInterface
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
Metadatos
|
Metadatos
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Tu piedes adjutnar metadatos para cada projecto,tarea , usuaio o para toda la aplicación
|
Tu piedes adjutnar metadatos para cada projecto,tarea , usuaio o para toda la aplicación
|
||||||
Los metadatos son campos personalisados, es una key/value de una tabla.
|
Los metadatos son campos personalisados, es una key/value de una tabla.
|
||||||
|
|
||||||
Por ejemplo nuestro plugin puede almacenar información externa para una tarea o nuevas configuraciones para un proyecto.
|
Por ejemplo nuestro plugin puede almacenar información externa para una tarea o nuevas configuraciones para un proyecto.
|
||||||
Básicamente le permiten ampliar los campos predeterminados sin tener que crear nuevas tablas .
|
Básicamente le permiten ampliar los campos predeterminados sin tener que crear nuevas tablas .
|
||||||
|
|
||||||
Adjuntar y eliminar metadatos para tareas
|
Adjuntar y eliminar metadatos para tareas
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
Agregar notificaciones con los tipos de plugin
|
Agregar notificaciones con los tipos de plugin
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
Puede enviar notificaciones a casi cualquier sistema mediante la adición de un nuevo tipo .
|
Puede enviar notificaciones a casi cualquier sistema mediante la adición de un nuevo tipo .
|
||||||
There are two kinds of notifications: project and user.
|
There are two kinds of notifications: project and user.
|
||||||
|
|
||||||
- Project: Notificaciones configuradas a nivel de proyecto
|
- Project: Notificaciones configuradas a nivel de proyecto
|
||||||
- Usuario: Notificaciones enviadas individualmente y configurada a cada perfil de usuario.
|
- Usuario: Notificaciones enviadas individualmente y configurada a cada perfil de usuario.
|
||||||
|
|
||||||
Registra un nuevo tipo de notificación
|
Registra un nuevo tipo de notificación
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
En tu archivo de registro del plugin llama el metodo `setType()`:
|
En tu archivo de registro del plugin llama el metodo `setType()`:
|
||||||
@@ -17,19 +17,19 @@ $this->userNotificationTypeModel->setType('irc', t('IRC'), '\Kanboard\Plugin\IRC
|
|||||||
$this->projectNotificationTypeModel->setType('irc', t('IRC'), '\Kanboard\Plugin\IRC\Notification\IrcHandler');
|
$this->projectNotificationTypeModel->setType('irc', t('IRC'), '\Kanboard\Plugin\IRC\Notification\IrcHandler');
|
||||||
```
|
```
|
||||||
|
|
||||||
Su controlador puede ser registrado por el usuario o la notificación del proyecto. No necesariamente tienen que soportarlo .
|
Su controlador puede ser registrado por el usuario o la notificación del proyecto. No necesariamente tienen que soportarlo .
|
||||||
Cuando tu handler es registrdo, el usuario final **end-user** puede elegir recibir el nuevo tipo de notificación o no
|
Cuando tu handler es registrdo, el usuario final **end-user** puede elegir recibir el nuevo tipo de notificación o no
|
||||||
|
|
||||||
Notificación de Handler
|
Notificación de Handler
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Su controlador de notificación debe implementar la interfaz `Kanboard\Core\Notification\NotificationInterface`:
|
Su controlador de notificación debe implementar la interfaz `Kanboard\Core\Notification\NotificationInterface`:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
interface NotificationInterface
|
interface NotificationInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Envia notificación a un usuario
|
* Envia notificación a un usuario
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param array $user
|
* @param array $user
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
Plugin Reescritura
|
Plugin Reescritura
|
||||||
================
|
================
|
||||||
|
|
||||||
Reesritura HTTP Contenido Política de Seguridad
|
Reesritura HTTP Contenido Política de Seguridad
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
Si desea reemplazar el encabezado HTTP predeterminado de la directiva de seguridad del contenido, puede utilizar el método`setContentSecurityPolicy()`:
|
Si desea reemplazar el encabezado HTTP predeterminado de la directiva de seguridad del contenido, puede utilizar el método`setContentSecurityPolicy()`:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
@@ -25,7 +25,7 @@ class Plugin extends Base
|
|||||||
Plantillas de reescrituras
|
Plantillas de reescrituras
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Las plantillas definidas en el núcleo se pueden anular . Por ejemplo , se puede redefinir el diseño predeterminado o cambiar notificaciones por correo electrónico.
|
Las plantillas definidas en el núcleo se pueden anular . Por ejemplo , se puede redefinir el diseño predeterminado o cambiar notificaciones por correo electrónico.
|
||||||
|
|
||||||
Ejemolo de plantilla de reescritura:
|
Ejemolo de plantilla de reescritura:
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
Personalizar Rutas
|
Personalizar Rutas
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Cuando está habilitada la reescritura de URL, tu puedes definir rutas personalizadas desde tus plugins.
|
Cuando está habilitada la reescritura de URL, tu puedes definir rutas personalizadas desde tus plugins.
|
||||||
|
|
||||||
Definir nuevas rutas
|
Definir nuevas rutas
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
Las rutas son manejadas por la clase `Kanboard\Core\Http\Route`.
|
Las rutas son manejadas por la clase `Kanboard\Core\Http\Route`.
|
||||||
|
|
||||||
Las nuevas rutas se pueden agregar mediante el uso del método `addRoute($path, $controller, $action, $plugin)`, here an example:
|
Las nuevas rutas se pueden agregar mediante el uso del método `addRoute($path, $controller, $action, $plugin)`, here an example:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$this->route->addRoute('/my/custom/route', 'myController', 'myAction', 'myplugin');
|
$this->route->addRoute('/my/custom/route', 'myController', 'myAction', 'myplugin');
|
||||||
```
|
```
|
||||||
|
|
||||||
Cuando el usuario final **end-user** van a la URL `/my/custom/route`, el metodo `Kanboard\Plugin\Myplugin\Controller\MyController::myAction()` será ejecutado.
|
Cuando el usuario final **end-user** van a la URL `/my/custom/route`, el metodo `Kanboard\Plugin\Myplugin\Controller\MyController::myAction()` será ejecutado.
|
||||||
|
|
||||||
El primer caracter del contraldor y el nombre del plugin serán convertidos en mayusculas con la funcion `ucfirst()`.
|
El primer caracter del contraldor y el nombre del plugin serán convertidos en mayusculas con la funcion `ucfirst()`.
|
||||||
|
|
||||||
Tu puedes ademas definir rutas con variables:
|
Tu puedes ademas definir rutas con variables:
|
||||||
|
|
||||||
@@ -70,9 +70,9 @@ Salida HTML cuando la reescritura del URL no esta habilitada:
|
|||||||
?controller=mycontroller&action=myaction&plugin=myplugin
|
?controller=mycontroller&action=myaction&plugin=myplugin
|
||||||
```
|
```
|
||||||
|
|
||||||
### Generar enlace de redirección:
|
### Generar enlace de redirección:
|
||||||
|
|
||||||
Desde un controlador, si tu necesitas para From a controller, si tu necesitas realizar una redirección:
|
Desde un controlador, si tu necesitas para From a controller, si tu necesitas realizar una redirección:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$this->url->to('mycontroller', 'myaction', array('plugin' => 'myplugin'));
|
$this->url->to('mycontroller', 'myaction', array('plugin' => 'myplugin'));
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ Desarrollo de Plugin
|
|||||||
|
|
||||||
Nota : el plugin API es **considerado alpha** en estos momentos.
|
Nota : el plugin API es **considerado alpha** en estos momentos.
|
||||||
|
|
||||||
Los plugins son útiles para extender las funcionalidades básicas de Kanboard , la adición de características , la creación de temas o cambiar el comportamiento por defecto .
|
Los plugins son útiles para extender las funcionalidades básicas de Kanboard , la adición de características , la creación de temas o cambiar el comportamiento por defecto .
|
||||||
|
|
||||||
Los creadores de plugins deben especificar explícitamente las versiones compatibles de Kanboard . El código interno de Kanboard puede cambiar con el tiempo y su extensión debe ser probado con nuevas versiones . Compruebe siempre el [ChangeLog](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para realizar los cambios.
|
Los creadores de plugins deben especificar explícitamente las versiones compatibles de Kanboard . El código interno de Kanboard puede cambiar con el tiempo y su extensión debe ser probado con nuevas versiones . Compruebe siempre el [ChangeLog](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para realizar los cambios.
|
||||||
|
|
||||||
- [Crear tu plugin](plugin-registration.markdown)
|
- [Crear tu plugin](plugin-registration.markdown)
|
||||||
- [Usar plugins hooks](plugin-hooks.markdown)
|
- [Usar plugins hooks](plugin-hooks.markdown)
|
||||||
- [Eventos](plugin-events.markdown)
|
- [Eventos](plugin-events.markdown)
|
||||||
- [Rescribir compartamientos por default en la aplicación](plugin-overrides.markdown)
|
- [Rescribir compartamientos por default en la aplicación](plugin-overrides.markdown)
|
||||||
- [Agregar plugins para migrar esquemas](plugin-schema-migrations.markdown)
|
- [Agregar plugins para migrar esquemas](plugin-schema-migrations.markdown)
|
||||||
- [Personalizar rutas](plugin-routes.markdown)
|
- [Personalizar rutas](plugin-routes.markdown)
|
||||||
- [Agregar helpers](plugin-helpers.markdown)
|
- [Agregar helpers](plugin-helpers.markdown)
|
||||||
@@ -18,9 +18,9 @@ Los creadores de plugins deben especificar expl
|
|||||||
- [Agregar tipos de notificaciones](plugin-notifications.markdown)
|
- [Agregar tipos de notificaciones](plugin-notifications.markdown)
|
||||||
- [Agregar acciones automaticas](plugin-automatic-actions.markdown)
|
- [Agregar acciones automaticas](plugin-automatic-actions.markdown)
|
||||||
- [Adjuntar metados para usuarios,tareas y proyectos](plugin-metadata.markdown)
|
- [Adjuntar metados para usuarios,tareas y proyectos](plugin-metadata.markdown)
|
||||||
- [Arquitectura de autenticación](plugin-authentication-architecture.markdown)
|
- [Arquitectura de autenticación](plugin-authentication-architecture.markdown)
|
||||||
- [Registración de plugins de autenticación](plugin-authentication.markdown)
|
- [Registración de plugins de autenticación](plugin-authentication.markdown)
|
||||||
- [Arquitectura de autorización](plugin-authorization-architecture.markdown)
|
- [Arquitectura de autorización](plugin-authorization-architecture.markdown)
|
||||||
- [Personlizar grupos de proveedores](plugin-group-provider.markdown)
|
- [Personlizar grupos de proveedores](plugin-group-provider.markdown)
|
||||||
- [Links externos para proveedores](plugin-external-link.markdown)
|
- [Links externos para proveedores](plugin-external-link.markdown)
|
||||||
- [Agregar avatar a proveedores](plugin-avatar-provider.markdown)
|
- [Agregar avatar a proveedores](plugin-avatar-provider.markdown)
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ Lado del servidor
|
|||||||
| MariaDB >= 10 |
|
| MariaDB >= 10 |
|
||||||
| Postgresql >= 9.3 |
|
| Postgresql >= 9.3 |
|
||||||
|
|
||||||
Qué base de datos para elegir?
|
Qué base de datos para elegir?
|
||||||
|
|
||||||
| Tipo | Uso |
|
| Tipo | Uso |
|
||||||
|-----------------|-----------------------------------------------------|
|
|-----------------|-----------------------------------------------------|
|
||||||
| Sqlite | un solo usuario o equipo pequeño (casi no hay concurrencia) |
|
| Sqlite | un solo usuario o equipo pequeño (casi no hay concurrencia) |
|
||||||
| Mysql/Postgres | Equipo grande, configuración de alta disponibilidad |
|
| Mysql/Postgres | Equipo grande, configuración de alta disponibilidad |
|
||||||
|
|
||||||
No usar Sqlite en montajes de NFS, use Sqlite solo cuando tengas un disco con Fast I/O
|
No usar Sqlite en montajes de NFS, use Sqlite solo cuando tengas un disco con Fast I/O
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ Kanboard esta pre configurado para trabajar con Apache (URL rewriting).
|
|||||||
|
|
||||||
### Versiones de PHP
|
### Versiones de PHP
|
||||||
|
|
||||||
| Versión de PHP |
|
| Versión de PHP |
|
||||||
|----------------|
|
|----------------|
|
||||||
| PHP >= 5.3.9 |
|
| PHP >= 5.3.9 |
|
||||||
| PHP 5.4 |
|
| PHP 5.4 |
|
||||||
@@ -71,7 +71,7 @@ Kanboard esta pre configurado para trabajar con Apache (URL rewriting).
|
|||||||
| hash | |
|
| hash | |
|
||||||
| ctype | |
|
| ctype | |
|
||||||
| session | |
|
| session | |
|
||||||
| ldap | Solamente para autenticación LDAP |
|
| ldap | Solamente para autenticación LDAP |
|
||||||
| Zend OPcache | Recomendado |
|
| Zend OPcache | Recomendado |
|
||||||
|
|
||||||
### Extensiones PHP opcionales
|
### Extensiones PHP opcionales
|
||||||
@@ -83,7 +83,7 @@ Kanboard esta pre configurado para trabajar con Apache (URL rewriting).
|
|||||||
### Recomendaciones
|
### Recomendaciones
|
||||||
|
|
||||||
- Usar sistemas operativos modernos de Linux o Unix.
|
- Usar sistemas operativos modernos de Linux o Unix.
|
||||||
- El mejor performace se obtienen con la última versión de PHP junto con la operación de OPcode esta activado.
|
- El mejor performace se obtienen con la última versión de PHP junto con la operación de OPcode esta activado.
|
||||||
|
|
||||||
|
|
||||||
Lado del cliente
|
Lado del cliente
|
||||||
@@ -91,7 +91,7 @@ Lado del cliente
|
|||||||
|
|
||||||
### Browsers [Navegadores]
|
### Browsers [Navegadores]
|
||||||
|
|
||||||
Siempre usar el navegador mas moderno o la ultima versión posible:
|
Siempre usar el navegador mas moderno o la ultima versión posible:
|
||||||
|
|
||||||
| Browser |
|
| Browser |
|
||||||
|---------------------------------------|
|
|---------------------------------------|
|
||||||
@@ -103,9 +103,9 @@ Siempre usar el navegador mas moderno o la ultima versi
|
|||||||
|
|
||||||
### Dispositivos
|
### Dispositivos
|
||||||
|
|
||||||
| Device | Resolución de la pantalla |
|
| Device | Resolución de la pantalla |
|
||||||
|-------------------|--------------------|
|
|-------------------|--------------------|
|
||||||
| Laptop o desktop | >= 1366 x 768 |
|
| Laptop o desktop | >= 1366 x 768 |
|
||||||
| Tablet | >= 1024 x 768 |
|
| Tablet | >= 1024 x 768 |
|
||||||
|
|
||||||
Kanboard aún no está optimizado para smartphones. Está funcionando, pero la interfaz de usuario no es muy cómoda de usar.
|
Kanboard aún no está optimizado para smartphones. Está funcionando, pero la interfaz de usuario no es muy cómoda de usar.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
Autenticación por proxy inverso
|
Autenticación por proxy inverso
|
||||||
============================
|
============================
|
||||||
|
|
||||||
Este metodo de autenticación a menudo es usado por [SSO](http://en.wikipedia.org/wiki/Single_sign-on) (Single Sign-On) especialmente para organizaciones mayores.
|
Este metodo de autenticación a menudo es usado por [SSO](http://en.wikipedia.org/wiki/Single_sign-on) (Single Sign-On) especialmente para organizaciones mayores.
|
||||||
|
|
||||||
La autenticación se realiza mediante otro sistema, Kanboard no conoce su contraseña y supongamos que ya está autenticado.
|
La autenticación se realiza mediante otro sistema, Kanboard no conoce su contraseña y supongamos que ya está autenticado.
|
||||||
|
|
||||||
Requerimentos
|
Requerimentos
|
||||||
------------
|
------------
|
||||||
@@ -15,49 +15,49 @@ o
|
|||||||
- Apache Auth en el mismo servidor
|
- Apache Auth en el mismo servidor
|
||||||
|
|
||||||
|
|
||||||
¿Como funciona esto?
|
¿Como funciona esto?
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
1. Su proxy inverso autentica al usuario y envia el nombre de usuario a través de una cabecera HTTP.
|
1. Su proxy inverso autentica al usuario y envia el nombre de usuario a través de una cabecera HTTP.
|
||||||
2. Kanboard recuperar el nombre de usuario de la solicitud
|
2. Kanboard recuperar el nombre de usuario de la solicitud
|
||||||
- El usuario se crea automáticamente si es necesario
|
- El usuario se crea automáticamente si es necesario
|
||||||
- Abrir una nueva sesión Kanboard sin ningún símbolo asumiendo que es válida
|
- Abrir una nueva sesión Kanboard sin ningún símbolo asumiendo que es válida
|
||||||
|
|
||||||
Instrucciones de instalación
|
Instrucciones de instalación
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
### Configuración de su proxy inverso
|
### Configuración de su proxy inverso
|
||||||
|
|
||||||
Esto esta fuera del alcance de esta documentación.
|
Esto esta fuera del alcance de esta documentación.
|
||||||
Debería comprobar la conexión del usuario ya que es enviado por el proxy inverso utilizando una cabecera HTTP.
|
Debería comprobar la conexión del usuario ya que es enviado por el proxy inverso utilizando una cabecera HTTP.
|
||||||
|
|
||||||
### Configuración de Kanboard
|
### Configuración de Kanboard
|
||||||
|
|
||||||
Crear un archivo `config.php` copiar el archivo` config.default.php`:
|
Crear un archivo `config.php` copiar el archivo` config.default.php`:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
// Activar / desactivar la autenticación del proxy inverso
|
// Activar / desactivar la autenticación del proxy inverso
|
||||||
define('REVERSE_PROXY_AUTH', true); // Set this value to true
|
define('REVERSE_PROXY_AUTH', true); // Set this value to true
|
||||||
|
|
||||||
// La cabecera HTTP para recuperar. Si no se especifica, el valor por defecto es REMOTE_USER
|
// La cabecera HTTP para recuperar. Si no se especifica, el valor por defecto es REMOTE_USER
|
||||||
define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER');
|
define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER');
|
||||||
|
|
||||||
// El Kanboard predeterminado esta el administrador para su organización.
|
// El Kanboard predeterminado esta el administrador para su organización.
|
||||||
// Ya que todo debe ser filtrada por el proxy inverso,
|
// Ya que todo debe ser filtrada por el proxy inverso,
|
||||||
// Debe tener un usuario administrador para el arranque.
|
// Debe tener un usuario administrador para el arranque.
|
||||||
define('REVERSE_PROXY_DEFAULT_ADMIN', 'myadmin');
|
define('REVERSE_PROXY_DEFAULT_ADMIN', 'myadmin');
|
||||||
|
|
||||||
// El dominio predeterminado para asumir la dirección de correo electrónico.
|
// El dominio predeterminado para asumir la dirección de correo electrónico.
|
||||||
// En caso de que el nombre de usuario no es una dirección de correo electrónico,
|
// En caso de que el nombre de usuario no es una dirección de correo electrónico,
|
||||||
// Se actualizará automáticamente como USER@mydomain.com
|
// Se actualizará automáticamente como USER@mydomain.com
|
||||||
define('REVERSE_PROXY_DEFAULT_DOMAIN', 'mydomain.com');
|
define('REVERSE_PROXY_DEFAULT_DOMAIN', 'mydomain.com');
|
||||||
```
|
```
|
||||||
|
|
||||||
Notas:
|
Notas:
|
||||||
|
|
||||||
- Si el proxy esta en el mismo servidor Web que ejecuta Kanboard, según la [CGI protocol](http://www.ietf.org/rfc/rfc3875) el Header será `REMOTE_USER`. Por ejemplo, Apache añadir `REMOTE_USER` por defecto si` Require valid-usuario de la red se establece.
|
- Si el proxy esta en el mismo servidor Web que ejecuta Kanboard, según la [CGI protocol](http://www.ietf.org/rfc/rfc3875) el Header será `REMOTE_USER`. Por ejemplo, Apache añadir `REMOTE_USER` por defecto si` Require valid-usuario de la red se establece.
|
||||||
|
|
||||||
- Si Apache es un proxy inverso a otro Apache corriendo Kanboard, la cabecera `REMOTE_USER` no se establece (mismo comportamiento con IIS y Nginx)
|
- Si Apache es un proxy inverso a otro Apache corriendo Kanboard, la cabecera `REMOTE_USER` no se establece (mismo comportamiento con IIS y Nginx)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Swimlanes
|
|||||||
=========
|
=========
|
||||||
|
|
||||||
Swimlanes son separaciones horizontales en tu tablero.
|
Swimlanes son separaciones horizontales en tu tablero.
|
||||||
Por ejemplo, es útil para separar las versiones de software, dividir las tareas en diferentes productos, equipos o lo que quieras.
|
Por ejemplo, es útil para separar las versiones de software, dividir las tareas en diferentes productos, equipos o lo que quieras.
|
||||||
|
|
||||||
Tablero con swimlanes
|
Tablero con swimlanes
|
||||||
----------------------
|
----------------------
|
||||||
@@ -12,23 +12,23 @@ Tablero con swimlanes
|
|||||||
- Tu puedes colapsar los swimlanes haciendo click en el icono de la izquierda
|
- Tu puedes colapsar los swimlanes haciendo click en el icono de la izquierda
|
||||||
- El swimlane por defecto se muestra siempre en la parte superior
|
- El swimlane por defecto se muestra siempre en la parte superior
|
||||||
|
|
||||||
La gestión de swimlanes
|
La gestión de swimlanes
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
- Todos los proyectos tienen un swimlane predeterminado.
|
- Todos los proyectos tienen un swimlane predeterminado.
|
||||||
- Si hay más de un swimlane, el tablero mostrará todos swimlanes.
|
- Si hay más de un swimlane, el tablero mostrará todos swimlanes.
|
||||||
- Usted puede arrastrar y soltar las tareas entre swimlanes.
|
- Usted puede arrastrar y soltar las tareas entre swimlanes.
|
||||||
|
|
||||||
Para configurar swimlanes ir a la página de **configuración del proyecto ** y elija la sección **Swimlanes**.
|
Para configurar swimlanes ir a la página de **configuración del proyecto ** y elija la sección **Swimlanes**.
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
A partir de ahí, se puede añadir un nuevo swimlane o cambiar el nombre por defecto.
|
A partir de ahí, se puede añadir un nuevo swimlane o cambiar el nombre por defecto.
|
||||||
También puede desactivar y cambiar la posición de los diferentes swimlanes.
|
También puede desactivar y cambiar la posición de los diferentes swimlanes.
|
||||||
|
|
||||||
- El swimlane por defecto es siempre en la parte superior, pero se puede ocultarlo.
|
- El swimlane por defecto es siempre en la parte superior, pero se puede ocultarlo.
|
||||||
- Swimlanes inactivas no se muestran en el tablero.
|
- Swimlanes inactivas no se muestran en el tablero.
|
||||||
- **Extracción de una swimlane no elimina tareas **, esas tareas se moverán a la swimlane predeterminada.
|
- **Extracción de una swimlane no elimina tareas **, esas tareas se moverán a la swimlane predeterminada.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,16 +10,16 @@ Desde el formulario de tarea, tu puedes caputarar las tags deseadas:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
La auto-completacion se forma para mostrar ó sugerir etiquetas disponibles.
|
La auto-completacion se forma para mostrar ó sugerir etiquetas disponibles.
|
||||||
|
|
||||||
También puede crear etiquetas directamente desde el formulario de tareas .
|
También puede crear etiquetas directamente desde el formulario de tareas .
|
||||||
Por defecto , al crear etiquetas de un formulario de tarea que están asociados al proyecto actual :
|
Por defecto , al crear etiquetas de un formulario de tarea que están asociados al proyecto actual :
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Todas las tags pueden ser manejadas en configuración del proyecto.
|
Todas las tags pueden ser manejadas en configuración del proyecto.
|
||||||
|
|
||||||
Para definir tags globalmente para todos los proyectos, ve a la configuración de la aplicación :
|
Para definir tags globalmente para todos los proyectos, ve a la configuración de la aplicación :
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
Actualizar Kanboard a una nueva versión
|
Actualizar Kanboard a una nueva versión
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
La actualización de Kanboard a una nueva versión es perfecta.
|
La actualización de Kanboard a una nueva versión es perfecta.
|
||||||
El proceso se puede resumir simplemente copiar la carpeta de datos a la nueva carpeta Kanboard .
|
El proceso se puede resumir simplemente copiar la carpeta de datos a la nueva carpeta Kanboard .
|
||||||
Kanboard ejecutará migraciones de bases de datos de forma automática.
|
Kanboard ejecutará migraciones de bases de datos de forma automática.
|
||||||
|
|
||||||
Cosas importantes que hacer antes de actualizar
|
Cosas importantes que hacer antes de actualizar
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
@@ -13,14 +13,14 @@ Cosas importantes que hacer antes de actualizar
|
|||||||
- Siempre leer el [change log](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para verificar si hay cambios destacados
|
- Siempre leer el [change log](https://github.com/kanboard/kanboard/blob/master/ChangeLog) para verificar si hay cambios destacados
|
||||||
- Siempre cerrar las sesiones de todos los usuarios (eliminar todas las sesiones en el servidor)
|
- Siempre cerrar las sesiones de todos los usuarios (eliminar todas las sesiones en el servidor)
|
||||||
|
|
||||||
Desde el archivo (Versión estable )
|
Desde el archivo (Versión estable )
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
1. Descomprimir el nuevo archivo
|
1. Descomprimir el nuevo archivo
|
||||||
2. Copiar el contenido de la carpeta de datos en el directorio recién descomprimido
|
2. Copiar el contenido de la carpeta de datos en el directorio recién descomprimido
|
||||||
3. Copiar tu `config.php` personalizado si tienes uno
|
3. Copiar tu `config.php` personalizado si tienes uno
|
||||||
4. Copiar tus plugins sin son necesarios
|
4. Copiar tus plugins sin son necesarios
|
||||||
5. Asegúrese de que el directorio `data` es escribible por el usuario del servidor web
|
5. Asegúrese de que el directorio `data` es escribible por el usuario del servidor web
|
||||||
6. Testearlo
|
6. Testearlo
|
||||||
7. Eliminar tu viejo directorio del Kanboard
|
7. Eliminar tu viejo directorio del Kanboard
|
||||||
|
|
||||||
@@ -29,6 +29,6 @@ Desde el repositorio (development version)
|
|||||||
|
|
||||||
1. `git pull`
|
1. `git pull`
|
||||||
2. `composer install --no-dev`
|
2. `composer install --no-dev`
|
||||||
3. Inicia la sesión y comprobar si todo está bien
|
3. Inicia la sesión y comprobar si todo está bien
|
||||||
|
|
||||||
Nota: Este método se instalará la **versión de desarrollo actual**, utilice a su propio riesgo.
|
Nota: Este método se instalará la **versión de desarrollo actual**, utilice a su propio riesgo.
|
||||||
|
|||||||
Reference in New Issue
Block a user