2010-08-25 5 views
1

Donc, voici mon code:Problème d'économie archive zip dité (docx)

<?php 

$zip = new ZipArchive; 
if ($zip->open('test.docx') === TRUE) { 

$xmlString = $zip->getFromName('word/document.xml'); 
$xmlString = str_replace('$FIRST_AND_LAST_NAME', 'John Doe', $xmlString); 
    $zip->addFromString('word/document.xml', $xmlString); 

echo 'ok'; 

    $zip->close(); 
} else { 
    echo 'failed'; 
} 

Son but est simple. Il ouvre un fichier test.docx, recherche toutes les occurrences d'une chaîne "$ FIRST_AND_LAST_NAME" et les remplace par "John Doe".

Cela fonctionne parfaitement sur mon serveur de développement Windows (la chaîne "John Doe" est dans le docuemnt quand je l'ouvre).

Cela ne fonctionne pas sur mon serveur de production Lunux (la chaîne "$ FIRST_AND_LAST_NAME" est toujours présente, il n'y a pas de "John Doe").

Il n'y a pas d'erreur ou de remarque, le "ok" est imprimé sans erreur. J'ai vérifié que le fichier test.docx avait les privilèges définis sur 777.

+0

Pas d'avertissement? Le rapport d'erreur est-il activé? Est-ce que 'close()' retourne 'true'? –

+0

Avez-vous essayé d'afficher le contenu de $ xmlString après son extraction? Pourrait être l'échec de l'extraction sur le côté Linux des choses. str_replace ne sera pas en colère contre vous et échouera soudainement sans raison, donc très probablement son entrée (le $ xmlString) n'est pas ce que vous attendez qu'il soit. –

+0

@Pekka Je viens de remarquer que $ zip-> close() renvoie false. –

Répondre

0

Ok, j'ai utilisé une classe que je trouvais à phpclasses:

http://phpclasses.web4u.cz/package/6278-PHP-Edit-a-Zip-archive-in-pure-PHP-no-temporary-files.html

Voici le code de travail:

private function GenerateDocx($theTemplate, array $theReplacemenArray, $theOutputFile) 
{ 
    $aSearchArray = array(); 
    foreach(range('A','Z') as $aLetter) { 
     $aSearchArray[] = str_repeat($aLetter, 5); 
    } 
    $aArrayCountDifference = count($aSearchArray) - count($theReplacemenArray); 
    $aSearchArray = array_slice($aSearchArray, 0, -$aArrayCountDifference);  

    require_once('tbszip.php'); 
    $tbszip = new clsTbsZip(); 
    $tbszip->Open($theTemplate); 

    $aXmlPath = 'word/document.xml'; 

    if (true === $tbszip->FileExists($aXmlPath)) { 

     $aXmlString = $tbszip->FileRead($aXmlPath); 

     $aXmlString = str_replace($aSearchArray, $theReplacemenArray, $aXmlString); 

     if (1 != $tbszip->FileReplace($aXmlPath, $aXmlString)) { 
      throw new Exception('FileReplace() failed.'); 
     } 

     $tbszip->Flush(TBSZIP_FILE, $theOutputFile); 

     $tbszip->Close(); 

    } 
} 
+0

D'accord, je sais que c'est une classe ancienne pour PHP 4 mais bon, ça marche. Et j'avais juste besoin de le faire fonctionner maintenant. Je peux refactoriser plus tard. –

1

Si close() renvoie la valeur false, une erreur s'est produite lors de l'écriture de l'archive.

Utilisez getStatusString pour obtenir le message d'erreur exact.

+0

Je reçois 'Erreur fatale: Appel à la méthode indéfinie ZipArchive :: getStatusString()'. Il semble que le serveur est une ancienne version de PECL zip. –

+0

@Richard aww. Impossible de voir le moyen d'obtenir le message d'erreur avant la version 5.2.7 ... Le rapport d'erreur est entièrement activé? –

+0

Oui. J'ai error_reporting (E_ALL); en haut du fichier. –

1

Ajouter sleep(1) avant $zip->addFromString('word/document.xml', $xmlString);

Il fonctionne sur mon Ubuntu 12.04

N'oubliez pas de taper votre variable en même temps lorsque vous créez un fichier docx, je veux dire ne jamais taper FIRST_AND_LAST_NAME et ensuite vous ajoutez un symbole $ après cela. Il crée un code XML différent.

Questions connexes