---
# System prepended metadata

title: Flow - Créer un installeur - documentation
tags: [Flow, Installeur, Documentation, Générique]

---

# Flow - Créer un installeur - documentation
###### tags: `Documentation` `Flow` `Générique` `Installeur`
## Présentation
Dans Flow les installeurs permetttent de mettre à jour la base de données par le biais d'exécution successives de requêtes SQL. Installeurs et module sont en fait liés, les  installeurs sont fait pour un module donné.

---

## I - Utilisation
Les installeurs s'utilise par le biais du module "Module" de Flow.

### A - Installer
Pour installer un nouveau module c'est simple, on utilise la méthode `install()` du controller `Module.php`. Ceci se fait par l'URL :

```
http://theme.localhost/module/install/nom_module
```
Le module de nom donné sera installé, ses installeurs seront exécutés dans l'ordre en partant du 001 jusqu'au dernier 00X (visible en nom de fichier).
Un message de succès appaarait alors.

### B - Mettre à jour
Pour mettre à jour un site de manière générale on utilise l'URL :

```
http://theme.localhost/module/update
```
***Il est conseillé de lancer cette commande à minima en début de chacune de vos demi-journée de travail :***

**Explications :** 
Ici tous les modules présent dans la table `module` en BDD sont mis à jour les un à la suite des autres. Les installeurs de chaque module sont exécutés depuis la dernière version connue (notée sur la table module).
Si on était à la v30 en BDD et que les installeurs vont jusqu'à 35, les installeur 31 à 35 seront exécutés.

### C - Désinstaller (non utilisé)

Pour désinstaller un module donné c'est cette URL :

```
http://theme.localhost/module/uninstall/nom_module
```
---

## II - Création

Lorsque l'on crée un installeur on prend en compte :
* Le module sur lequel il est effectif
* La dernière version du module

On distingue deux installeurs différents : ceux pour un module donné, par exemple les composants,  qui donc ne portera que sur les composants. Et ceux pour un thème donné, qui ne toucherons essentiellement qu'à du contenu et seront placé dans *`theme/nomTheme/modules/nomTheme/install`*.
Le nom de l'installeur commence toujours par un nombre et décrit sur quoi porte  la modification.
![](https://i.imgur.com/uGJcgYH.png)  ![](https://i.imgur.com/AFxarL1.png)

A noter : pour l'installeur concernant un thème c'est une bonne pratique d'ajouter le nom du thème juste après le numéro de l'installeur.

La nom de la classe dans le fichier commence par *`Migration_`* suivi du numéro d'insatlleur et de son nom comme dans le nom du fichier.

![](https://i.imgur.com/mSwLu1O.png)

Comme dans la capture d'écran ci-dessus nous navons pas de constructeur, chaque méthode doit être documentée (PSR), elle est publique et son nom est écrit en camelCase.
La fonction up appelle chaque méthode, qui elles, sont dédiées à une seule table de la BDD.
On remplace les tabulations par des espaces et les requêtes sont des REPLACE INTO pour éviter tout conflit. Bien respecter les contraintes d'intégrité référentielles.

Une méthode down() existe aussi mais est généralement vide :
![](https://i.imgur.com/WV9bRko.png)

Pour des tables qui contiennent une langue on fait ceci :
![](https://i.imgur.com/7yptjaU.png)

---

## III - Spécifications et limites
* Modifier les tab entre les valeurs en espace.
* Remplacer les `'fr_FR'` et `'en_GB'` en `'$lng'` et utiliser le foreach comme la fonction replaceTableWithLng()
* Si besoin de séparer les langues vous pouvez faire 
```
if (strpos($lng, 'fr') === 0) {
...
} else {
...
}
```
* Supprimer les `\\n`.
* Modifier les `href=\\\"lien\\\"` en `href=\'lien\'`.

---

## IV - Annexes
### Modèle d'un installeur
```
<?php
class Migration_001_nom
{

    public function up()
    {
        $this->replaceTable();
        $this->replaceTableWithLng();
    }

    public function replaceTable()
    {
        $this->db->query("
            REPLACE INTO `table` (`column1`, `column2`, `column3`, `column4`, `column5`, `column6`, `column7`, `column8`, `column9`, `column10`, `column11`, `column12`, `column13`, `column14`, `column15`) VALUES
            ('valeur1', valeur2, 'valeur3', '', NULL, NULL, NULL, valeur8, valeur9, valeur10, valeur11, valeur12, valeur13, '2020-06-18 07:58:24', '2020-06-19 15:53:24'),
            ('valeur1', valeur2, 'valeur3', '', NULL, NULL, NULL, valeur8, valeur9, valeur10, valeur11, valeur12, valeur13, '2020-06-18 07:58:24', '2020-06-19 15:53:24');
    }

    public function replaceTableWithLng()
    {
         foreach ($this->languages as $lng => $name) {
            REPLACE INTO `table` (`column1`, `column2`, `lng`, `column4`, `column5`, `column6`, `column7`, `column8`, `column9`, `column10`, `column11`, `column12`, `column13`, `column14`, `column15`) VALUES
            ('valeur1', valeur2, '$lng', '', NULL, NULL, NULL, valeur8, valeur9, valeur10, valeur11, valeur12, valeur13, '2020-06-18 07:58:24', '2020-06-19 15:53:24'),
            ('valeur1', valeur2, '$lng', '', NULL, NULL, NULL, valeur8, valeur9, valeur10, valeur11, valeur12, valeur13, '2020-06-18 07:58:24', '2020-06-19 15:53:24');
        }
    }

    /**
     * Uninstall
     */
    public function down()
    {
        // Not possible
    }
}
```
* Le fichier doit porter le nom de la classe sans "Migration_" (Migration_001_nom -> 001_nom)
* Le numéro suit celui du dernier installeur (001, 002, 003, ...)
* replaceTable -> pour les tables qui n'ont pas de traduction
* replaceTableWithLng -> pour les tables qui ont une traduction par langue
