# Configuración

La configuración se realiza creando ficheros de código PHP en el directorio
`cfg/` con código similar a:

```
$cfg['opcion1'] = 'valor1';
$cfg['opcion2'] = 'valor2';
$cfg['opcion3'] = 'valor3';
// ...
$cfg['opcionN'] = 'valorN';
```

Siendo `opcion1`, `opcion2`, ... claves de configuración y
`valor1`, `valor2`, ... sus valores. El nombre del array `cfg` es necesario.

Mediante este sistema se puede cambiar la configuración predeterminada
(como se verá más adelante) o crear configuración propia según las necesidades
de nuestro proyecto.

Por ejemplo: definiremos, para una supuesta aplicación, la clave de
configuración `defaultEmailAddr`:

```
$cfg['defaultEmailAddr'] = 'webmaster@mydomain.com';
```

En cualquier punto de nuestra aplicación podemos recuperar esta clave usando la
función `\zfx\Config::get()`. Ejemplo:

```
function contactFormSent($text)
{
    //...
    $to = \zfx\Config::get('defaultEmailAddr');
    writeMail($to, $text);
    // ...
}
```

Al ser los ficheros de configuración ficheros de código PHP se puede elaborar
esquemas de configuración sofisticados. Por ejemplo:

```
$cfg['max_usuarios'] = 100;
$cfg['max_grupos'] = $cfg['max_usuarios'] / 2;
if ($cfg['max_grupos'] > 25) $cfg['max_grupos'] = 25;
```

# Configuración predeterminada


Cada **módulo** de ZWF puede tener un fichero de configuración. Es lo que se
llama **la configuración predeterminada del módulo**. Estos ficheros no están
en `cfg/`, sino en el directorio de cada módulo.

El fichero de configuración del módulo **core** es
`base/zfx/core/core-config.php`.

El fichero de configuración de **cualquier otro módulo siempre se llama**
`module-config.php` y *está en su directorio correspondiente*. Todos los
ficheros de configuración predeterminados de los módulos considerados activos
son cargados al inicio.

## Cambiar la configuración. Orden de carga

Para configurar la aplicación, sobreescribiendo los valores predeterminados, es
necesario colocar en el directorio `cfg/` ficheros de configuración con los
nuevos valores. Sin embargo, es necesario conocer el orden de carga y los
nombres de fichero a utilizar para tener un control preciso del sistema.

En cualquier petición, la configuración es cargada en este orden:

1. Se lee la configuración predeterminada del módulo core, o sea, `base/zfx/core/core-config.php`.

2. Se lee la configuración personalizada por el usuario para el módulo core, si es que existe, o sea: `cfg/core-config.php`

   En dicho fichero tenemos la oportunidad de activar/desactivar módulos y
   también de especificar *una lista personalizada de ficheros de
   configuración.*

3. Se lee secuencialmente la configuración de los módulos activos. Por defecto todos los módulos (dev, data-access) están activos, así que se leerían los siguientes ficheros:

   ```
   base/zfx/dev/module-config.php
   base/zfx/data-access/module-config.php
   ```

4. Si se especificó la lista personalizada de ficheros de configuración en el
   paso 2, entonces se cargarán secuencialmente. Podemos aprovechar en este
   punto para sobreescribir la configuración predeterminada de los módulos que
   se cargó en el paso 3.

## Esquema de configuración habitual

El esquema más sencillo pero completamente funcional es establecer dos ficheros
de configuración: `cfg/core-config.php`, ya que siempre se intenta cargar este
fichero, y otro (que llamaremos `cfg/my-config.php`)
para configurar el resto de módulos (por ejemplo el acceso a la base de datos) y
cualquier necesidad de nuestra aplicación.

El fichero `cfg/core-config.php` debería tener al menos el siguiente contenido:

```
$cfg['rootUrl']        = 'http://www.miaplicacion.com/';
$cfg['showErrors']     = false;
$cfg['autoLoadConfig'] = array('my-config');
```

### La clave `rootUrl`

ZWF necesita saber su propia URL. Se especifica en la clave `rootUrl`.

Por ejemplo, supongamos que hemos instalado ZWF en el directorio
`/var/www/test` de nuestro servidor y es accesible en la URL
`http://www.example.com/test`.

Entonces en el fichero `cfg/core-config.php` introduciremos lo siguiente:

```
$cfg['rootUrl'] = 'http://www.example.com/test/';
```

Nótese la barra al final de la URL. **Por convenio, todas las URLs que se
configuren en ZWF terminan con la barra `/`.**

También se puede especificar una ruta relativa; los navegadores web la suelen
interpretar correctamente:

```
$cfg['rootUrl'] = '/test/';
```

Supongamos que tenemos una intranet y queremos acceder por una determinada IP y
puerto:

```
$cfg['rootUrl'] = 'http://192.168.1.23:8080/testapp/';
```

Nótese la barra siempre al final de la URL.

### La clave `showErrors`

Indica si se deben mostrar, o no, los errores de PHP. A menudo se combina con la
detección automática del directorio o dirección del servidor para saber si
estamos en producción o no. Ejemplo:

```
if ($_SERVER['DOCUMENT_ROOT'] == '/var/www/html')
{
    // Estamos en producción
    $cfg['rootUrl']    = 'http://www.miaplicacion.com/';
    $cfg['showErrors'] = false;
}
else if ($_SERVER['DOCUMENT_ROOT'] == '/var/www/test')
{
    // Estamos en desarrollo
    $cfg['rootUrl']    = 'http://dev.miempresa.com/';
    $cfg['showErrors'] = true;
}
```

### La clave `autoLoadConfig`

Esta clave permite la carga de ficheros adicionales de configuración. En nuestro
ejemplo contiene un único elemento cuyo valor es `my-config`.