From aaba4b823bb46424cccd43fb2a9f68022eb0d3e6 Mon Sep 17 00:00:00 2001 From: Lamrani Abdel Date: Fri, 15 Dec 2023 18:17:51 +0100 Subject: [PATCH] add function for copy file when detected changes --- htdocs/website/class/website.class.php | 163 +++++++++++++++++++++---- htdocs/website/index.php | 4 +- 2 files changed, 141 insertions(+), 26 deletions(-) diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index edc5d9e9c95..a4a839acade 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -1182,7 +1182,6 @@ class Website extends CommonObject $error = 0; $pathtofile = dol_sanitizePathName($pathtofile); - $object = $this; if (empty($object->ref)) { $this->error = 'Function importWebSite called on object not loaded (object->ref is empty)'; @@ -1625,35 +1624,83 @@ class Website extends CommonObject return false; } - $pathToInstallDir = DOL_DOCUMENT_ROOT . '/install/doctemplates/websites/'.urlencode($website->name_template); + if (!is_writable($conf->website->dir_output)) { + setEventMessages("Temporary dir ".$conf->website->dir_output." is not writable", null, 'errors'); + return ''; + } - //check if can write in - if (!is_writable($pathToInstallDir)) { - if (is_readable($pathToInstallDir)) { - $files = scandir($pathToInstallDir); - $x =''; - foreach ($files as $file) { - $x .= $file . "\n"; + $sourcedir = $conf->website->dir_output."/".$website->ref; + + $destdir = DOL_DOCUMENT_ROOT . '/install/doctemplates/websites/'.$website->name_template; + + // Copier le fichier zip dans le dossier de destination + + if (is_dir($destdir) && is_dir($sourcedir)) { + $arraydestdir = dol_dir_list($destdir, "all", 0, '', '', 'name', SORT_ASC); + $arraysourcedir = dol_dir_list($sourcedir, "all", 1, '', '', 'name', SORT_ASC); + } + $destinationFileNames = array_column($arraydestdir, 'name'); + // var_dump($arraysourcedir);exit; + foreach ($arraysourcedir as $sourceFile) { + if ($this->extractNumberFromFilename($sourceFile['fullname']) > 1) { + if (!preg_match('/\.old$/', $sourceFile['name'])) { + $arraySource[] = $sourceFile['fullname']; + } + } + } + // for extract pages in destination folder + foreach ($arraydestdir as $destFile) { + if ($destFile['name'] == 'containers') { + $containersDir = dol_dir_list($destFile['fullname']); + + foreach ($containersDir as $file) { + $extractPageFromDestDir = $this->extractNumberFromFilename($file['fullname']); + if ($extractPageFromDestDir > 1) { + $arrayDest[] = $file['fullname']; + } } - } else { - setEventMessages("Install dir ".$pathToInstallDir." is not readable", null, 'errors'); - return false; } } - $srcdir = $conf->website->dir_output.'/'.$website->ref; - $destdir = $conf->install->dir_templates; + $minCount = min(count($arraySource), count($arrayDest)); + for ($i = 0; $i < $minCount; $i++) { + $sourceFilePath = $arraySource[$i]; + $destFilePath = $arrayDest[$i]; - dol_syslog("Copy templates from ".$srcdir." into ".$destdir); - $result = dolCopyDir($srcdir, $destdir, 0, 1); + $sourceContent = file_get_contents($sourceFilePath); + if ($sourceContent === false) { + echo "Erreur lors de la lecture du fichier source: " . basename($sourceFilePath) . "\n"; + } else { + $destContent = file_get_contents($destFilePath); + if ($destContent === false) { + echo "Erreur lors de la lecture du fichier de destination: " . basename($destFilePath) . "\n"; + } else { + if ($sourceContent !== $destContent) { + $numPage = $this->extractNumberFromFilename($sourceFilePath); - if ($result < 0) { - setEventMessages("Failed to copy templates", null, 'errors'); - var_dump(2); + $differences = $this->showDifferences($sourceContent, $destContent, $numPage); + + //var_dump($differences); + //var_dump($arrayreplacement); + // Les contenus sont différents, effectuer la copie + + if (file_put_contents($destFilePath, $sourceContent) === false) { + echo "Échec de la copie du fichier: " . basename($sourceFilePath) . "\n"; + } else { + if (count($differences) > 0) { + $result = dolReplaceInFile($destFilePath, $differences); + if ($result > 0) { + echo 'rename with correct number page'; + } + echo "Fichier copié avec succès: " . basename($sourceFilePath) . "\n"; + } + } + } else { + echo "Aucune modification détectée, copie non nécessaire pour: " . basename($sourceFilePath) . "\n"; + } + } + } } - - setEventMessages("Templates successfully overwritten", null, 'messages'); - return true; } /** @@ -1667,7 +1714,7 @@ class Website extends CommonObject $sql .= " name_template = '".$this->db->escape($name_template)."'"; $sql .= " WHERE rowid = ".(int) $this->id; $result = $this->db->query($sql); - //print_r($sql);exit; + if ($result) { $this->db->commit(); return 1; @@ -1676,4 +1723,74 @@ class Website extends CommonObject return -1; } } + + /** + * extract num of page + * @param string $filename name of file + * @return int 1 if OK, -1 if KO + */ + protected function extractNumberFromFilename($filename) + { + $matches = []; + if (preg_match('/page(\d+)\.tpl\.php/', $filename, $matches)) { + return (int) $matches[1]; + } + return -1; + } + + /** + * remove espace in string + * @param string $str string + * @return string + */ + protected function normalizeString($str) + { + + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + + $lines = explode("\n", $str); + $lines = array_map('trim', $lines); + + return implode("\n", $lines); + } + + /** + * show difference between to string + * @param string $str1 first string + * @param string $str2 seconde string + * @param string $exceptNumPge num of page file + * @return array|int -1 if KO, array if OK + */ + protected function showDifferences($str1, $str2, $exceptNumPge = '0') + { + $diff = []; + $str1 = $this->normalizeString($str1); + $str2 = $this->normalizeString($str2); + + $lines1 = explode("\n", $str1); + $lines2 = explode("\n", $str2); + + foreach ($lines1 as $lineNum => $lineContent) { + if (isset($lines2[$lineNum])) { + if ($lineContent !== $lines2[$lineNum]) { + $diff[$lines2[$lineNum]] = $lineContent; + } + } else { + $diff['new'] = "line " . ($lineNum + 1) . ": " . $lineContent; + } + } + foreach ($lines2 as $lineNum => $lineContent) { + if (!isset($lines1[$lineNum])) { + $diff[] = "Supplémentaire dans la destination à la ligne " . ($lineNum + 1) . ": " . $lineContent; + } + } + // search if except exist in array + foreach ($diff as $key => $line) { + if (str_contains($line, $exceptNumPge)) { + $lineNochange[$line] = $key; + } + } + return $lineNochange; + } } diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 5a65a52f4c5..0fb360f0755 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2399,12 +2399,11 @@ if ($usercanedit && (($action == 'updatesource' || $action == 'updatecontent' || } // Export site -if ($action == 'exportsite' && $user->hasRight('website', 'export')) { +if ($action == 'exportsite') { $fileofzip = $object->exportWebSite(); if ($fileofzip) { $file_name = basename($fileofzip); - header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=".$file_name); header("Content-Length: ".filesize($fileofzip)); @@ -2420,7 +2419,6 @@ if ($action == 'exportsite' && $user->hasRight('website', 'export')) { // Overite site if ($action == 'overwitesite' && $user->hasRight('website', 'export')) { $fileofzip = $object->overwriteTemplate(); - var_dump($fileofzip); } // Regenerate site if ($action == 'regeneratesite' && $usercanedit) {