Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Nouveau Membre du Club
    Inscrit en
    octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 50
    Points : 38
    Points
    38

    Par défaut [FPDF] Tableau 2 colonnes

    Bonsoir,

    Dans une partie de mon site web, je donne la possibilité au visiteur de consulter des fiches d'institutions. Je voudrais donner la possibilité au visiteur d'enregistrer au format pdf la fiche d'une institution.

    Les données sont relativement simples:

    4 tables (Identification, Contact, Public, Activités) de deux colonnes:
    • Première colonne le libellé

    • Deuxième colonne l'information


    J'ai créé dans une classe qui étend fpdf

    Code :
    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
     
        function BasicTable($data,$width)
        {
            $this->SetFont('Arial','',12);
            $this->SetFillColor(240,255,191);
            $this->SetTextColor(0,0,0); 
            $this->Cell(0,0,'','B',0,'L',0);  
            $this->Ln(0.1);                                
            //Données
            foreach($data as $lib=>$row)
            {
                if (strlen($row) == 0) {
                    $hauteur = 7;
                }
                else {
                    $hauteur = (ceil(strlen($row)/70)*6.5);             
                    $nb = preg_match_all("(\\n)",$row,$trouve);
                    //$hauteur = $hauteur +  ($nb * 5);
                }    
                $this->MultiCell(0,0,
                    $this->Cell($width,$hauteur,$lib,'LR',0,'L',1)
                    .$this->MultiCell(0,6,$row,0,'L',0));
     
            }
            $this->Ln(); 
            $this->Cell(0,0,'','B',1,'L',0);        
            $this->Ln(2);             
        }
    Je voudrais que la colonne libellé prenne la même hauteur que la colonne "donnée"... Mon code bug évidement si la partie donnée contient beaucoup de retour à la ligne.

    Je ne sais plus trop comment aborder le problème, en html, je n'ai pas de soucis les tables gèrent très bien leur hauteur de cellule et même avec des divs ça serait assez facile à mettre en place avec du CSS...

    Merci d'avance
    lionel

  2. #2
    Membre chevronné Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 672
    Points : 727
    Points
    727

    Par défaut

    Citation Envoyé par spitou_77 Voir le message
    $this->MultiCell(0,0,
    $this->Cell($width,$hauteur,$lib,'LR',0,'L',1)
    .$this->MultiCell(0,6,$row,0,'L',0));
    Hello,

    Ce bout de code me parait "étrange"!

    Je suis pas sur d'avoir compris ce qui représente la première colonne de ce qui correspond à la deuxième.

    Code :
    1
    2
    $this->Cell($width/2,$hauteur,$col1_txt,'LR',0,'L',1)
    $this->Cell($width/2,$hauteur,$col2_txt,'LR',1,'L',1)
    En faisant comme ca tu va dessiner 2 rectangles l'un à coté de l'autre , de même hauteur, de largeur la moitié de ton paramètre de taille passé, une bordure à gauche et à droite.
    Un saut de ligne est inséré automatiquement après la dernière case de la ligne (paramètre en vert).

    ++
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  3. #3
    Nouveau Membre du Club
    Inscrit en
    octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 50
    Points : 38
    Points
    38

    Par défaut

    Bonjour,

    Merci beaucoup pour ta réponse. Le soucis c'est que j'ai besoin d'un multicell pour la colonne data, certaines données sont trop longues pour s'afficher sur une seule ligne ou contiennent des '\n'.

    C'est d'ailleurs mon plus gros soucis, le calcul de ma hauteur sera complètement foireux en cas d'utilisation de plusieurs retour à lignes.

    si $row contient 'Bonjour\n\nBlaBlaBla\n\nAurevoir', mon calcul va déterminer qu'une hauteur d'une seule ligne (31/70 arrondi vers le haut) suffira à contenir mon texte alors qu'avec les retours à la ligne, il m'en faudrait 5.

    Je vais essayer de modifier le calcul de ma hauteur:
    1) $nbligne = ceil(strlen($row)/70);
    2) $nbretour = preg_match_all("(\\n)",$row,$trouve);
    3) $hauteur = ($nbligne + $nbretour) * 6.5;

    Et pour mon code étrange:
    le premier $this->MultiCell correspondrait en html à la balise <tr>
    et qui comporterait un <th> ($this->Cell) et un <td> ($this->MultiCell)

    Je ne suis vraiment pas sur du tout que ce soit très propre ou optimisé... je débute avec fpdf... tous les conseils sont les bienvenus

    merci

  4. #4
    Membre chevronné Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 672
    Points : 727
    Points
    727

    Par défaut

    J'ai pas de quoi le tester, mais voici une idée :
    ( GetStringWidth permet de récupérer la longueur de la chaine dans le système FPDF).

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    $no_colonnes = 2;
     
    $nb_lignes_col1 = ceil($this->GetStringWidth($col1_txt)/($width*$no_colonnes))+substr_count($col1_txt,'\n');
    $nb_lignes_col2 = ceil($this->GetStringWidth($col2_txt)/($width*$no_colonnes))+substr_count($col2_txt,'\n');
     
    $diff_nb_lignes = abs($nb_lignes_col2-$nb_lignes_col1);
    if ($nb_lignes_col1 < $nb_lignes_col2){
       for ($i=0; $i<$diff_nb_lignes ; $i++){
          $col1_txt .= "\n";
       }
       $this->MultiCell($width/$no_colonnes,$hauteur,$col1_txt,'LR','L',1)
    }else{
       for ($i=0; $i< $diff_nb_lignes; $i++){
          $col2_txt .= "\n";
       }
       $this->MultiCell($width/$no_colonnes,$hauteur,$col2_txt,'LR','L',1)
    }
    $this->Ln();
    Le calcul de la hauteur a surement besoin de qq optimisations : genre ne pas compter les \n dans la longueur, mais cela est peut être fait automatiquement par la fonction GetStringWidth, je ne sais pas.
    Two beer or not two beer. (Shakesbeer)
    Question technique par MP => poubelle!

  5. #5
    Nouveau Membre du Club
    Inscrit en
    octobre 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 50
    Points : 38
    Points
    38

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    $nbligne = 0;
                    $nbretour = 0;
                    $paragraphe = explode (CHR(10),$row);
                    foreach ($paragraphe as $p){                  
                        if (strlen($p) > 1){
                            $nbligne = $nbligne + (ceil(strlen($p)/58)); 
                            }
                        else
                           $nbretour++;    
                    } 
                    $hauteur = ($nbligne + $nbretour) * 6;
    Merci pour tes réponses, cela m'a mis sur la bonne voie pour trouver une solution à mon problème.

    J'ai du utiliser la police "Courier" sinon j'obtenais des surprises

    Encore merci
    lionel

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •