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 :

[POO] PB d'interprétation des '\n' (PHP Objet)


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 15
    Points
    15
    Par défaut [POO] PB d'interprétation des '\n' (PHP Objet)
    Bonjour,

    Je met ici un code illustrant mon PB actuel.

    Le BUT:
    Récupérer une chaine de caractères extraite d'un fichier texte de configuration (param.conf), contenant éventuellement des "\n" indiquant des sauts de lignes. Ce texte (avec ses "\n") doit être transmis à un script PHP Objet (une classe dérivée de FPDF en fait) afin que celui celui-ci les interprête (=génère des sauts de lignes sur le PDF) .

    Or visiblement, je perds l'information comme quoi la chaine de caractères doit être analysée (c'est-à-dire comme ci elle était entre double quote, Cf. la version qui fonctionne dans le code de la méthode affiche() ).
    Cela sans doute lors de la valorisation du membre $PAR de mon objet (méthode chargeConf() ).

    Si vous pouviez me donner un coup de pouce... parce que là je craque un peu.

    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
     
    <?php
     
    define('FPDF_FONTPATH','../fpdf/font/');
    require('../fpdf/fpdf.php');
     
    //------------------------------------------- Ma classe dérivée de FPDF
    class Obj extends FPDF {
     
        var $PAR;
        var $PAR2;
     
        function chargeConf($tablo)
        {
            while(list($key,$value) = each($tablo)) {
                switch($key) {
                case 'PARAM':
                    $this->PAR = $value;
                    break;
                case 'PARAM2':
                    $this->PAR2 = trim($value, '"');
                    break;
                default:
                    // ....
                    break;
                }
            }
        }
     
        function affiche() {
            $this->SetFont('Arial','B',9);
     
            //************ Les 2 lignes suivantes fonctionnent ('/n' interprété) : **************
            //************************************************************************
            $maChaine="texte quelconque\navec saut de ligne";
            $this->MultiCell(50, 4, $maChaine, 1, 'L', 0);   //methode héritée de FPDF
     
            //************ La ligne suivante NE fonctionne PAS ('/n' NON interprété) : **************
            //*****************************************************************************
            $this->MultiCell(50, 4, $this->PAR, 1, 'L', 0);   //methode héritée de FPDF
        }
     
    }
     
     
    //-------------------------------------------  Le script lui même
    $config_file = "./param.conf";
    $fp = fopen($config_file, "r");
     
    while (!feof($fp)) {
      $line = trim(fgets($fp, 1024));
      if ($line) {
        $pieces = explode("=", $line);
        $option = trim($pieces[0]);
        $value = trim(trim($pieces[1]), '"');
        //DEBUG $value = trim($pieces[1]);
        $tab[$option] = $value;
      }
    }
    fclose($fp);
     
    $monObj = new Obj;
    $monObj->chargeConf($tab);
    $monObj->Open();        //methode héritée de FPDF
    $monObj->AddPage();    //methode héritée de FPDF
    $monObj->affiche();    //*** Cf le code de cette méthode + haut : c'est là qu'il y a un PB
    $monObj->Output();    //methode héritée de FPDF
     
    ?>

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    En effet, il me semble que tu utilises la fonction trim(), qui sert justement à supprimer tous les types d'espace (y compris les divers sauts de ligne) en début et fin de chaîne. Il me semble que tu peux utiliser le paramètre optionnel de trim() pour y remédier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = trim($string, ' ');
    Réitère cet appel avec des doubles quotes et \t pour éliminer les tabs.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci de ton aide.

    En fait mon fichier param.conf est ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PARAM="texte quelconque\navec saut de ligne"
    PARAM2="texte2 quelconque\navec saut de ligne"
    Donc j'utilise le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = trim(trim($string), '"');
    pour me débarrasser des double quote en trop. Le trim() à l'intérieur me supprime au préalable tous les espaces et sauts aux 2 extrémités de ma chaine, pas dedans, non ?

    Si je fais comme tu dis, juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = trim($string, ' ');
    J'obtiens au final dans mon PDF
    "texte quelconque\navec saut de ligne"
    au lieu de (actuellement)
    texte quelconque\navec saut de ligne
    Le résultat voulu étant
    texte quelconque
    avec saut de ligne

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Okay ^^

    Je ne connais pas bien la bibliothèque que tu utilises. Il est probable qu'elle ne gère pas les caractères de retour à la ligne comme de vrais retours à la ligne. Est-ce qu'il te les affiche ou bien les ignore-t-il ?
    Il me semble que le PDF est un format qui utilise des coordonnées pour positionner les éléments. Conséquence : mettre un \n dans un PDF est similaire à en mettre un dans un doc HTML ou dans une image : l'application d'affichage s'en balance royalement

    Si c'est vraiment le cas, une solution serait de demander à la librairie PDF de mettre une nouvelle ligne à chaque fois que tu trouves un \n. Pour cela, tu as plusieurs options, notamment de splitter la chaîne selon \n...

    Cela dit, je serais étonné que la librairie ne le gère pas !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    La librairie FPDF (au passage très bien documentée en français sur www.fpdf.org) gère les '\n' c'est LE moyen d'introduire des saut de pages explicites.
    Actuellement mon script les affiche "à l'écran" (i.e. dans le PDF généré) au lieu de les interpréter, comme je le dis dans mon post précédent (" au lieu de (actuellement)...").

    Le PB n'est sans doute pas dans la librairie FPDF, mais dans mon script.

    Comme je l'ai mis dans le code source + haut, si je passe par une variable contenant la chaine de caractères en dur et entre double quotes, dans le corps de la méthode affiche() FPDF interprête alors bien les '\n'.

    mais pour une raison que je ne comprends pas, les variables membres de l'instance $monObj de ma classe "semblent valoir" :

    $this->PAR='texte quelconque\navec saut de ligne' (simples quotes)

    et non plus

    $this->PAR="texte quelconque\navec saut de ligne" (doubles quotes)

    C'est sans doute soit à la lecture du fichier de conf + remplissage de $tab, soit lors du chargement des membres de $monObj depuis $tab dans chargeConf() que je fais une boulette.

    A+

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Yogui ===


    Bref.

    Je sais pourquoi cela ne fonctionne pas comme tu l'espères ^^
    Lors de la lecture du fichier de conf, tu n'utilises pas un fichier PHP mais un texte brut. Conséquence : les \n ne sont pas interprêtés (comme tu l'espères) mais traités comme deux caractères distincts.

    Solution 1
    Ajouter un appel à str_replace() pour changer tes \n en leur équivalent hexadécimal.
    Ça paraît un peu foireux, non ?

    Solution 2
    Utiliser un fichier "param.conf.php" utilisant des variables classiques PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $param = "texte quelconque\navec saut de ligne";
    $param2 = "texte2 quelconque\navec saut de ligne";
    Le plus intéressant serait de le faire avec des define() plutôt qu'avec des variables, mais cela t'enlèverait la possibilité de mettre ces chaînes directement dans ton tableau...
    Note : avec cette méthode, tu n'as plus besoin de fopen() : include() suffit.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Salut.
    Merci pour tes solutions.
    Je vais essayer (ce soir si j'ai le courage, demain au taf sinon) ta solution 1, en espérant que tu es raison, auquel cas j'aurai appris un truc interessant.

    Ta solution 2, bien que plus propre me plait moins :

    1/c'est un fichier qui restera à portée d'utilisateur habilité mais non experte en développement, aussi j'ai peur que des "$" et des ";" ne les rebutent (déjà qu'il va falloir parlementer sur les '\n' ...).

    2/ Un fichier texte modifiable par n'importe quel bloc-notes est le plus facile à faire passer auprès de mes utilisateurs. A la limite, l'extention ".txt" ajouté au fichier les rassurerai d'avantage.

    3/ Surtout, en passant par la lecture/analyse d'un fichier fichier de conf', et toujours parce que les personnes utilisatrices ne sont pas expertes en la matière, il me semble que je suis plus à l'abris - par rapport à un include() direct dans le code - de saisie erronée et des PBs que cela peut entrainer dans l'appli.

    En tout cas merci à nouveau de ton aide !

    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Ca fonctionne
    J'ai utiliser str_replace pour remplacer les '\n' par des chr(10).

    Merci Yogui.
    A+

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    De rien : c'était pas commun et intéressant ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conserver des valeurs PHP objet
    Par lemage34b dans le forum Langage
    Réponses: 11
    Dernier message: 05/05/2014, 18h11
  2. [POO] Organisation des classes PHP
    Par AsQuel dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2007, 09h09
  3. [POO & DOM] programation js par enrichissement des éléments du DOM
    Par sekaijin dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/01/2007, 15h25
  4. [POO] un truc me chagrine (portée des variables ?)
    Par novices dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2006, 15h05
  5. Réponses: 3
    Dernier message: 17/10/2005, 16h26

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