Skip to content
Snippets Groups Projects
Commit a5caafa7 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Gestion des sections avec :

- Possibilité de les dupliquer comme autant de blocs
- Possibilité de les cacher le cas échéant
parent 1b043a74
No related branches found
No related tags found
No related merge requests found
...@@ -5,6 +5,8 @@ namespace Unicaen\OpenDocument; ...@@ -5,6 +5,8 @@ namespace Unicaen\OpenDocument;
use Exception; use Exception;
use DOMDocument; use DOMDocument;
use DOMElement; use DOMElement;
use DOMNode;
use DOMNodeList;
use ZipArchive; use ZipArchive;
class Publisher class Publisher
...@@ -135,33 +137,6 @@ class Publisher ...@@ -135,33 +137,6 @@ class Publisher
/**
* Crée un sous-document à parcourir ensuite
*
* @param string $node_name
* @param string $variable_name
*
* @return Query
*/
public function subDoc($nodeName, $variableName)
{
return $this->query->subDoc($nodeName, $variableName);
}
/**
* Cache une section
*
* @param string $sectionName
*/
public function hideSection($sectionName)
{
$this->query->hideSection($sectionName);
}
/** /**
* @param DOMElement $element * @param DOMElement $element
* *
...@@ -186,6 +161,33 @@ class Publisher ...@@ -186,6 +161,33 @@ class Publisher
public function getSections(DOMElement $element): array
{
$textNs = $this->getDocument()->getNamespaceUrl('text');
$sections = [];
$vElements = $this->findFrom($element, 'text:section');
foreach ($vElements as $vElement) {
$name = $vElement->getAttributeNS($textNs, 'name');
if (!isset($sections[$name])) $sections[$name] = [];
$sections[$name][] = $vElement;
}
return $sections;
}
public function hideSection(DOMElement $section): Publisher
{
$section->parentNode->removeChild($section);
return $this;
}
/** /**
* @param DOMElement $element * @param DOMElement $element
* @param string $value * @param string $value
...@@ -248,9 +250,6 @@ class Publisher ...@@ -248,9 +250,6 @@ class Publisher
$pageBreak->setAttributeNS($textNs, 'text:style-name', self::PAGE_BREAK_NAME); $pageBreak->setAttributeNS($textNs, 'text:style-name', self::PAGE_BREAK_NAME);
$element->insertBefore($pageBreak, $element->firstChild); $element->insertBefore($pageBreak, $element->firstChild);
/*$pageBreak = "<text:p text:style-name=\"".self::PAGE_BREAK_NAME."\"></text:p>";
$xml = str_replace('<office:text>','<office:text>'.$pageBreak, $xml);*/
return $this; return $this;
} }
...@@ -314,6 +313,7 @@ class Publisher ...@@ -314,6 +313,7 @@ class Publisher
private function publishValues(DOMElement $element, array $values): Publisher private function publishValues(DOMElement $element, array $values): Publisher
{ {
$variables = $this->getVariables($element); $variables = $this->getVariables($element);
$sections = $this->getSections($element);
foreach ($values as $name => $val) { foreach ($values as $name => $val) {
if (is_array($val)) { if (is_array($val)) {
...@@ -324,11 +324,35 @@ class Publisher ...@@ -324,11 +324,35 @@ class Publisher
$this->publishSubData($elVar, $vparent, $val); $this->publishSubData($elVar, $vparent, $val);
} }
} }
} elseif (isset($variables[$name])) { if (isset($sections[$vname])) {
foreach ($sections[$vname] as $elSec) {
$this->publishSubData($elSec, $vparent, $val);
}
}
} else {
if (isset($variables[$name])) {
foreach ($variables[$name] as $vElement) { foreach ($variables[$name] as $vElement) {
$this->setVariable($vElement, $val); $this->setVariable($vElement, $val);
} }
} }
list($sName, $sType) = explode("@", $name);
if ($sType == 'text:section') {
$name = $sName;
}
if (isset($sections[$name])) {
foreach ($sections[$name] as $sElement) {
if ($val === null
|| $val === 0
|| $val === '0'
|| $val === false
|| $val === ''
|| strtolower($val) === 'false'
) {
$this->hideSection($sElement);
}
}
}
}
} }
return $this; return $this;
...@@ -345,6 +369,9 @@ class Publisher ...@@ -345,6 +369,9 @@ class Publisher
*/ */
private function publishSubData(DOMElement $element, string $parent, array $values): Publisher private function publishSubData(DOMElement $element, string $parent, array $values): Publisher
{ {
if ($element->tagName == 'text:section') {
$parentNode = $element; // C'est la section qui est dupliquée
} else {
$i = 10; $i = 10;
$found = false; $found = false;
for ($i = 0; $i < 10; $i++) { for ($i = 0; $i < 10; $i++) {
...@@ -358,6 +385,7 @@ class Publisher ...@@ -358,6 +385,7 @@ class Publisher
if (!$found) { if (!$found) {
throw new \Exception('Le noeud parent de type ' . $parent . ' n\'a pas été trouvé'); throw new \Exception('Le noeud parent de type ' . $parent . ' n\'a pas été trouvé');
} }
}
foreach ($values as $vals) { foreach ($values as $vals) {
$clone = $parentNode->cloneNode(true); $clone = $parentNode->cloneNode(true);
...@@ -410,6 +438,50 @@ class Publisher ...@@ -410,6 +438,50 @@ class Publisher
/**
* @param string $name
*
* @return DOMNode[]
* @throws Exception
*/
private function find(string $name): DOMNodeList
{
$document = $this->getDocument();
return $document->find($document->getContent(), $name);
}
/**
* @param DOMNode $node
* @param $name
*
* @return DOMNodeList
* @throws Exception
*/
private function findFrom(DOMNode $node, $name): DOMNodeList
{
return $this->getDocument()->find($node, $name);
}
/**
* @param string $name
* @param array $attrs
*
* @return DOMElement
*/
private function newElement(string $name, array $attrs = []): DOMElement
{
$document = $this->getDocument();
return $document->newElement($document->getContent(), $name, $attrs);
}
/** /**
* Ajoute du contenu au fichier content.xml * Ajoute du contenu au fichier content.xml
* Méthode à ne pas exploiter * Méthode à ne pas exploiter
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment