From fbc28795bc2bc84166448682ca1011870e5a289f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 12:51:37 +0200 Subject: [PATCH 01/26] Debug sitemap generation --- htdocs/website/index.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 93a2aebc346..7075bd770c9 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2251,6 +2251,7 @@ $tempdir = $conf->website->dir_output.'/'.$websitekey.'/'; if ($action == 'generatesitemaps' && $usercanedit) { $domtree = new DOMDocument('1.0', 'UTF-8'); $root = $domtree->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset'); + $domtree->createAttributeNS("http://www.w3.org/1999/xhtml", 'xmlns:xhtml'); $domtree->formatOutput = true; $xmlname = 'sitemap.'.$websitekey.'.xml'; @@ -2258,6 +2259,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w"; $sql .= " WHERE wp.type_container IN ('page', 'blogpost')"; $sql .= " AND wp.fk_website = w.rowid"; + $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')"; $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'"; $resql = $db->query($sql); if ($resql) { @@ -2274,7 +2276,12 @@ if ($action == 'generatesitemaps' && $usercanedit) { if ($objp->virtualhost) { $domainname = $objp->virtualhost; } - $loc = $domtree->createElement('loc', 'http://'.$domainname.'/'.$pageurl); + if (! preg_match('/^http/i', $domainname)) { + $domainname .= 'https://'.$domainname; + } + //$pathofpage = $dolibarr_main_url_root.'/'.$pageurl.'.php'; + + $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl.'.php'); $lastmod = $domtree->createElement('lastmod', $db->jdate($objp->tms)); $url->appendChild($loc); @@ -2295,6 +2302,8 @@ if ($action == 'generatesitemaps' && $usercanedit) { } else { dol_print_error($db); } + + // Add the entry Sitemap: into the robot file. $robotcontent = @file_get_contents($filerobot); $result = preg_replace('/\n/ims', '', $robotcontent); if ($result) { From 3502c4c269a9dad909c33d0170173e156028c9e6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 13:45:46 +0200 Subject: [PATCH 02/26] Debug sitemap generation --- htdocs/core/lib/website2.lib.php | 10 ++-- htdocs/website/index.php | 95 ++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 9 deletions(-) diff --git a/htdocs/core/lib/website2.lib.php b/htdocs/core/lib/website2.lib.php index 6510d5fff8d..8824d9cc06d 100644 --- a/htdocs/core/lib/website2.lib.php +++ b/htdocs/core/lib/website2.lib.php @@ -203,10 +203,6 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } // Add translation reference (main language) if ($object->isMultiLang()) { - // Add myself - $tplcontent .= 'fk_default_home == $objectpage->id) ? '/' : (($shortlangcode != substr($object->lang, 0, 2)) ? '/'.$shortlangcode : '')).'/'.$objectpage->pageurl.'.php") { ?>'."\n"; - $tplcontent .= ''."\n"; - // Add page "translation of" $translationof = $objectpage->fk_page; if ($translationof) { @@ -225,6 +221,7 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } } } + // Add "has translation pages" $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page where fk_page IN ('.$db->sanitize($objectpage->id.($translationof ? ', '.$translationof : '')).")"; $resql = $db->query($sql); @@ -244,6 +241,11 @@ function dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, } else { dol_print_error($db); } + + // Add myself + $tplcontent .= 'fk_default_home == $objectpage->id) ? '/' : (($shortlangcode != substr($object->lang, 0, 2)) ? '/'.$shortlangcode : '')).'/'.$objectpage->pageurl.'.php") { ?>'."\n"; + $tplcontent .= ''."\n"; + $tplcontent .= ''."\n"; } // Add manifest.json. Do we have to add it only on home page ? diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 7075bd770c9..510f9b278dc 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2250,12 +2250,16 @@ $tempdir = $conf->website->dir_output.'/'.$websitekey.'/'; // Generate web site sitemaps if ($action == 'generatesitemaps' && $usercanedit) { $domtree = new DOMDocument('1.0', 'UTF-8'); + $root = $domtree->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset'); - $domtree->createAttributeNS("http://www.w3.org/1999/xhtml", 'xmlns:xhtml'); + $root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); + $domtree->formatOutput = true; + $xmlname = 'sitemap.'.$websitekey.'.xml'; - $sql = "SELECT wp.type_container , wp.pageurl, wp.lang, wp.tms as tms, w.virtualhost"; + $sql = "SELECT wp.rowid, wp.type_container , wp.pageurl, wp.lang, wp.fk_page, wp.tms as tms,"; + $sql .= " w.virtualhost, w.fk_default_home"; $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w"; $sql .= " WHERE wp.type_container IN ('page', 'blogpost')"; $sql .= " AND wp.fk_website = w.rowid"; @@ -2269,10 +2273,25 @@ if ($action == 'generatesitemaps' && $usercanedit) { while ($i < $num_rows) { $objp = $db->fetch_object($resql); $url = $domtree->createElement('url'); - $pageurl = $objp->pageurl; + + $shortlangcode = ''; if ($objp->lang) { - $pageurl = $objp->lang.'/'.$pageurl; + $shortlangcode = substr($objp->lang, 0, 2); // en_US or en-US -> en } + if (empty($shortlangcode)) { + $shortlangcode = substr($object->lang, 0, 2); // en_US or en-US -> en + } + + // Forge $pageurl, adding language prefix if it is an alternative language + $pageurl = $objp->pageurl; + if ($objp->fk_default_home == $objp->rowid) { + $pageurl = ''; + } else { + if ($shortlangcode != substr($object->lang, 0, 2)) { + $pageurl = $shortlangcode.'/'.$pageurl.'.php'; + } + } + if ($objp->virtualhost) { $domainname = $objp->virtualhost; } @@ -2281,11 +2300,77 @@ if ($action == 'generatesitemaps' && $usercanedit) { } //$pathofpage = $dolibarr_main_url_root.'/'.$pageurl.'.php'; - $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl.'.php'); + // URL of sitemaps must end with trailing slash if page is '' + $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl); $lastmod = $domtree->createElement('lastmod', $db->jdate($objp->tms)); + $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values + $priority = $domtree->createElement('priority', '1'); $url->appendChild($loc); $url->appendChild($lastmod); + // Add suggested frequency for refresh + if (!empty($conf->global->WEBSITE_SITEMAPS_ADD_WEEKLY_FREQ)) { + $url->appendChild($changefreq); + } + // Add higher priority for home page + if ($objp->fk_default_home == $objp->rowid) { + $url->appendChild($priority); + } + + // Now add alternate language entries + if ($object->isMultiLang()) { + // Add page "translation of" + $translationof = $objp->fk_page; + if ($translationof) { + $tmppage = new WebsitePage($db); + $tmppage->fetch($translationof); + if ($tmppage->id > 0) { + $tmpshortlangcode = ''; + if ($tmppage->lang) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $tmppage->lang); // en_US or en-US -> en + } + if (empty($tmpshortlangcode)) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $object->lang); // en_US or en-US -> en + } + if ($tmpshortlangcode != $shortlangcode) { + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + } + } + + // Add "has translation pages" + $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page where fk_page IN ('.$db->sanitize($objp->rowid.($translationof ? ', '.$translationof : '')).")"; + $resql = $db->query($sql); + if ($resql) { + $num_rows = $db->num_rows($resql); + if ($num_rows > 0) { + while ($objhastrans = $db->fetch_object($resql)) { + $tmpshortlangcode = ''; + if ($objhastrans->lang) { + $tmpshortlangcode = preg_replace('/[_-].*$/', '', $objhastrans->lang); // en_US or en-US -> en + } + if ($tmpshortlangcode != $shortlangcode) { + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + } + } + } else { + dol_print_error($db); + } + + // Add myself + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("hreflang", "'.$shortlang.'"); + $xhtmllink->setAttribute("href", "'.$pageurl.'"); + } + $root->appendChild($url); $i++; } From 54c90059ff56cbc1cfedf98f68b56600bdfe7e09 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:11:22 +0200 Subject: [PATCH 03/26] Fix sitemaps --- htdocs/website/index.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 510f9b278dc..3e705ad33d0 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2337,17 +2337,18 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink->setAttribute("rel", "alternante"); $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $url->appendChild($xhtmllink); } } } // Add "has translation pages" $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page where fk_page IN ('.$db->sanitize($objp->rowid.($translationof ? ', '.$translationof : '')).")"; - $resql = $db->query($sql); - if ($resql) { - $num_rows = $db->num_rows($resql); - if ($num_rows > 0) { - while ($objhastrans = $db->fetch_object($resql)) { + $resqlhastrans = $db->query($sql); + if ($resqlhastrans) { + $num_rows_hastrans = $db->num_rows($resqlhastrans); + if ($num_rows_hastrans > 0) { + while ($objhastrans = $db->fetch_object($resqlhastrans)) { $tmpshortlangcode = ''; if ($objhastrans->lang) { $tmpshortlangcode = preg_replace('/[_-].*$/', '', $objhastrans->lang); // en_US or en-US -> en @@ -2357,6 +2358,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink->setAttribute("rel", "alternante"); $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $url->appendChild($xhtmllink); } } } @@ -2369,6 +2371,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink->setAttribute("rel", "alternante"); $xhtmllink->setAttribute("hreflang", "'.$shortlang.'"); $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $url->appendChild($xhtmllink); } $root->appendChild($url); From ae595d85451284ea623cee37f82bfeeb741156ab Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:18:05 +0200 Subject: [PATCH 04/26] Fix sitemap --- htdocs/website/index.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 3e705ad33d0..0c59d582872 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2335,8 +2335,8 @@ if ($action == 'generatesitemaps' && $usercanedit) { if ($tmpshortlangcode != $shortlangcode) { $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternante"); - $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); - $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); + $xhtmllink->setAttribute("href", $domainname.'/'.$tmppage->pageurl); $url->appendChild($xhtmllink); } } @@ -2356,8 +2356,8 @@ if ($action == 'generatesitemaps' && $usercanedit) { if ($tmpshortlangcode != $shortlangcode) { $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternante"); - $xhtmllink->setAttribute("hreflang", "'.$tmpshortlangcode.'"); - $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); + $xhtmllink->setAttribute("href", $domainname.'/'.$objhastrans->pageurl); $url->appendChild($xhtmllink); } } @@ -2369,8 +2369,8 @@ if ($action == 'generatesitemaps' && $usercanedit) { // Add myself $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternante"); - $xhtmllink->setAttribute("hreflang", "'.$shortlang.'"); - $xhtmllink->setAttribute("href", "'.$pageurl.'"); + $xhtmllink->setAttribute("hreflang", $shortlang); + $xhtmllink->setAttribute("href", $domainname.'/'.$pageurl); $url->appendChild($xhtmllink); } From ecadc03b7525c194c633486a64e60bd77b77c7a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:32:17 +0200 Subject: [PATCH 05/26] Fix sitemaps for multilang --- htdocs/website/index.php | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 0c59d582872..7001e6d0499 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2283,12 +2283,12 @@ if ($action == 'generatesitemaps' && $usercanedit) { } // Forge $pageurl, adding language prefix if it is an alternative language - $pageurl = $objp->pageurl; + $pageurl = $objp->pageurl.'.php'; if ($objp->fk_default_home == $objp->rowid) { $pageurl = ''; } else { if ($shortlangcode != substr($object->lang, 0, 2)) { - $pageurl = $shortlangcode.'/'.$pageurl.'.php'; + $pageurl = $shortlangcode.'/'.$pageurl; } } @@ -2319,6 +2319,8 @@ if ($action == 'generatesitemaps' && $usercanedit) { // Now add alternate language entries if ($object->isMultiLang()) { + $alternatefound = 0; + // Add page "translation of" $translationof = $objp->fk_page; if ($translationof) { @@ -2336,8 +2338,10 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternante"); $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); - $xhtmllink->setAttribute("href", $domainname.'/'.$tmppage->pageurl); + $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $tmppage->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2)) ? '/'.$tmpshortlangcode : '').'/'.$tmppage->pageurl.'.php'); $url->appendChild($xhtmllink); + + $alternatefound++; } } } @@ -2355,10 +2359,12 @@ if ($action == 'generatesitemaps' && $usercanedit) { } if ($tmpshortlangcode != $shortlangcode) { $xhtmllink = $domtree->createElement('xhtml:link', ''); - $xhtmllink->setAttribute("rel", "alternante"); + $xhtmllink->setAttribute("rel", "alternate"); $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); - $xhtmllink->setAttribute("href", $domainname.'/'.$objhastrans->pageurl); + $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $objhastrans->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2) ? '/'.$tmpshortlangcode : '')).'/'.$objhastrans->pageurl.'.php'); $url->appendChild($xhtmllink); + + $alternatefound++; } } } @@ -2366,12 +2372,14 @@ if ($action == 'generatesitemaps' && $usercanedit) { dol_print_error($db); } - // Add myself - $xhtmllink = $domtree->createElement('xhtml:link', ''); - $xhtmllink->setAttribute("rel", "alternante"); - $xhtmllink->setAttribute("hreflang", $shortlang); - $xhtmllink->setAttribute("href", $domainname.'/'.$pageurl); - $url->appendChild($xhtmllink); + if ($alternatefound) { + // Add myself + $xhtmllink = $domtree->createElement('xhtml:link', ''); + $xhtmllink->setAttribute("rel", "alternate"); + $xhtmllink->setAttribute("hreflang", $shortlangcode); + $xhtmllink->setAttribute("href", $domainname.'/'.$pageurl); + $url->appendChild($xhtmllink); + } } $root->appendChild($url); From 20fb70d493fffbdd6a66fd063fbed26cdd1b1980 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:34:08 +0200 Subject: [PATCH 06/26] Fix syntax error --- htdocs/website/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 7001e6d0499..0385c4d7c57 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2338,7 +2338,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternante"); $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); - $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $tmppage->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2)) ? '/'.$tmpshortlangcode : '').'/'.$tmppage->pageurl.'.php'); + $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $tmppage->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2)) ? '/'.$tmpshortlangcode : '').'/'.$tmppage->pageurl.'.php')); $url->appendChild($xhtmllink); $alternatefound++; @@ -2361,7 +2361,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $xhtmllink = $domtree->createElement('xhtml:link', ''); $xhtmllink->setAttribute("rel", "alternate"); $xhtmllink->setAttribute("hreflang", $tmpshortlangcode); - $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $objhastrans->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2) ? '/'.$tmpshortlangcode : '')).'/'.$objhastrans->pageurl.'.php'); + $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $objhastrans->id ? '/' : (($tmpshortlangcode != substr($objp->lang, 0, 2) ? '/'.$tmpshortlangcode : '')).'/'.$objhastrans->pageurl.'.php')); $url->appendChild($xhtmllink); $alternatefound++; From 08deb3c0e9a721e81858597ee8716764476f1674 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:41:05 +0200 Subject: [PATCH 07/26] Fix selection of files to report into sitemap --- htdocs/website/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 0385c4d7c57..10f6dc8c041 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2263,6 +2263,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w"; $sql .= " WHERE wp.type_container IN ('page', 'blogpost')"; $sql .= " AND wp.fk_website = w.rowid"; + $sql .= " AND status = ".WebsitePage::STATUS_VALIDATED; $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')"; $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'"; $resql = $db->query($sql); From 038b005e6a87cfede323e0a6b2b86a6208947bfb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:44:33 +0200 Subject: [PATCH 08/26] Fix sql error --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 10f6dc8c041..5b8495a6091 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2263,7 +2263,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w"; $sql .= " WHERE wp.type_container IN ('page', 'blogpost')"; $sql .= " AND wp.fk_website = w.rowid"; - $sql .= " AND status = ".WebsitePage::STATUS_VALIDATED; + $sql .= " AND wp.status = ".WebsitePage::STATUS_VALIDATED; $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')"; $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'"; $resql = $db->query($sql); From fd3f2f4e27ca4d808c7560affa695962bd06c039 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:46:14 +0200 Subject: [PATCH 09/26] Set order in sitemap --- htdocs/website/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 5b8495a6091..1512ae038cd 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2266,6 +2266,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $sql .= " AND wp.status = ".WebsitePage::STATUS_VALIDATED; $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')"; $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'"; + $sql .= " ORDER BY wp.fk_default_home DESC, wp.rowid DESC"; $resql = $db->query($sql); if ($resql) { $num_rows = $db->num_rows($resql); From 8067e1d70ad8ae6dea249a03fd7c3a141236ffd5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 14:48:38 +0200 Subject: [PATCH 10/26] Fix order --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 1512ae038cd..2df1c6151a3 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2266,7 +2266,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { $sql .= " AND wp.status = ".WebsitePage::STATUS_VALIDATED; $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')"; $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'"; - $sql .= " ORDER BY wp.fk_default_home DESC, wp.rowid DESC"; + $sql .= " ORDER BY wp.tms DESC, wp.rowid DESC"; $resql = $db->query($sql); if ($resql) { $num_rows = $db->num_rows($resql); From 03f7ec13cff96458d6378c21a9a996ed2c2de7fb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 15:00:23 +0200 Subject: [PATCH 11/26] Can sort on language on list of website pages --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 2df1c6151a3..ce6990ab29f 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -4220,7 +4220,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction = print getTitleFieldOfList("Type", 0, $_SERVER['PHP_SELF'], 'type_container', '', $param, '', $sortfield, $sortorder, '')."\n"; print getTitleFieldOfList("Page", 0, $_SERVER['PHP_SELF'], 'pageurl', '', $param, '', $sortfield, $sortorder, '')."\n"; print getTitleFieldOfList("Categories", 0, $_SERVER['PHP_SELF']); - print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']); + print getTitleFieldOfList("Language", 0, $_SERVER['PHP_SELF'], 'lang', '', $param, '', $sortfield, $sortorder, '')."\n"; print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']); print getTitleFieldOfList("DateLastModification", 0, $_SERVER['PHP_SELF'], 'tms', '', $param, '', $sortfield, $sortorder, 'center ')."\n"; // Date last modif print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']); From cad7ea0b920e85cb866f1082720d0d8e3d0abc5d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 15:07:22 +0200 Subject: [PATCH 12/26] css --- htdocs/core/class/translate.class.php | 4 ++-- htdocs/core/lib/functions.lib.php | 2 +- htdocs/website/index.php | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index f06bb32b62b..2a25652761d 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -735,7 +735,7 @@ class Translate * @param string $str string root to translate * @param string $countrycode country code (FR, ...) * @return string translated string - * @see transcountrynoentities() + * @see transcountrynoentities(), picto_from_langcode() */ public function transcountry($str, $countrycode) { @@ -753,7 +753,7 @@ class Translate * @param string $str string root to translate * @param string $countrycode country code (FR, ...) * @return string translated string - * @see transcountry() + * @see transcountry(), picto_from_langcode() */ public function transcountrynoentities($str, $countrycode) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 2b981530834..ce3b89d7805 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -7996,7 +7996,7 @@ function dol_validElement($element) } /** - * Return img flag of country for a language code or country code + * Return img flag of country for a language code or country code. * * @param string $codelang Language code ('en_IN', 'fr_CA', ...) or ISO Country code on 2 characters in uppercase ('IN', 'FR') * @param string $moreatt Add more attribute on img tag (For example 'style="float: right"' or 'class="saturatemedium"') diff --git a/htdocs/website/index.php b/htdocs/website/index.php index ce6990ab29f..b3f46270c46 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -4220,7 +4220,7 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction = print getTitleFieldOfList("Type", 0, $_SERVER['PHP_SELF'], 'type_container', '', $param, '', $sortfield, $sortorder, '')."\n"; print getTitleFieldOfList("Page", 0, $_SERVER['PHP_SELF'], 'pageurl', '', $param, '', $sortfield, $sortorder, '')."\n"; print getTitleFieldOfList("Categories", 0, $_SERVER['PHP_SELF']); - print getTitleFieldOfList("Language", 0, $_SERVER['PHP_SELF'], 'lang', '', $param, '', $sortfield, $sortorder, '')."\n"; + print getTitleFieldOfList("Language", 0, $_SERVER['PHP_SELF'], 'lang', '', $param, '', $sortfield, $sortorder, 'center ')."\n"; print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']); print getTitleFieldOfList("DateLastModification", 0, $_SERVER['PHP_SELF'], 'tms', '', $param, '', $sortfield, $sortorder, 'center ')."\n"; // Date last modif print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']); @@ -4278,8 +4278,8 @@ if ($action == 'replacesite' || $action == 'replacesiteconfirm' || $massaction = $param .= '&searchstring='.urlencode($searchkey); // Language - print ''; - print $answerrecord->lang; + print ''; + print picto_from_langcode($answerrecord->lang, $answerrecord->lang); print ''; // Number of words From 10f1443d4a82976ec8622b68bbdaaba0d5a1de15 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 15:27:45 +0200 Subject: [PATCH 13/26] Debug sitemap generation. Bad format of date --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index b3f46270c46..464a389836d 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2304,7 +2304,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { // URL of sitemaps must end with trailing slash if page is '' $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl); - $lastmod = $domtree->createElement('lastmod', $db->jdate($objp->tms)); + $lastmod = $domtree->createElement('lastmod', dol_print_date($db->jdate($objp->tms), 'dayrfc', 'gmt'); $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values $priority = $domtree->createElement('priority', '1'); From 69aa5553f58f2f28fffca11036bf233394210961 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 15:28:52 +0200 Subject: [PATCH 14/26] Fix syntax error --- htdocs/website/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/website/index.php b/htdocs/website/index.php index 464a389836d..f2ce403ef17 100644 --- a/htdocs/website/index.php +++ b/htdocs/website/index.php @@ -2304,7 +2304,7 @@ if ($action == 'generatesitemaps' && $usercanedit) { // URL of sitemaps must end with trailing slash if page is '' $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl); - $lastmod = $domtree->createElement('lastmod', dol_print_date($db->jdate($objp->tms), 'dayrfc', 'gmt'); + $lastmod = $domtree->createElement('lastmod', dol_print_date($db->jdate($objp->tms), 'dayrfc', 'gmt')); $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values $priority = $domtree->createElement('priority', '1'); From f4fa16797b6b7c28bf45a4c20fee13b0325259f2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 16:00:48 +0200 Subject: [PATCH 15/26] Complete information on tab for files on salary --- htdocs/salaries/document.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/htdocs/salaries/document.php b/htdocs/salaries/document.php index fddb5259da9..4c88cefb8de 100644 --- a/htdocs/salaries/document.php +++ b/htdocs/salaries/document.php @@ -123,8 +123,23 @@ if ($object->id) { print '
'; print ''; - print ''; - print ''; + + print ""; + print ''; + + print ""; + print ''; + + print ''; + + print ''; + + print ''; + print '
'.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
'.$langs->trans("TotalSizeOfAttachedFiles").''.dol_print_size($totalsize, 1, 1).'
' . $langs->trans("DateStartPeriod") . ''; + print dol_print_date($object->datesp, 'day'); + print '
' . $langs->trans("DateEndPeriod") . ''; + print dol_print_date($object->dateep, 'day'); + print '
' . $langs->trans("Amount") . '' . price($object->amount, 0, $langs, 1, -1, -1, $conf->currency) . '
'.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
'.$langs->trans("TotalSizeOfAttachedFiles").''.dol_print_size($totalsize, 1, 1).'
'; print ''; From c4f27cc29f1376d90d0c73bdd1f334ccb8649fd8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 16:43:09 +0200 Subject: [PATCH 16/26] Debug module salary --- htdocs/salaries/card.php | 13 +++++----- htdocs/salaries/class/salary.class.php | 10 ++++++-- htdocs/salaries/list.php | 4 +++ htdocs/user/bank.php | 35 ++++++++++++++++++-------- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/htdocs/salaries/card.php b/htdocs/salaries/card.php index ad28bcca999..5b6134d192d 100755 --- a/htdocs/salaries/card.php +++ b/htdocs/salaries/card.php @@ -213,10 +213,11 @@ if ($action == 'add' && empty($cancel)) { } if (!$error) { + $db->begin(); + $ret = $object->create($user); if ($ret < 0) $error++; if (!empty($auto_create_paiement) && !$error) { - $db->begin(); // Create a line of payments $paiement = new PaymentSalary($db); $paiement->chid = $object->id; @@ -243,15 +244,11 @@ if ($action == 'add' && empty($cancel)) { setEventMessages($paiement->error, null, 'errors'); } } - - if (!$error) { - $db->commit(); - } else { - $db->rollback(); - } } if (empty($error)) { + $db->commit(); + if (GETPOST('saveandnew', 'alpha')) { setEventMessages($langs->trans("RecordSaved"), '', 'mesgs'); header("Location: card.php?action=create&fk_project=" . urlencode($projectid) . "&accountid=" . urlencode($accountid) . '&paymenttype=' . urlencode(GETPOST('paymenttype', 'az09')) . '&datepday=' . GETPOST("datepday", 'int') . '&datepmonth=' . GETPOST("datepmonth", 'int') . '&datepyear=' . GETPOST("datepyear", 'int')); @@ -260,6 +257,8 @@ if ($action == 'add' && empty($cancel)) { header("Location: " . $_SERVER['PHP_SELF'] . '?id=' . $object->id); exit; } + } else { + $db->rollback(); } } diff --git a/htdocs/salaries/class/salary.class.php b/htdocs/salaries/class/salary.class.php index 85ccfc0a1db..94ede5d7a4d 100644 --- a/htdocs/salaries/class/salary.class.php +++ b/htdocs/salaries/class/salary.class.php @@ -498,6 +498,12 @@ class Salary extends CommonObject $label = ''.$langs->trans("Salary").''; $label .= '
'; $label .= ''.$langs->trans('Ref').': '.$this->ref; + if ($this->label) { + $label .= '
'.$langs->trans('Label').': '.$this->label; + } + if ($this->datesp && $this->dateep) { + $label .= '
'.$langs->trans('Period').': '.dol_print_date($this->datesp, 'day').' - '.dol_print_date($this->dateep, 'day'); + } $url = DOL_URL_ROOT.'/salaries/card.php?id='.$this->id; @@ -647,9 +653,9 @@ class Salary extends CommonObject /** * Retourne le libelle du statut d'une facture (brouillon, validee, abandonnee, payee) * - * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto * @param double $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) - * @return string Libelle + * @return string Label */ public function getLibStatut($mode = 0, $alreadypaid = -1) { diff --git a/htdocs/salaries/list.php b/htdocs/salaries/list.php index b35b890b994..382e05e4f0d 100644 --- a/htdocs/salaries/list.php +++ b/htdocs/salaries/list.php @@ -532,6 +532,10 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $salstatic->id = $obj->rowid; $salstatic->ref = $obj->rowid; + $salstatic->label = $obj->label; + $salstatic->paye = $obj->paye; + $salstatic->datesp = $db->jdate($obj->datesp); + $salstatic->dateep = $db->jdate($obj->dateep); // Show here line of result print ''; diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index df5757992f0..356e23a5de0 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -40,6 +40,7 @@ if (!empty($conf->expensereport->enabled)) { require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; } if (!empty($conf->salaries->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php'; require_once DOL_DOCUMENT_ROOT.'/salaries/class/paymentsalary.class.php'; } @@ -354,16 +355,18 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac // Latest payments of salaries if (!empty($conf->salaries->enabled) && - $user->rights->salaries->read && (in_array($object->id, $childids) || $object->id == $user->id) + (($user->rights->salaries->read && (in_array($object->id, $childids) || $object->id == $user->id)) || (!empty($user->rights->salaries->readall))) ) { $payment_salary = new PaymentSalary($db); + $salary = new Salary($db); - $sql = "SELECT ps.rowid, s.datesp, s.dateep, ps.amount"; - $sql .= " FROM ".MAIN_DB_PREFIX."payment_salary as ps"; - $sql .= " INNER JOIN ".MAIN_DB_PREFIX."salary as s ON (s.rowid = ps.fk_salary)"; + $sql = "SELECT s.rowid as sid, s.ref as sref, s.label, s.datesp, s.dateep, s.paye, SUM(ps.amount) as alreadypaid"; + $sql .= " FROM ".MAIN_DB_PREFIX."salary as s"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."payment_salary as ps ON (s.rowid = ps.fk_salary)"; $sql .= " WHERE s.fk_user = ".$object->id; - $sql .= " AND ps.entity = ".$conf->entity; - $sql .= " ORDER BY ps.rowid DESC"; + $sql .= " AND s.entity IN (".getEntity('salary').")"; + $sql .= " GROUP BY s.rowid, s.ref, s.label, s.datesp, s.dateep, s.paye"; + $sql .= " ORDER BY s.dateep DESC"; $resql = $db->query($sql); if ($resql) { @@ -372,7 +375,7 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac print ''; print ''; - print '
'; + print ''; print ''; @@ -380,16 +383,26 @@ if ($action != 'edit' && $action != 'create') { // If not bank account yet, $ac while ($i < $num && $i < $MAXLIST) { $objp = $db->fetch_object($resql); + $payment_salary->id = $objp->rowid; + $payment_salary->ref = $objp->ref; + $payment_salary->datep = $db->jdate($objp->datep); + + $salary->id = $objp->sid; + $salary->ref = $objp->sref ? $objp->sref : $objp->sid; + $salary->label = $objp->label; + $salary->datesp = $db->jdate($objp->datesp); + $salary->dateep = $db->jdate($objp->dateep); + $salary->paye = $objp->paye; + print ''; print ''; print '\n"; print '\n"; - print ''; + //print ''; + print ''; print ''; $i++; From 55f114511cdaa166afe7da2fdd958e298b06821d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 16:56:55 +0200 Subject: [PATCH 17/26] Debug v14 --- htdocs/user/list.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 1eecf26664c..fe05c551945 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -595,7 +595,7 @@ $moreforfilter = ''; // Filter on categories if (!empty($conf->categorie->enabled) && $user->rights->categorie->lire) { $moreforfilter .= '
'; - $moreforfilter .= $langs->trans('Categories').': '; + $moreforfilter .= img_picto($langs->trans("Category"), 'category', 'class="paddingright"'); $moreforfilter .= $formother->select_categories(Categorie::TYPE_USER, $search_categ, 'search_categ', 1); $moreforfilter .= '
'; } @@ -724,7 +724,7 @@ if (!empty($arrayfields['u.gender']['checked'])) { print_liste_field_titre("Gender", $_SERVER['PHP_SELF'], "u.gender", $param, "", "", $sortfield, $sortorder); } if (!empty($arrayfields['u.employee']['checked'])) { - print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.employee", $param, "", "", $sortfield, $sortorder); + print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.employee", $param, "", "", $sortfield, $sortorder, 'center '); } if (!empty($arrayfields['u.fk_user']['checked'])) { print_liste_field_titre("HierarchicalResponsible", $_SERVER['PHP_SELF'], "u.fk_user", $param, "", "", $sortfield, $sortorder); @@ -822,6 +822,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { $li = $userstatic->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1); print '
'; + if (!empty($arrayfields['u.login']['checked'])) { print ''; + print ''; if (!$i) { $totalarray['nbfield']++; } } if (!empty($arrayfields['u.firstname']['checked'])) { - print ''; + print ''; if (!$i) { $totalarray['nbfield']++; } @@ -858,7 +859,7 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } } if (!empty($arrayfields['u.employee']['checked'])) { - print ''; + print ''; if (!$i) { $totalarray['nbfield']++; } From 2b894e8ab3378fa4c0a300e461a360413bd05477 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 20:13:18 +0200 Subject: [PATCH 18/26] css --- htdocs/install/default.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/default.css b/htdocs/install/default.css index eaefd6d5b2b..5363d9530e1 100644 --- a/htdocs/install/default.css +++ b/htdocs/install/default.css @@ -362,7 +362,7 @@ tr.choiceselected td .button { } a.button:link,a.button:visited,a.button:active { - color: #888; + color: #555; } .button { From 0c531984957095464f42d61904159ddc4b755773 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 18 Apr 2021 20:18:38 +0200 Subject: [PATCH 19/26] Easier to click --- htdocs/install/step2.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/step2.php b/htdocs/install/step2.php index d9321656355..2841ae8bdfe 100644 --- a/htdocs/install/step2.php +++ b/htdocs/install/step2.php @@ -572,7 +572,7 @@ dolibarr_install_syslog("- step2: end"); $out = ' '; -$out .= $langs->trans("MakeAnonymousPing"); +$out .= ''; $out .= ''; $out .= '
'.$langs->trans("LastSalaries", ($num <= $MAXLIST ? "" : $MAXLIST)).''.$langs->trans("AllSalaries").''.$num.''; print '
'.$langs->trans("LastSalaries", ($num <= $MAXLIST ? "" : $MAXLIST)).''.$langs->trans("AllSalaries").''.$num.'
'; - $payment_salary->id = $objp->rowid; - $payment_salary->ref = $objp->rowid; - print $payment_salary->getNomUrl(1); + print $salary->getNomUrl(1); print ''.dol_print_date($db->jdate($objp->datesp), 'day')."'.dol_print_date($db->jdate($objp->dateep), 'day')."'.price($objp->amount).''.price($objp->amount).''.$salary->getLibStatut(5, $objp->alreadypaid).'
'; print $li; @@ -836,13 +837,13 @@ while ($i < ($limit ? min($num, $limit) : $num)) { } } if (!empty($arrayfields['u.lastname']['checked'])) { - print ''.$obj->lastname.''.dol_escape_htmltag($obj->lastname).''.$obj->firstname.''.dol_escape_htmltag($obj->firstname).''.yn($obj->employee).''.yn($obj->employee).'