HTML5 / CSS 2.x/3 / PHP / MySQL ...

Générer un document WORD

Construction du lien pour générer le document WORD

Pour générer notre document, nous avons besoin d'un contrôleur et d'une action. Dans une application MVC ZF, les liens URL sont de la forme:

http://www.monsite.com/controleur/action/

Les liens en local, dans l'application elle-même, sont de la forme:

<a href="/courrier/relance-client/">relance client pour impayé facture</a>

Bien sûr, ce lien est à insérer dans la partie de votre application, par exemple en bas de la fiche client. Le lien devra intégrer les paramètres d'accès à la fiche du client. Exemple de lien complet depuis une fiche client:

<?php
    $idClient = $client['id_client'];
?>
<a href="/courrier/relance-client/id_client/<?php echo $idClient ?>/">relance client pour impayé facture</a>

Ce qui donnerait pour une fiche client 54321 ce lien final:

<a href="/courrier/relance-client/id_client/54321/">relance client pour impayé facture</a>

Le contrôleur courrier

Dans le répertoire controllers de notre application, nous créons un nouveau fichier nommé courrierController.php et avec ce contenu:

class CourrierController extends Zend_Controller_Action
{
    public function init() {
    }
 
    /**
     * Point d'entrée par défaut de la partie "courrier"
     */
    public function indexAction() {
    }
 
}

Nous avons également besoin d'y intégrer l'action relance-client, action écrite sous cette forme:

/**
 * Action relance-client
 */
public function relanceClientAction() {
    // @TODO: contenu à compléter
}

Nous verrons plus loin comment compléter le code de cette action.

L'action relance-client

Pour que notre action relance-client soit opérationnelle, il faut également créer dans le répertoire views/scripts/ le répertoire courrier.

dans ce répertoire courrier, on va créer le fichier relance-client.phtml avec ce contenu provisoire:

<p>test relance client</p>

Si vous avez bien suivi ces instructions, l'exécution de /courrier/relance-client/ doit afficher:

test relance client

Voyons maintenant comment injecter ce code vers Microsoft WORD.

Inhiber le layout standard

Avant d'injecter notre texte vers Microsoft WORD, il faut au préalable inhiber le layout standard de notre application. Le layout, c'est l'emballage de l'application. Si vous ne l'inhibez pas, vous allez injecter à WORD non seulement le texte, mais aussi toute la décoration autour de ce texte.

Pour inhiber le layout, nous allons définir notre propre layout en créant dans le répertoire layouts/scripts/ le fichier layout-courrier.phtml et dont le contenu sera pour le moment celui-ci:

<?php echo $this->layout()->content; ?>

Revenons au contrôleur courrier. Pour exploiter layout-courrier.phtml on va modifier l'action relance-client comme suit:

/**
 * Action relance-client
 */
public function relanceClientAction() {
    // utilisation de notre layout courrier
    $this->_helper->_layout->setLayout('layout-courrier');
}

Si ZF Debugger est activé, vous devrez aussi l'inhiber comme ceci:

/**
 * Action relance-client
 */
public function relanceClientAction() {
    // inhibe affichage de ZFDebug
    Zend_Controller_Front::getInstance()->unregisterPlugin('ZFDebug_Controller_Plugin_Debug');
 
    // utilisation de notre layout courrier
    $this->_helper->_layout->setLayout('layout-courrier');
}

A ce niveau, si vous testez le lien courrier/relance-client/ vous devez voir s'afficher notre texte de test sans la décoration générale de l'application.

Injection vers WORD

C'est loin d'être la partie la plus compliquée de l'application.

Pour réaliser cette injection de texte vers WORD, il faut maîtriser la fonction header() de PHP.

Cette fonction permet d'envoyer au navigateur client des données en tête de page et non contenues dans cette page. Quand un serveur web envoie une page HTML, il envoie automatiquement ce genre d'en-tête:

Content-type: text/html

Nous allons modifier cet en-tête standard pour que le navigateur redirige le flux ailleurs que dans le navigateur Internet:

/**
 * Action relance-client
 */
public function relanceClientAction() {
    // ...début du code...
 
    // détermination du nom de fichier en sortie
    $fileName = 'relance_client_' . date('Ymd_Hi') . '.doc';
    // injection vers WORD
    header('Content-Type: application/msword; name="'.$fileName.'"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Disposition: attachment; filename="'.$fileName.'"');
}

Et voilà! Si vous testez le lien courrier/relance-client/ vous aurez une fenêtre qui s'ouvre vous demandant d'ouvrir le flux avec WORD ou d'enregistrer le fichier sur disque.

lancement dans WORD de notre embryon de document

Si vous l'ouvrez avec WORD, vous devez retrouver notre ligne de texte test relance client

visualisation dans WORD de notre embryon de document

Nous avons réussi l'injection d'un texte simple dans Microsoft WORD. Pour le mettre en forme, voir le sujet suivant:

layouts et templates pour générer le document WORD

Tous les articles sur ce thème