From 3c3684202d0f845b3d16cce0015a85dcd4d90f4f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Thu, 20 Sep 2018 15:39:51 +0200
Subject: [PATCH] =?UTF-8?q?-=20Gestion=20des=20num=C3=A9ros=20de=20page=20?=
 =?UTF-8?q?en=20cas=20de=20publipostage=20-=20Gestion=20des=20variables=20?=
 =?UTF-8?q?positionn=C3=A9es=20dans=20les=20ent=C3=AAtes=20et=20les=20pied?=
 =?UTF-8?q?s=20de=20page=20(en=20ca=20de=20publipostage,=20c'est=20la=20pr?=
 =?UTF-8?q?emi=C3=A8re=20salve=20de=20valeurs=20qui=20est=20prise=20en=20c?=
 =?UTF-8?q?ompte)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/Publisher.php | 41 ++++++++++++++----------
 src/Stylist.php   | 81 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 106 insertions(+), 16 deletions(-)

diff --git a/src/Publisher.php b/src/Publisher.php
index 1ee526a..9d84322 100644
--- a/src/Publisher.php
+++ b/src/Publisher.php
@@ -161,6 +161,10 @@ class Publisher
 
 
 
+
+
+
+
     public function getSections(DOMElement $element): array
     {
         $textNs = $this->getDocument()->getNamespaceUrl('text');
@@ -224,15 +228,16 @@ class Publisher
             'automatic-styles'
         )->item(0);
 
-        $styleNs = $this->getDocument()->getNamespaceUrl('style');
-
-        $stylePageBreak = $this->content->createElementNS($styleNs, 'style:style');
-        $stylePageBreak->setAttributeNS($styleNs, 'style:name', self::PAGE_BREAK_NAME);
-        $stylePageBreak->setAttributeNS($styleNs, 'style:family', 'paragraph');
-        $stylePageBreak->setAttributeNS($styleNs, 'style:parent-style-name', 'Standard');
-
-        $stylePageBreakProperties = $this->content->createElementNS($styleNs, 'style:paragraph-properties');
-        $stylePageBreakProperties->setAttribute('fo:break-after', 'page');
+        $stylePageBreak           = $this->newElement('style:style', [
+            'style:name'              => self::PAGE_BREAK_NAME,
+            'style:family'            => 'paragraph',
+            'style:parent-style-name' => 'Standard',
+            'style:master-page-name'  => 'Standard',
+        ]);
+        $stylePageBreakProperties = $this->newElement('style:paragraph-properties', [
+            'style:writing-mode' => 'page',
+            'style:page-number'  => '1',
+        ]);
 
         $stylePageBreak->appendChild($stylePageBreakProperties);
         $styles->appendChild($stylePageBreak);
@@ -335,9 +340,11 @@ class Publisher
                         $this->setVariable($vElement, $val);
                     }
                 }
-                list($sName, $sType) = explode("@", $name);
-                if ($sType == 'text:section') {
-                    $name = $sName;
+                if (false !== strpos($name, '@')) {
+                    list($sName, $sType) = explode("@", $name);
+                    if ($sType == 'text:section') {
+                        $name = $sName;
+                    }
                 }
                 if (isset($sections[$name])) {
                     foreach ($sections[$name] as $sElement) {
@@ -420,8 +427,10 @@ class Publisher
         $first = true;
         foreach ($this->values as $values) {
             $bodyNode = $this->body->cloneNode(true);
-
-            if (!$first && $this->isAutoBreak()) {
+            if ($first){
+                $this->getDocument()->getStylist()->setVariables($values);
+                $first = false;
+            }elseif($this->isAutoBreak()){
                 $this->addPageBreak($bodyNode);
             }
 
@@ -448,7 +457,7 @@ class Publisher
     {
         $document = $this->getDocument();
 
-        return $document->find($document->getContent(), $name);
+        return $document->find($this->content, $name);
     }
 
 
@@ -477,7 +486,7 @@ class Publisher
     {
         $document = $this->getDocument();
 
-        return $document->newElement($document->getContent(), $name, $attrs);
+        return $document->newElement($this->content, $name, $attrs);
     }
 
 
diff --git a/src/Stylist.php b/src/Stylist.php
index e12d9db..faf7a8c 100644
--- a/src/Stylist.php
+++ b/src/Stylist.php
@@ -79,6 +79,13 @@ class Stylist
 
 
 
+    /**
+     * @param       $text
+     * @param array $options
+     *
+     * @return Stylist
+     * @throws Exception
+     */
     public function addFiligrane($text, array $options = []): Stylist
     {
         $dw = strlen($text) * 2;
@@ -204,6 +211,80 @@ class Stylist
 
 
 
+    /**
+     * @param DOMElement $element
+     *
+     * @return Publisher
+     * @throws Exception
+     */
+    public function getVariables(): array
+    {
+        $textNs = $this->getDocument()->getNamespaceUrl('text');
+
+        $vElements = $this->find('text:variable-set');
+        foreach ($vElements as $vElement) {
+            $name = $vElement->getAttributeNs($textNs, 'name');
+
+            if (!isset($variables[$name])) $variables[$name] = [];
+            $variables[$name][] = $vElement;
+        }
+
+        return $variables;
+    }
+
+
+
+    /**
+     * @param DOMElement $element
+     * @param string     $value
+     *
+     * @return Publisher
+     */
+    public function setVariable(DOMElement $element, string $value): Stylist
+    {
+        $textNs = $this->getDocument()->getNamespaceUrl('text');
+
+        $document = $element->ownerDocument;
+
+        $value = explode("\n", $value);
+        for ($i = 0; $i < count($value); $i++) {
+            if ($i > 0) {
+                $returnVNode = $document->createElementNS($textNs, 'text:line-break');
+                $element->parentNode->insertBefore($returnVNode, $element);
+            }
+            $vText = $document->createTextNode($value[$i]);
+            $element->parentNode->insertBefore($vText, $element);
+        }
+        $element->parentNode->removeChild($element);
+        $this->getDocument()->setStylesChanged(true);
+
+        return $this;
+    }
+
+
+
+    /**
+     * @param array $variables
+     *
+     * @return Stylist
+     * @throws Exception
+     */
+    public function setVariables(array $variables): Stylist
+    {
+        $vars = $this->getVariables();
+        foreach( $vars as $name => $elements ){
+            if (isset($variables[$name])){
+                foreach( $elements as $element ){
+                    $this->setVariable($element, $variables[$name]);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+
+
     /**
      * @param string $name
      *
-- 
GitLab