Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.17 KB | None | 0 0
  1. package Marica::Base::HeaderParser::modeles ;
  2. #prend les paramètres de la requête dans le query_string, les place dans la requête associée au modèle demandé
  3. #et écrit le document dans /home/www_marica/base/listing/$id_session
  4.  
  5.  
  6. use strict ;
  7.  
  8. use warnings ;
  9.  
  10. use Apache2::Const -compile => qw( OK SERVER_ERROR DECLINED REDIRECT) ;
  11.  
  12. sub handler  {
  13.  
  14.     my $r = shift ;
  15.  
  16.     my $path = $r->filename ;
  17.  
  18.     #ne traiter que les modèles
  19.     return Apache2::Const::DECLINED if ( $path !~ /modeles/ ) ;
  20.  
  21.     $r->no_cache(1) ;
  22.  
  23.     #pour la récupération des paramètres passés dans le query_string
  24.     my $req = Apache2::Request->new($r) ;
  25.  
  26.     my ( $content, $sql, $sth ) ;
  27.  
  28.     my $dbh = $r->pnotes('dbh') ;
  29.  
  30.     local $@ ;
  31.  
  32.     my $id_client = $r->pnotes('session')->{id_client} ;
  33.  
  34.     #Recherche des paramètres de la requête associée au modèle dans le query string de la requête
  35.     #exemple de requête : http://marica.fr/base/modeles/1/3/11.doc?id_contentieux=5275&id_tiers=5774
  36.     my @path = split /\//, $path ;
  37.  
  38.     #enlever l'extension du fichier pour avoir id_modele
  39.     ( my $id_modele = pop @path ) =~ s/\..*// ;
  40.  
  41.     #recherche du sql de la requête associée au modèle et du type de document (.docx, .odt)
  42.     $sql = 'SELECT sql_string, extension, id_categorie FROM tblmodele_document WHERE id_modele = ?' ;
  43.  
  44.     my $ary_ref = $dbh->selectall_arrayref( $sql, { }, ( $id_modele ) ) ;
  45.  
  46.     $sql = $ary_ref->[0]->[0] ;
  47.  
  48.     my $extension =  $ary_ref->[0]->[1] ;
  49.  
  50.     my $id_categorie = $ary_ref->[0]->[2] ;
  51.  
  52.     #id_contentieux est toujours présent
  53.     my $id_contentieux = $req->param('id_contentieux') ;
  54.  
  55.     #le remplacer dans le sql de la requête
  56.     $sql =~ s/ID_CONTENTIEUX/$id_contentieux/ ;
  57.  
  58.     #paramètres optionnels
  59.     my ($id_tiers, $intervenant) ;
  60.  
  61.     #la dernière entrée de @path contient le type de modèle (1:Dossier/2:Intervenant/3:Tiers)
  62.     my $type = pop @path ;
  63.  
  64.     if ( $type == 2 ) {
  65.  
  66.     $intervenant = $req->param('intervenant') ;
  67.    
  68.     $sql =~ s/INTERVENANT/$intervenant/ ;
  69.  
  70.  
  71.     } elsif ( $type == 3 ) {
  72.  
  73.     $id_tiers = $req->param('id_tiers') ;
  74.    
  75.     $sql =~ s/ID_TIERS/$id_tiers/ ;
  76.  
  77.     }
  78.  
  79.  
  80.     #rechercher les données et écrire le fichier 'data.extension' qui sera récupéré
  81.     my @data_set = @ { $dbh->selectall_arrayref( $sql, { Slice => { } }, ( ) ) } ;
  82.  
  83.     #$data donne les valeurs à remplacer dans le template
  84.     my $data = eval { $data_set[0] } ;
  85.  
  86.     #construction du chemin vers le fichier rendu
  87.     my $base_file_name = $r->pnotes('session')->{_session_id} ;
  88.  
  89.     #créer un répertoire avec le nom de la session dans /base/listing; il contiendra les fichiers de l'archive (.docx ou .odt) dézippée
  90.     my $recipient_dir = $r->document_root . '/base/listing/' . $base_file_name ;
  91.  
  92.     my @args = ('mkdir', '-p', $recipient_dir ) ;
  93.  
  94.     #path is always tainted when Perl starts; make -T switch happy
  95.     $ENV{'PATH'} = '/bin:/usr/bin' ;
  96.  
  97.     eval {
  98.  
  99.     system(@args) == 0 or die "system @args failed: $?" ;
  100.  
  101.     } ;
  102.  
  103.     #le modèle de base (/home/www_marica/base/modeles/1/2/23.docx)
  104.     my $template = $r->document_root . '/base/modeles/' . $r->pnotes('session')->{id_client} . '/' . $id_categorie . '/' . $id_modele . '.' . $extension ;
  105.    
  106.     my $output_file = $base_file_name . '.' . $extension ;
  107.  
  108.     #création du répertoire de décompression du template
  109.     #-o overwrite files -q quiet
  110.     #on extrait le contenu du template
  111.     my $command = "unzip -o -q $template -d $recipient_dir" ;
  112.  
  113.     system( $command ) == 0 or die "can't unzip $template : $!\n" ;
  114.  
  115.     #slurp mode on; apache limite les uploads à 64MB dans la configuration standard
  116.     local $/ = undef ;
  117.  
  118.     #partie à modifier : dans un fichier docx, le texte se trouve dans word/document.xml
  119.     my $document_content = $recipient_dir . '/word/document.xml' ;
  120.  
  121.     open DOCUMENT_CONTENT, "<", "$document_content" or die "can't open $document_content : $!\n" ;
  122.  
  123.     #on slurpe le contenu
  124.     my $xml = <DOCUMENT_CONTENT> ;
  125.  
  126.     close DOCUMENT_CONTENT ;
  127.  
  128.     #remplacement des data_field par leur valeur
  129.     for ( keys %{ $data } ) {
  130.  
  131.     #éviter l'erreur uninitialized value si le champ est vide
  132.     $data->{$_} ||= '' ;
  133.  
  134.     $xml =~ s/$_/$data->{$_}/g ;
  135.  
  136.     }
  137.  
  138.     #réecrire le contenu du document avec les nouvelles valeurs
  139.     open DOCUMENT_CONTENT, ">", "$document_content" or die "can't open $document_content : $!\n" ;
  140.  
  141.     print DOCUMENT_CONTENT $xml ;
  142.  
  143.     close DOCUMENT_CONTENT ;
  144.  
  145.     #il faut préfixer le nom du fichier produit avec _session_id pour passer le barrage de HeaderParser/modeles.pm
  146.     my $destination_file = $r->pnotes('session')->{_session_id} . '.' . $extension  ;
  147.  
  148.     chdir $recipient_dir ;
  149.  
  150.     #zipper le nouveau contenu; q = quiet r = recursive
  151.     $command = 'zip -qr ' . $r->document_root() . '/base/listing/' . $destination_file . ' *' ;
  152.  
  153.     system( $command ) == 0 or die "can't zip $base_file_name.docx: $!\n" ;
  154.  
  155.     #emplacement du fichier renvoyé après substitution des valeurs
  156.     my $location = '/base/listing/' . $destination_file ;
  157.  
  158.     $r->headers_out->set(Location => $location) ;
  159.  
  160.     return Apache2::Const::REDIRECT ;
  161.  
  162. }
  163.  
  164.  
  165. 1 ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement