add function for copy file when detected changes

This commit is contained in:
Lamrani Abdel 2023-12-15 18:17:51 +01:00
parent 34e451ded6
commit aaba4b823b
2 changed files with 141 additions and 26 deletions

View file

@ -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;
}
}

View file

@ -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) {