La fonction permettant de sauvegarder les données ne fonctionne pas si on coche la case "Sauvegarder seulement la base de données (pas les fichiers associés : images, documents annexes...)".
J'ai résolu le problème en modifiant la méthode backupAction() du fichier /lodel/scripts/logic/class.data.php. Ligne 292, la variable $files_and_names est indéfinie (et donc vide) si on exporte que la base : elle n'est définie plus haut (lignes 262 à 289) que pour le cas de figure où on exporte la base + les fichiers associés.
Voici la méthode modifiée :
public function backupAction(&$context, &$error)
{
if(!C::get('adminlodel', 'lodeluser')) trigger_error("ERROR: you don't have the right to access this feature", E_USER_ERROR);
$context['importdir'] = C::get('importdir', 'cfg');
if (isset($context['backup'])) { // si on a demandé le backup
set_time_limit(0);
$site = C::get('site', 'cfg');
$outfile = "site-$site.sql";
$GLOBALS['tmpdir'] = $tmpdir = tmpdir(uniqid('sitebackup'));
$errors = array();
/* On fait le dump de la base de données */
$this->_dump($site, $tmpdir . DIRECTORY_SEPARATOR. $outfile, $errors);
if($errors) {
$error = $errors;
return 'backup';
}
// verifie que le fichier SQL n'est pas vide
if (!file_exists($tmpdir. DIRECTORY_SEPARATOR . $outfile) || filesize($tmpdir. DIRECTORY_SEPARATOR . $outfile) <= 0) {
$error['mysql'] = 'dump_failed';
return 'backup';
}
// zip le site et ajoute la base
$archivetmp = tempnam($tmpdir, 'lodeldump_'). '.zip';
$archivefilename = "site-$site-". date("dmy"). '.zip';
// // fichiers à exclure de l'archive
// $GLOBALS['excludes'] = $excludes = array(
// '#\.htaccess$#',
// '#index.html$#',
// '#^docannexe/image/tmpdir-.*$#',
// '#^docannexe/tmp.*$#'
// );
//
// // répertoires à inclure
// $sitedirs = array(
// 'lodel/icons',
// 'lodel/sources',
// 'docannexe/fichier',
// 'docannexe/file',
// 'docannexe/image',
// );
//
// // si sauvegarde des répertoires demandée (en + de la base)
//
// $files_to_zip = array();
//
// if (empty($context['sqlonly'])) {
// /* On créé la liste des fichiers à sauvegarder */
// $siteroot = realpath(SITEROOT) . DIRECTORY_SEPARATOR;
//
// foreach($sitedirs as $sitedir)
// {
// $files_to_zip = array_merge(
// $files_to_zip,
// array_filter(glob_recursive( $siteroot . $sitedir . DIRECTORY_SEPARATOR . "*"), 'is_file')
// );
// }
//
// /* Suppression des fichier à exclure */
// foreach($excludes as $exclude)
// {
// $files_to_zip = preg_grep($exclude, $files_to_zip, PREG_GREP_INVERT);
// }
//
// /* On définit les chemin dans le zip et dans le filesystem */
// $files_and_names = array(
// $tmpdir. DIRECTORY_SEPARATOR . $outfile => $outfile,
// );
// foreach($files_to_zip as $file)
// {
// $files_and_names[$file] = str_replace($siteroot, '', $file);
// }
// unset($files_to_zip);
// }
$files_and_names = array(
$tmpdir. DIRECTORY_SEPARATOR . $outfile => $outfile,
);
// si sauvegarde des répertoires demandée (en + de la base)
if (empty($context['sqlonly'])) {
// fichiers à exclure de l'archive
$GLOBALS['excludes'] = $excludes = array(
'#\.htaccess$#',
'#index.html$#',
'#^docannexe/image/tmpdir-.*$#',
'#^docannexe/tmp.*$#'
);
// répertoires à inclure
$sitedirs = array(
'lodel/icons',
'lodel/sources',
'docannexe/fichier',
'docannexe/file',
'docannexe/image',
);
$files_to_zip = array();
/* On créé la liste des fichiers à sauvegarder */
$siteroot = realpath(SITEROOT) . DIRECTORY_SEPARATOR;
foreach($sitedirs as $sitedir)
{
$files_to_zip = array_merge(
$files_to_zip,
array_filter(glob_recursive( $siteroot . $sitedir . DIRECTORY_SEPARATOR . "*"), 'is_file')
);
}
/* Suppression des fichier à exclure */
foreach($excludes as $exclude)
{
$files_to_zip = preg_grep($exclude, $files_to_zip, PREG_GREP_INVERT);
}
/* On définit les chemin dans le zip et dans le filesystem */
foreach($files_to_zip as $file)
{
$files_and_names[$file] = str_replace($siteroot, '', $file);
}
unset($files_to_zip);
}
/* On créé le zip dans $archivetmp */
$ok = create_zip_from_file_list($archivetmp, $files_and_names);
@unlink($tmpdir. DIRECTORY_SEPARATOR . $outfile);
if (!file_exists($archivetmp) || true !== $ok) {
trigger_error("ERROR: the zip command reported an error: «{$ok}».\nArchive: $archivetmp", E_USER_ERROR);
}
if($error) { // Pour avoir accès aux erreurs dans les templates
$context['error'] = $error;
}
if (operation($context['operation'], $archivetmp, $archivefilename, $context)) {
$context['success'] = 1;
return 'backup';
}
else {
$context['success'] = 1;
return 'backup';
}
return 'backup';
}
else {
return 'backup';
}
}
Est-il possible de corriger le code sur la branche master ?
Bonjour,
La fonction permettant de sauvegarder les données ne fonctionne pas si on coche la case "Sauvegarder seulement la base de données (pas les fichiers associés : images, documents annexes...)".
J'ai résolu le problème en modifiant la méthode backupAction() du fichier /lodel/scripts/logic/class.data.php. Ligne 292, la variable $files_and_names est indéfinie (et donc vide) si on exporte que la base : elle n'est définie plus haut (lignes 262 à 289) que pour le cas de figure où on exporte la base + les fichiers associés.
Voici la méthode modifiée :
Est-il possible de corriger le code sur la branche master ?
Cordialement.