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

Langage PHP Discussion :

afficher le "name" et pas la clé ; quelle conception ?


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut afficher le "name" et pas la clé ; quelle conception ?
    Bonsoir,

    je cherche une bonne conception pour répondre au besoin, sans générer une usine à gaz (car ça, c'est là où j'arriverai sans vos conseils ).
    Le but est d'afficher les données relatives à une liste de tickets. Ces données sont stockées dans une bdd MySQL. Donc afficher le contenu de la table qui contient les données, c'est simple :
    Code php : 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
     
     
    <?php
    echo "<table><tr>";
    foreach(($this['columnName']) as $colName) // $this['columnName']=list of the column's names
        {
            echo "<th>".$colName['COLUMN_NAME']."</th>";
        }
    echo "</tr>";
     
    foreach($this['ret'] as $line) // $this['ret'] is the result (FetchAll) of $sql="SELECT * from `tickets`";
    {
         echo "<tr>";
        foreach ($line as $cellLine)
        {
            echo "<td>" . $cellLine . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
     
    ?>
    Mais le souci est que par souci d'optimisation de la mémoire de la bdd, pour certaines données (priority et status), on a pas stocké les noms mais des clés (donc des chiffres à la place des noms). Donc pour ces données, si on affiche le contenu de la table, on affichera la clé à la place du nom.

    pour info :
    tickets.sql :
    Code sql : 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
    DROP TABLE IF EXISTS `tickets`;
    CREATE TABLE IF NOT EXISTS `tickets` (
      `id` smallint(11) NOT NULL AUTO_INCREMENT,
      `id_SESA` int(6) DEFAULT NULL,
      `product_name` varchar(25) COLLATE utf8_bin DEFAULT NULL,
      `assigned_group` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `submitted_date` datetime NOT NULL,
      `last_resolved_date` datetime NOT NULL,
      `summary` varchar(200) COLLATE utf8_bin NOT NULL,
      `priority_key` smallint(2) NOT NULL,
      `status_key` smallint(3) NOT NULL,
      `region` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `country` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `submitter_SESA` int(6) NOT NULL,
      `customer_SESA` int(6) NOT NULL,
      `organization` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `incident_type` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `reported_source` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `Prioritytype` (`priority_key`),
      KEY `Statustype` (`status_key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    priority.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `priority`;
    CREATE TABLE IF NOT EXISTS `priority` (
      `id` smallint(2) NOT NULL AUTO_INCREMENT,
      `name` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    status.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `status`;
    CREATE TABLE IF NOT EXISTS `status` (
      `id` smallint(3) NOT NULL AUTO_INCREMENT,
      `name` varchar(13) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Le but est évident : pour chaque ticket, afficher la liste des valeurs, mais en mettant les noms à la place des clés.
    A mon avis, il faut la bonne requête SQL qui donnera ça. Mais incapable de la trouver. Pouvez-vous m'aider ?

  2. #2
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Par convention, les clés étrangères ont le même nom dans toutes les tables.
    Et apparemment, si tu étais vraiment en POO, tu gérerais cette fonctionnalité dans ton modèle


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM tickets t LEFT JOIN priority p ON t.priority_key = p.id
    LEFT JOIN status s ON t.status_key = s.id

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    je ne m'attendais pas à une réponse si rapide !
    Quand tu parles de modèle, fais-tu allusion à l'architecture MVC ?

    J'ai tenu compte des conventions :

    priority.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE `priority` (
      `priority_key` smallint(2) NOT NULL,
      `priority` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT ''
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    status.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE `status` (
      `status_key` smallint(3) NOT NULL,
      `status` varchar(13) COLLATE utf8_bin NOT NULL DEFAULT ''
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    d'où la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM tickets t LEFT JOIN priority p ON t.priority_key = p.priority_key
    LEFT JOIN status s ON t.status_key = s.status_key
    pourquoi LEFT ?

    dans l'affichage, il faudra que j'élimine les colonnes *_key

  4. #4
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Oui, je fais allusion à l'architecture MVC.
    pourquoi LEFT ?
    Pour récupérer tous les enregistrements de la table "tickets" qui n'auraient pas de correspondance dans les tables jointes.
    dans l'affichage, il faudra que j'élimine les colonnes *_key
    Dans ma construction, la requête retourne "*", rien ne t'empêche de limiter les champs retournés (c'est même conseillé).
    Dans ta boucle, tu affiches les champs nécessaires voilà tout.

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut Laurent,

    présente plutôt comme ça le rendu :
    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
    <?php
     
    $head = [];
    foreach ($this('columnName') as $col) {
        $head[] = "<th>{$col['COLUMN_NAME']}</th>";
    }
     
    $rows = [];
    foreach ($this('ret') as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {
            $rows[] = "<td>{$value}</td>";    
        }
        $rows[] = '</tr>';
    }
    ?>
    <table>
      <thead>
        <tr><?= implode('', $head) ?></tr>      
      </thead>
      <tbody>
        <?= implode('', $rows) ?>
      </tbody>   
    </table>
    N'oublie pas que quand tu fais appel à PHPEcho ainsi $this('ret') (comme une fonction) toutes les valeurs contenues dans le tableau des valeurs ayant 'ret' pour clé sont échappées récursivement avant d'être renvoyées par la fonction. Sont échappées toutes les clés et toutes les valeurs, ainsi tu peux tout utiliser dans un affichage sans te soucier de l'échappement.

    L'autre notation $this['ret'] (notation tableau) te renvoie les données bruts et la il faut que tu penses à les échapper. C'est utile par exemple quand tu dois faire un test de comparaison dans ton rendu, quand tu ne sais pas si la donnée va être modifiée par l'échappement avec htmlspecialchars, il est préférable de la conserver brut. C'est très rare, mais ça peut arriver.
    Dans ce cas de figure tu devrais faire ainsi :
    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
    <?php
     
    $head = [];
    foreach ($this['columnName'] as $col) {
        $head[] = "<th>{$this('hsc', $col['COLUMN_NAME'])}</th>";
    }
     
    $rows = [];
    foreach ($this['ret'] as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {
            $rows[] = "<td>{$this('hsc', $value)}</td>";
        }
        $rows[] = '</tr>';
    }
    ?>
    <table>
      <thead>
        <tr><?= implode('', $head) ?></tr>
      </thead>
      <tbody>
        <?= implode('', $rows) ?>
      </tbody>
    </table>
    Dans ton rendu, sépare plus tes traitements de l'affichage à proprement parler

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    j'ai mis un temps fou à répondre...
    @ ma5tr3, all is OK

    @ rawsrc : j'ai du mal à faire marcher ton code qui est bogué :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $rows = [];
    foreach ($this('ret') as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {               // foreach attend un array mais $data est une string de longueur nulle et rien à voir avec un élément du tableau $this('ret')
            $rows[] = "<td>{$value}</td>";    
        }
        $rows[] = '</tr>';
    }
    Comme je n'arrive pas à déboguer, peux-tu le faire ?

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    bah je suis parti de ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach($this['ret'] as $line) // $this['ret'] is the result (FetchAll) of $sql="SELECT * from `tickets`";
    {
         echo "<tr>";
        foreach ($line as $cellLine)
        {
            echo "<td>" . $cellLine . "</td>";
        }
        echo "</tr>";
    }
    laisse tomber je devais être paumé dans ma tête, je n'ai pas intégré l'échappement récursif des tableaux comme je t'en avais parlé :honte: sur moi

    Je vais l'ajouter dans le code de PHPEcho

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    OK,
    comme entre temps, j'ai tenu compte de la remarque de ma5t3r
    Dans ma construction, la requête retourne "*", rien ne t'empêche de limiter les champs retournés (c'est même conseillé).
    , j'ai changé mon code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public function getAllTicketsByArray()
    {   $list_colowns="id_SESA,product_name,assigned_group,submitted_date,last_resolved_date,summary,priority,status,country,submitter_SESA,customer_SESA,organization,reported_source";
     
        $page = new PhpEcho([DIR_ROOT, 'view Layout.php']);
     
        $body = new PhpEcho([DIR_ROOT, 'view dispTicketsByArray.php'], [
            'colownName'=>$list_colowns
        ]);
        $page['body'] = $body;
     
        // on renvoie au navigateur la page assemblée
        echo $page;

    dispTicketsByArray.php :
    Code php : 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
     
    $model = new model();
    $valTickets=$model->getTickets();
     
    echo "<table><tr>";
    $colown_names=explode(',',$this['colownName']);
    foreach(($colown_names) as $colName) // $this['columnName']=list of the column's names (string)
    {
        echo "<th>".$colName."</th>";
    }
    echo "</tr>";
     
    foreach ($valTickets as $line)
    {
        echo "<tr>";
        foreach ($line as $cellLine)
        {
            echo "<td>" . $cellLine . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";

    as-tu des remarques à faire ?

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je viens de mettre à jour la version de PHPEcho intégrant ce dont j'avais parlé juste avant et un peu plus même.

    C'est par ici que ça passe : Blog PHPEcho : Une classe pour les gouverner tous.

    Du coup mon code devient fonctionnel avec cette version.
    Pour toi laurent, il n'y aucun changement mis à part copier coller le nouveau code de la classe.
    C'est rétro-compatible à 100 %

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Salut,
    j'ai fait un copier-coller de la classe (version PHP7) et modifié son adresse (car, comme j'ai suivi ton exemple, elle est dans le répertoire Vendor/PhpEcho et non rawsrc/PhpEcho, comme dans le code). Mais
    Warning: Class 'Vendor\PhpEcho\PhpEcho' not found in C:\xampp\htdocs\www\ticket2\Vendor\PhpEcho\PhpEcho.php on line 271
    et la ligne 271 : class_alias('Vendor\PhpEcho\PhpEcho', 'PhpEcho', false);

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    as-tu pensé à mettre à jour la déclaration du namespace ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
     
    namespace Vendor\PhpEcho;
    Attention PHP est sensible à la casse, gaffe au V majuscule, faut que cela soir raccord avec le nom du dossier

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Oui, j'y ai pensé et le V majuscule, c'est pas une erreur...(j'ai nommé le répertoire Vendor)

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    poste le code complet de ton fichier PhpEcho stp

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    Zut, ça fait 1h50 que tu as écrit

    PhpEcho.php :
    Code php : 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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    <?php
     
    namespace Vendor\PhpEcho\PhpEcho;
    /**
     * PhpEcho : PHP Template engine : One class to rule them all ;-)
     *
     * @link        https://www.developpez.net/forums/blogs/32058-rawsrc/b8215/phpecho-moteur-rendu-php-classe-gouverner/
     * @author      rawsrc - https://www.developpez.net/forums/u32058/rawsrc/
     * @copyright   MIT License
     *
     *              Copyright (c) 2020 rawsrc
     *
     *              Permission is hereby granted, free of charge, to any person obtaining a copy
     *              of this software and associated documentation files (the "Software"), to deal
     *              in the Software without restriction, including without limitation the rights
     *              to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     *              copies of the Software, and to permit persons to whom the Software is
     *              furnished to do so, subject to the following conditions:
     *
     *              The above copyright notice and this permission notice shall be included in all
     *              copies or substantial portions of the Software.
     *
     *              THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     *              IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     *              FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     *              AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     *              LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     *              OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     *              SOFTWARE.
     */
    class PhpEcho
        implements \ArrayAccess
    {
        /**
         * @var string
         */
        private $id = '';
        /**
         * @var array
         */
        private $vars = [];
        /**
         * Full resolved filepath to the external view file
         * @var string
         */
        private $file = '';
        /**
         * @var string
         */
        private $code = '';
     
        /**
         * @param mixed  $file   see setFile() below
         * @param array  $vars
         * @param string $id     if empty then auto-generated
         */
        public function __construct($file = '', array $vars = [], string $id = '')
        {
            if ($file !== '') {
                $this->setFile($file);
            }
     
            if ($id === '') {
                $this->generateId();
            } else {
                $this->id = $id;
            }
     
            $this->vars = $vars;
        }
     
        /**
         * @param string $id
         */
        public function setId(string $id)
        {
            $this->id = $id;
        }
     
        /**
         * @return string
         */
        public function id(): string
        {
            return $this->id;
        }
     
        /**
         * Generate an unique execution id based on random_bytes()
         * Always start with a letter
         */
        public function generateId()
        {
            $this->id = chr(mt_rand(97, 122)).bin2hex(random_bytes(4));
        }
     
        /**
         * Interface ArrayAccess
         * @param mixed $offset
         * @return bool
         */
        public function offsetExists($offset)
        {
            return array_key_exists($offset, $this->vars);
        }
     
        /**
         * Interface ArrayAccess
         * @param mixed $offset
         * @return mixed|null
         */
        public function offsetGet($offset)
        {
            return $this->vars[$offset] ?? null;
        }
     
        /**
         * Interface ArrayAccess
         * @param mixed $offset
         * @param mixed $value
         */
        public function offsetSet($offset, $value)
        {
            $this->vars[$offset] = $value;
        }
     
        /**
         * Interface ArrayAccess
         * @param mixed $offset
         */
        public function offsetUnset($offset)
        {
            unset($this->vars[$offset]);
        }
     
        /**
         * Define the filepath to the external view file to include
         *
         * Rule R001 : Any space inside a name will be automatically converted to DIRECTORY_SEPARATOR
         *
         * For strings : $parts = 'www user view login.php';
         *  - become "www/user/view/login.php"  if DIRECTORY_SEPARATOR = '/'
         *  - become "www\user\view\login.php"  if DIRECTORY_SEPARATOR = '\'
         *
         * For arrays, same rule (R001) for all values inside : $parts = ['www/user', 'view login.php'];
         *  - become "www/user/view/login.php"  if DIRECTORY_SEPARATOR = '/'
         *  - become "www/user\view\login.php"  if DIRECTORY_SEPARATOR = '\'
         *
         * File inclusion remove the inline code
         *
         * @param mixed $parts string|array
         */
        public function setFile($parts)
        {
            $file  = [];
            $parts = is_string($parts) ? explode(' ', $parts) : $parts;
            foreach ($parts as $p) {
                $file[] = str_replace(' ', DIRECTORY_SEPARATOR, $p);
            }
            $this->file = str_replace(DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, implode(DIRECTORY_SEPARATOR, $file));
            $this->code = '';
        }
     
        /**
         * Instead on including an external file, use inline code for the view
         *
         * CAREFUL : when you use inline code with dynamic values from the array $vars, you must
         * be absolutely sure that the values are already defined before, otherwise you will only have empty strings
         *
         * Inline code remove the included file
         *
         * @param string $code
         */
        public function setCode(string $code)
        {
            $this->code = $code;
            $this->file = '';
        }
     
        /**
         * This function return always escaped value with htmlspecialchars() from the array $vars
         *
         * You escape on demand anywhere in your code by calling this class like this :
         * $this('hsc', 'any scalar value you would like to escape');
         *
         * NOTE : a scalar value is a value that return true on PHP is_scalar() function
         * or an instance of class that implements the magic function __toString()
         *
         * @param  array  $args
         * @return mixed
         */
        public function __invoke(...$args)
        {
            $nb = count($args);
     
            if (empty($args) || ($nb > 2)) {
                return '';
            }
     
            /**
             * @param $p
             * @return bool
             */
            $is_scalar = function($p): bool {
                return is_scalar($p) || (is_object($p) && method_exists($p, '__toString'));
            };
     
            /**
             * @param  $p
             * @return string
             */
            $hsc = function($p): string {
                return htmlspecialchars((string)$p, ENT_QUOTES, 'utf-8');
            };
     
            /**
             * Return an array of escaped values with htmlspecialchars(ENT_QUOTES, 'utf-8') for both keys and values
             * Works for scalar and array type and transform any object having __toString() function implemented to a escaped string
             * Otherwise, keep the object as it
             *
             * @param  array $part
             * @return array
             */
            $hsc_array = function(array $part) use (&$hsc_array, $hsc, $is_scalar): array {
                $data = [];
                foreach ($part as $k => $v) {
                    $sk = $hsc($k);
                    if (is_array($v)) {
                        $data[$sk] = $hsc_array($v);
                    } elseif ($is_scalar($v)) {
                        $data[$sk] = $hsc($v);
                    } else {
                        $data[$sk] = $v;
                    }
                }
                return $data;
            };
     
            $value = null;
            if (($nb === 1) && isset($this->vars[$args[0]])) {
                $value = $this->vars[$args[0]];
            } elseif ($args[0] === 'hsc') {
                $value = $args[1];
            }
     
            if ($is_scalar($value)) {
                return $hsc($value);
            } elseif (is_array($value)) {
                return $hsc_array($value);
            } else {
                return '';
            }
        }
     
        /**
         * Magic method that returns a string instead of current instance of the class in a string context
         */
        public function __toString()
        {
            if (($this->file !== '') && is_file($this->file)) {
                ob_start();
                include $this->file;
                return ob_get_clean();
            } else {
                return $this->code;
            }
        }
    }
     
    // make the class directly available on the global namespace
    class_alias('Vendor\PhpEcho\PhpEcho', 'PhpEcho', false);

  15. #15
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    et bim ! dès la première ligne : namespace Vendor\PhpEcho\PhpEcho; <= erreur.

    dans mon code c'était namespace rawsrc\PhpEcho; donc tu aurais dû avoir namespace Vendor\PhpEcho;, bien que je te conseille très fortement de ne pas utiliser de majuscules dans les noms des répertoires.
    Et à la ligne 271 class_alias('Vendor\PhpEcho\PhpEcho', 'PhpEcho', false);

  16. #16
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 468
    Points : 5 826
    Points
    5 826
    Billets dans le blog
    1
    Par défaut
    bien vu.

    OK aussi pour le nommage des répertoires tout en minuscule, mais quelle est la raison ?

    Une question, suite à la remarque de ma5t3r : il me disait que la fonctionnalité irait bien dans le modèle, mais il ne serait mieux de la découper en 2 : l'extraction de données dans le modèle et l'affichage dans view ?

  17. #17
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    ... l'extraction de données dans le modèle et l'affichage dans view ?
    C'est justement ce que représente le MVC.
    Le Controller fait appel au Model qui lui "retourne" les données structurées puis les transfère à la View qui les affiche.

Discussions similaires

  1. Afficher double quote " dans un echo
    Par Xenon03 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2009, 10h36
  2. afficher des quotes dans un champ de formulaire
    Par benkunz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/10/2007, 14h45
  3. Afficher les pseudos qui ne commencent pas par une lettre.
    Par asoka13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/07/2007, 17h30
  4. Réponses: 3
    Dernier message: 26/07/2006, 20h41

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