Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PHPWord] CloneBlock limite caractères

    28 février 2017 à 10:01:05

    Bonjour,

    J'ai un problème plutôt très spécifique et assez précis.

    J'utilise PHPWord, et ici plus précisément le Template Processing de PHPWord. Il consiste à dupliquer un bloc qui est entouré de balises ${clone}...${/clone} par exemple.

    Dans mon cas, je veux copier mon bloc pour chaque jour qui se passe, durant une période précise. Voici le code.

    require_once 'bibliotheques/PhpWord/Autoloader.php';
    use PhpOffice\PhpWord\Autoloader;
    Autoloader::register();
    $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('../tmp/documents/sources/modele_deroulement_pedagogique.docx');
    
    /* requête SQL propre (si si) */
    $formateurs = $listformateurs->fetchAll(PDO::FETCH_ASSOC);
    
    foreach($formateurs as $formateur){
      $theformateur = $formateur['lastname'].' '.$formateur['firstname'];
      /* récupère date de début et date de fin de la formation du formateur en question */
      $start = new DateTime($formateur['formateur_start']);
      $end = new DateTime($formateur['formateur_end']);
      /* bug de DateTime, doit ajouter le dernier jour */
      $end->modify('+1 day');
      /* je transforme la date de début et la date de fin en objet "période" */
      $period = new DatePeriod($start, new DateInterval('P1D'), $end);
      /* je parcours ma période */
      foreach($period as $dt) {
        $curr = $dt->format('D');
        /* si le jour J n'est pas un weekend, je comptabilise un jour */
        if ($curr == 'Sat' || $curr == 'Sun') {
          // Weekend, on fait rien
        }
        else{
          $nbjour++;
        }
      }
    }
    $templateProcessor->cloneBlock('CLONEME', $nbjour-1);

    Je duplique donc chaque jour, -1. le -1 est important puisque je souhaite que le dernier jour soit un autre bloc, qui est présent dans mon docx. C'est là que ça foire.

    Mon bloc CLONEME se duplique bien, par contre si je met du contenu après la fermeture du bloc CLONEME, selon le nombre de caractères, la duplication ne se fait plus.

    J'ai cherché partout sur internet mais je n'ai trouvé personne avec le même problème que moi.

    Test qui fonctionne.

    Test qui ne fonctionne pas.

    Si vous y regardez de plus près, il y'a bien une différence entre les deux. J'ai ajouté une ligne à mon tableau sur le 2ème exemple qui fait tout buguer. Je pense que cela vient d'une limite de caractère imposée après le ${/CLONEME}. Cela ne dépend pas du nombre de jour dupliqué puisque même sur une période de 2 jours j'ai le bug.

    C'est à n'y rien comprendre. Si quelqu'un a déjà fait face à ce problème, je serais gréé de me diriger vers une astuce voir une solution !

    Merci.

    -
    Edité par Shonen17 28 février 2017 à 10:05:12

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2023 à 23:32:34

      J'ai eu le même problème avec la version actuelle et j'ai mis énormément de temps à trouver la solution, je la mets donc ici pour ceux qui, comme moi, seraient coincés.

      Il faut augmenter les valeurs de conf PHP de :

      pcre.backtrack_limit
      
      pcre.recursion_limit


      Cela permet à preg_match utilisé pour repérer les blocs de traiter des plus grandes chaînes de caractères.

      Exemple à placer au début de son script :

      ini_set("pcre.backtrack_limit", "23001337");
      ini_set("pcre.recursion_limit", "23001337");



      • Partager sur Facebook
      • Partager sur Twitter

      [PHPWord] CloneBlock limite caractères

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown