IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres composants PHP Discussion :

PHPExcel et Autoloader


Sujet :

Autres composants PHP

  1. #1
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut PHPExcel et Autoloader
    Bonjour,

    Mon post est quelque peu ciblé : j'essaie d'attirer Maitre Pylos...

    Je suis un nouvel utilisateur de l'excellente librairie PHPExcel et je voudrais l'intégrer à la librairie générale de mon serveur afin de la rendre disponible pour tous les projets.
    Ces projets utilisent par ailleurs le non moins excellent Zend Framework en architecture MVC et utilisant l'autoloader.
    Le problème vient de la convention de nommage de PHPExcel qui ne colle pas trop avec celle de l'autoloader classique.

    Quelqu'un a-t-il trouvé une solution pour coupler PHPExcel et Autoloader ?

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Le problème vient de la convention de nommage de PHPExcel qui ne colle pas trop avec celle de l'autoloader classique.
    elle a quoi de particulier ?

    je n'ai jamais utilisé PHPExcel mais d'après ce que je viens de voir rapidement, les classes qui sont dans le répertoire PHPExcel respectent la convention Zend donc il suffit de mettre le répertoire parent dans l'"include_path" et ensuite tu rajoutes le prefixe "PHPExcel_" à l'autoloader

    et si c'est plus compliqué tu peux créer une classe qui hérite Zend_Loader
    http://framework.zend.com/manual/fr/....load.autoload

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par nosferapti Voir le message
    elle a quoi de particulier ?

    je n'ai jamais utilisé PHPExcel mais d'après ce que je viens de voir rapidement, les classes qui sont dans le répertoire PHPExcel respectent la convention Zend donc il suffit de mettre le répertoire parent dans l'"include_path" et ensuite tu rajoutes le prefixe "PHPExcel_" à l'autoloader

    et si c'est plus compliqué tu peux créer une classe qui hérite Zend_Loader
    http://framework.zend.com/manual/fr/....load.autoload
    Oui il me semble que c'est plus compliqué.

    Je vais essayer de prendre un exemple :

    - dossiers constituants ma library : Zend, Tcpdf, PhpXl (nom donné au pif pour ne pas faire doublon)

    - dans le dossier PHPExcel, j'ai le fichier de la classe de base PHPExcel.php qui contient la classe PHPExcel alors que celle-ci aurait dû être nommé PhpXl_PHPExcel.

    - Ainsi de suite : dans le sous-dossier PHPExcel, j'ai un fichier Cell.php décrivant PHPExcel_Cell alors que j'aurais souhaité PhpXl_PHPExcel_Cell

    Voilà mon problème...
    Il doit y avoir un moyen de bidouiller l'autoloader pour cet espace de nom, mais pour l'instant, je suis dans les choux.

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    A priori, j'ai peut-être réussi en utilisant l'autoload de ressources :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            $r = new Zend_Loader_Autoloader_Resource(array(
                'basePath'  => 'phpXl',
                'namespace' => '',
            ));
            $r ->addResourceType('phpExcel', 'PHPExcel/', 'PHPExcel');
    'phpXl' est le dossier contenant toute l'architecture de PHPExcel

    Ce dossier est un élément de mon répertoire 'library' qui lui-même est dans l'include_path.

    Pour l'instant, RESOLU !

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Et non, pas résolu !

    Je peux instancier toutes les classes, sauf celle de base.
    Je m'en doutais un peu : comment la trouver alors qu'elle n'a pas le bon préfixe ?

  6. #6
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Et non, pas résolu !

    Je peux instancier toutes les classes, sauf celle de base.
    Je m'en doutais un peu : comment la trouver alors qu'elle n'a pas le bon préfixe ?
    à la barbare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once APPLICATION_PATH . '/../library/phpXl/PHPExcel.php';

  7. #7
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par nosferapti Voir le message
    à la barbare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once APPLICATION_PATH . '/../library/phpXl/PHPExcel.php';
    Oui, c'est possible bien sûr. La library étant dans l'include_path, je pourrais même faire plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once 'phpXl/PHPExcel.php';
    Mais cela n'utilise pas le chargeur et je voudrais éviter d'avoir recours aux require sur les fichiers de la librairie.

    J'ai pour l'instant contourné le problème : le chargement automatique fonctionne pour les sous-dossiers grâce à mon loader de ressource et pour accéder à la classe principale, je me suis codé une classe statique dans ma librairie perso qui renvoie une instance de PHPExcel en ayant recours au require_once.
    C'est quasiment pareil, mais l'utilisateur n'a ainsi pas besoin de connaître l'architecture de la librairie.

    C'est pas résolu, mais ça marche.

    Je laisse le sujet ouvert au cas où un spécialiste de l'autoloader pouvait nous éclairer.

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    En fait la librairie ne respecte pas toujours la convention PEAR (ZF est basé sur cette convention), et même si elle la respecterais cela poserais un souci parce que dans ses sources elle intègre la librairie de Spreadsheet_Excel_Writer , cette librairie permet de générer les fichiers Excel5, qui malgré que ce soit un projet PEAR, il y a des défauts dans les conventions.

    Pour ma part j'ai intégré PHPExcel de deux façon différentes :

    Dans l'include path
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath(dirname(__FILE__) . '/../library'),
        realpath(dirname(__FILE__) . '../library/Excel' 
        get_include_path(),
    )));

    L'autre façons est de créer une classe aux conventions Zend qui reprend un include de la classe PHPExcel et hop j'ai accès à l'ensemble.

    Dans mon tuto, je crée cette classe qui dans ton cas ressemblerais à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
     
    /**
     * Classe étendue de PHPExcel.
     * Cette classe permet la génération dynamique
     * de fichier tableur suivant différent format.
     *
     * @copyright  2008 MaitrePylos Technologies (Formatux.be)
     * @author     Ernaelsten Gerard
     * @license    GPL
     * @version    Release: 0.1
     */
     
    require 'PHPExcel.php';
    class phpXl_MaitrePylosExcel extends PHPExcel {
     
     
        public function  __construct() {
            parent::__construct();
        }
     
        /**
         * Méthode englobant une fonction switch pour le choix du format de tableur.
         * @method affiche
         * @param String $format
         * @param String $nomFichier
         * @example $workbook->affiche('Excel2007','MonFichier');
         */
        public function affiche($format = 'Excel5',$nomFichier = 'Tableur'){
     
            switch($format){
                case 'Excel2007' :
                    include 'PHPExcel/Writer/Excel2007.php';
                    $writer = new PHPExcel_Writer_Excel2007($this);
                    $ext  = 'xlsx';
                    $header = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                    //supprime le pré-calcul
                    $writer->setPreCalculateFormulas(false);
                    break;
                case 'Excel2003' :
                    include 'PHPExcel/Writer/Excel2007.php';
                    $writer = new PHPExcel_Writer_Excel2007($this);
                    $writer->setOffice2003Compatibility(true);
                    $ext  = 'xlsx';
                    $header = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                    //supprime le pré-calcul
                    $writer->setPreCalculateFormulas(false);
                    break;
                case 'Excel5' :
                    include 'PHPExcel/Writer/Excel5.php';
                    $writer = new PHPExcel_Writer_Excel5($this);
                    $ext = 'xls';
                    $header = 'application/vnd.ms-excel';
                    break;
                case 'CSV' :
                    include 'PHPExcel/Writer/CSV.php';
                    $writer  = new PHPExcel_Writer_CSV($this);
                    $writer->setDelimiter(",");//l'opérateur de séparation est la virgule
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'csv';
                    $header = 'text/csv';
                    break;
                case 'PDF' :
                    include 'PHPExcel/Writer/PDF.php';
                    $writer  = new PHPExcel_Writer_PDF($this);
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'pdf';
                    $header = 'application/pdf';
                    break;
                case 'HTML' :
                    include 'PHPExcel/Writer/HTML.php';
                    $writer  = new PHPExcel_Writer_HTML($this);
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'html';
                    $header = 'text/html';
                    break;
     
            }
     
            header('Content-type:'.$header);
            header('Content-Disposition:inline;filename='.$nomFichier.'.'.$ext);
            $writer->save('php://output');
        }
     
            /**
         * Méthode englobant une fonction switch pour le choix du format de tableur.
         * @method enregistre
         * @param String $format
         * @param String $nomFichier
         * @example $workbook->enregistre('Excel2007','MonFichier');
         */
        public function enregistre($format = 'Excel5',$nomFichier = 'Tableur'){
     
            switch($format){
                case 'Excel2007' :
                    include 'PHPExcel/Writer/Excel2007.php';
                    $writer = new PHPExcel_Writer_Excel2007($this);
                    $ext  = 'xlsx';
                    //supprime le pré-calcul
                    $writer->setPreCalculateFormulas(false);
                    break;
                case 'Excel2003' :
                    include 'PHPExcel/Writer/Excel2007.php';
                    $writer = new PHPExcel_Writer_Excel2007($this);
                    $writer->setOffice2003Compatibility(true);
                    $ext  = 'xlsx';
                    //supprime le pré-calcul
                    $writer->setPreCalculateFormulas(false);
                    break;
                case 'Excel5' :
                    include 'PHPExcel/Writer/Excel5.php';
                    $writer = new PHPExcel_Writer_Excel5($this);
                    $ext = 'xls';
                    break;
                case 'CSV' :
                    include 'PHPExcel/Writer/CSV.php';
                    $writer  = new PHPExcel_Writer_CSV($this);
                    $writer->setDelimiter(",");//l'opérateur de séparation est la virgule
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'csv';
                    break;
                case 'PDF' :
                    include 'PHPExcel/Writer/PDF.php';
                    $writer  = new PHPExcel_Writer_PDF($this);
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'pdf';
                    break;
                case 'HTML' :
                    include 'PHPExcel/Writer/HTML.php';
                    $writer  = new PHPExcel_Writer_HTML($this);
                    $writer->setSheetIndex(0);//Une seule feuille possible
                    $ext = 'html';
                    break;
     
            }
     
            $writer->save($nomFichier.'.'.$ext);
     
        }
    }

    Ensuite, j'ai pris l'habitude de créer mes fichier Excel dans /My

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class My_Excel_Trimestre {
     
     
        public static function Excel(){
            set_time_limit(0);
            //création d'un nouveau fichier Excel
            $workbook = new phpXL_MaitrePylosExcel();
            //on crée la feuille par défaut
            $sheet = $workbook->getActiveSheet();
            $sheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);

    ensuite dans un controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class ExcelController extends Zend_Controller_Action {
     
     
        public function trimestreAction(){
            //je supprime la vue.
            $this->_helper->resetHelpers();
     
            try {
                My_Excel_Trimestre::Excel();
            } catch (Zend_Exception $e) {
                echo "Récupère exception: " . get_class($e) . "\n";
                echo "Message: " . $e->getMessage() . "\n";
                // puis tout le code nécessaire pour récupérer la défaillance
            }
        }
    }

Discussions similaires

  1. Optimiser un code procédural avec autoload
    Par max-mag dans le forum Langage
    Réponses: 8
    Dernier message: 25/09/2008, 15h01
  2. autoload et sessions
    Par nguema dans le forum Langage
    Réponses: 2
    Dernier message: 06/06/2008, 16h16
  3. [Excel] Formattage des nombres avec PHPExcel !
    Par gentyjp dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/10/2007, 02h00
  4. [POO] Probleme avec static et autoload
    Par laetyboop dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h46
  5. exemple de script avec autoloader
    Par djibril dans le forum Modules
    Réponses: 4
    Dernier message: 24/11/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo