From 3cc48f156f4c4683f3c6ac6dd0235213173ad2ab Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 7 Oct 2017 02:29:27 +0200 Subject: [PATCH] The new website module become wonderfull --- htdocs/core/lib/website.lib.php | 115 ++++++++++++++++---- htdocs/websites/class/website.class.php | 10 +- htdocs/websites/class/websitepage.class.php | 22 +++- htdocs/websites/index.php | 55 ++++++---- 4 files changed, 156 insertions(+), 46 deletions(-) diff --git a/htdocs/core/lib/website.lib.php b/htdocs/core/lib/website.lib.php index bab4f6c5487..2c563628858 100644 --- a/htdocs/core/lib/website.lib.php +++ b/htdocs/core/lib/website.lib.php @@ -284,17 +284,23 @@ function exportWebSite($website) * * @param Website $object Object website * @param WebsitePage $objectpage Object website page - * @param string $urltograb URL to grab + * @param string $urltograb URL to grab (exemple: http://www.nltechno.com/ or http://www.nltechno.com/dir1/ or http://www.nltechno.com/dir1/mapage1) * @param string $tmp Content to parse * @param string $action Var $action - * @param string $modifylinks 0=Do not modify content, 1=Replace links with a link to + * @param string $modifylinks 0=Do not modify content, 1=Replace links with a link to viewimage * @return void */ function getAllImages($object, $objectpage, $urltograb, &$tmp, &$action, $modifylinks=0) { global $conf; - preg_match_all('/]*)>/i', $objectpage->content, $regs); + $alreadygrabbed=array(); + + if (preg_match('/\/$/', $urltograb)) $urltograb.='.'; + $urltograb = dirname($urltograb); // So urltograb is now http://www.nltechno.com or http://www.nltechno.com/dir1 + + preg_match_all('/]*)>/i', $tmp, $regs); + foreach ($regs[0] as $key => $val) { $urltograbbis = $urltograb.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; @@ -307,29 +313,100 @@ function getAllImages($object, $objectpage, $urltograb, &$tmp, &$action, $modify $filetosave = $conf->medias->multidir_output[$conf->entity].'/image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; } - $tmpgeturl = getURLContent($urltograbbis); - if ($tmpgeturl['curl_error_no']) - { - $error++; - setEventMessages($tmpgeturl['curl_error_msg'], null, 'errors'); - $action='create'; - } - else - { - dol_mkdir(dirname($filetosave)); + $filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; - $fp = fopen($filetosave, "w"); - fputs($fp, $tmpgeturl['content']); - fclose($fp); - if (! empty($conf->global->MAIN_UMASK)) - @chmod($file, octdec($conf->global->MAIN_UMASK)); + // Clean the aa/bb/../cc into aa/cc + $filetosave = preg_replace('/\/[^\/]+\/\.\./', '', $filetosave); + $filename = preg_replace('/\/[^\/]+\/\.\./', '', $filename); + + //var_dump($filetosave); + //var_dump($filename); + //exit; + + if (empty($alreadygrabbed[$urltograbbis])) + { + $tmpgeturl = getURLContent($urltograbbis); + if ($tmpgeturl['curl_error_no']) + { + $error++; + setEventMessages($tmpgeturl['curl_error_msg'], null, 'errors'); + $action='create'; + } + else + { + $alreadygrabbed[$urltograbbis]=1; // Track that file was alreay grabbed. + + dol_mkdir(dirname($filetosave)); + + $fp = fopen($filetosave, "w"); + fputs($fp, $tmpgeturl['content']); + fclose($fp); + if (! empty($conf->global->MAIN_UMASK)) + @chmod($file, octdec($conf->global->MAIN_UMASK)); + } } if ($modifylinks) { - $filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; $tmp = preg_replace('/'.preg_quote($regs[0][$key],'/').'/i', '', $tmp); } } + + // Search X in "background...url(X)" + preg_match_all('/background([^\.\/\(;]+)url\([\"\']?([^\)\"\']*)[\"\']?\)/i', $tmp, $regs); + + foreach ($regs[0] as $key => $val) + { + $urltograbbis = $urltograb.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; + + $linkwithoutdomain = $regs[2][$key]; + $filetosave = $conf->medias->multidir_output[$conf->entity].'/image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; + + if (preg_match('/^http/', $regs[2][$key])) + { + $urltograbbis = $regs[2][$key]; + $linkwithoutdomain = preg_replace('/^https?:\/\/[^\/]+\//i', '', $regs[2][$key]); + $filetosave = $conf->medias->multidir_output[$conf->entity].'/image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; + } + + $filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; + + // Clean the aa/bb/../cc into aa/cc + $filetosave = preg_replace('/\/[^\/]+\/\.\./', '', $filetosave); + $filename = preg_replace('/\/[^\/]+\/\.\./', '', $filename); + + //var_dump($filetosave); + //var_dump($filename); + //exit; + + if (empty($alreadygrabbed[$urltograbbis])) + { + $tmpgeturl = getURLContent($urltograbbis); + if ($tmpgeturl['curl_error_no']) + { + $error++; + setEventMessages($tmpgeturl['curl_error_msg'], null, 'errors'); + $action='create'; + } + else + { + $alreadygrabbed[$urltograbbis]=1; // Track that file was alreay grabbed. + + dol_mkdir(dirname($filetosave)); + + $fp = fopen($filetosave, "w"); + fputs($fp, $tmpgeturl['content']); + fclose($fp); + if (! empty($conf->global->MAIN_UMASK)) + @chmod($file, octdec($conf->global->MAIN_UMASK)); + } + } + + if ($modifylinks) + { + $tmp = preg_replace('/'.preg_quote($regs[0][$key],'/').'/i', 'background'.$regs[1][$key].'url("'.DOL_URL_ROOT.'/viewimage.php?modulepart=medias&file='.$filename.'")', $tmp); + } + } + } diff --git a/htdocs/websites/class/website.class.php b/htdocs/websites/class/website.class.php index 8a1b30d936d..8083407bdda 100644 --- a/htdocs/websites/class/website.class.php +++ b/htdocs/websites/class/website.class.php @@ -184,10 +184,9 @@ class Website extends CommonObject /** * Load object in memory from the database * - * @param int $id Id object - * @param string $ref Ref - * - * @return int <0 if KO, 0 if not found, >0 if OK + * @param int $id Id object + * @param string $ref Ref + * @return int <0 if KO, 0 if not found, >0 if OK */ public function fetch($id, $ref = null) { @@ -236,9 +235,6 @@ class Website extends CommonObject if ($numrows > 0) { // Lines $this->fetchLines(); - { - return -3; - } } if ($numrows > 0) { diff --git a/htdocs/websites/class/websitepage.class.php b/htdocs/websites/class/websitepage.class.php index ae10398795c..76526f29c0d 100644 --- a/htdocs/websites/class/websitepage.class.php +++ b/htdocs/websites/class/websitepage.class.php @@ -303,7 +303,27 @@ class WebsitePage extends CommonObject */ public function delete(User $user, $notrigger = false) { - return $this->deleteCommon($user, $trigger); + $result = $this->deleteCommon($user, $trigger); + + if ($result > 0) + { + $websiteobj=new Website($this->db); + $result = $websiteobj->fetch($this->fk_website); + + if ($result > 0) + { + global $dolibarr_main_data_root; + $pathofwebsite=$dolibarr_main_data_root.'/websites/'.$websiteobj->ref; + + $filealias=$pathofwebsite.'/'.$this->pageurl.'.php'; + $filetpl=$pathofwebsite.'/page'.$this->id.'.tpl.php'; + + dol_delete_file($filealias); + dol_delete_file($filetpl); + } + } + + return $result; } /** diff --git a/htdocs/websites/index.php b/htdocs/websites/index.php index 3094ef3b5b4..18941f20823 100644 --- a/htdocs/websites/index.php +++ b/htdocs/websites/index.php @@ -231,6 +231,16 @@ if ($action == 'add') if ($urltograb) { + // Clean url to grab, so url can be + // http://www.example.com/ or http://www.example.com/dir1/ or http://www.example.com/dir1/aaa + $urltograbwithoutdomainandparam = preg_replace('/^https?:\/\/[^\/]+\/?/i', '', $urltograb); + $urltograbwithoutdomainandparam = preg_replace('/\?.*$/', '', $urltograbwithoutdomainandparam); + if (empty($urltograbwithoutdomainandparam) && ! preg_match('/\/$/', $urltograb)) + { + $urltograb.='/'; + } + $urltograbdirwithoutslash = dirname($urltograb.'.'); + include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php'; $tmp = getURLContent($urltograb); @@ -245,12 +255,11 @@ if ($action == 'add') preg_match('/(.*)<\/head>/is', $tmp['content'], $reg); $head = $reg[1]; - $urltograbwithoutdomain = preg_replace('/^https?:\/\/[^\/]+\/?/i', '', $urltograbwithoutdomain); - $objectpage->pageurl = basename($urltograbwithoutdomain); + $objectpage->pageurl = dol_sanitizeFileName(preg_replace('/[\/\.]/','-',$urltograbwithoutdomainandparam)); if (empty($objectpage->pageurl)) { $tmpdomain = getDomainFromURL($urltograb); - $objectpage->pageurl='home'.$tmpdomain; + $objectpage->pageurl=$tmpdomain.'-home'; } if (preg_match('/(.*)<\/title>/ims', $head, $regtmp)) @@ -297,7 +306,8 @@ if ($action == 'add') preg_match_all('/<script([^\.]+)src="([^>"]+)"([^>]*)><\/script>/i', $objectpage->htmlheader, $regs); foreach ($regs[0] as $key => $val) { - $urltograbbis = $urltograb.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; + $urltograbbis = $urltograbdirwithoutslash.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; + $linkwithoutdomain = $regs[2][$key]; //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; if (preg_match('/^http/', $regs[2][$key])) @@ -338,7 +348,7 @@ if ($action == 'add') preg_match_all('/<link([^\.]+)href="([^>"]+\.css)"([^>]*)>/i', $objectpage->htmlheader, $regs); foreach ($regs[0] as $key => $val) { - $urltograbbis = $urltograb.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; + $urltograbbis = $urltograbdirwithoutslash.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; $linkwithoutdomain = $regs[2][$key]; //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key]; if (preg_match('/^http/', $regs[2][$key])) @@ -351,9 +361,9 @@ if ($action == 'add') $tmpgeturl = getURLContent($urltograbbis); if ($tmpgeturl['curl_error_no']) { - $error++; - setEventMessages($tmpgeturl['curl_error_msg'], null, 'errors'); - $action='create'; + $error++; + setEventMessages($tmpgeturl['curl_error_msg'], null, 'errors'); + $action='create'; } else { @@ -368,6 +378,9 @@ if ($action == 'add') // $filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain; $pagecsscontent.='/* Content of file '.$urltograbbis.' */'."\n"; + + getAllImages($object, $objectpage, $urltograbbis, $tmpgeturl['content'], $action, 1); + $pagecsscontent.=$tmpgeturl['content']."\n"; $objectpage->htmlheader = preg_replace('/'.preg_quote($regs[0][$key],'/').'\n*/ims', '', $objectpage->htmlheader); @@ -379,6 +392,7 @@ if ($action == 'add') //print dol_escape_htmltag($tmp);exit; $objectpage->htmlheader .= $pagecsscontent; + // Now loop to fetch all images $tmp = $objectpage->content; @@ -477,7 +491,6 @@ if ($action == 'add') if (! dol_is_file($filehtmlheader)) { - // TODO use header of page for common header ? $htmlheadercontent = "<!-- HTML header content (common for all pages) -->"; $result=dolSaveHtmlHeader($filehtmlheader, $htmlheadercontent); } @@ -504,7 +517,7 @@ if ($action == 'add') } } -// Update page +// Delete page if ($action == 'delete') { $db->begin(); @@ -1154,6 +1167,10 @@ if (count($object->records) > 0) if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone') { + print '<a class="websitebuttonsitepreview" id="previewsite" href="'.$urlwithroot.'/public/websites/index.php?website='.$website.'" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint, $dataroot), 1, 'preview'); + print '</a>'; + print '<div class="websiteinputurl" id="websiteinputurl">'; print '<input type="text" id="previewsiteurl" class="minwidth200imp" name="previewsite" placeholder="'.$langs->trans("http://myvirtualhost").'" value="'.$virtualurl.'">'; //print '<input type="submit" class="button" name="previewwebsite" target="tab'.$website.'" value="'.$langs->trans("ViewSiteInNewTab").'">'; @@ -1166,10 +1183,6 @@ if (count($object->records) > 0) print '<a class="websitebuttonsitepreview'.($urlext?'':' websitebuttonsitepreviewdisabled cursornotallowed').'" id="previewsiteext" href="'.$urlext.'" target="tab'.$website.'ext" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $dataroot, $urlext)).'">'; print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $dataroot, $urlext?$urlext:'<span class="error">'.$langs->trans("VirtualHostUrlNotDefined").'</span>'), 1, 'preview_ext'); print '</a>'; - - print '<a class="websitebuttonsitepreview" id="previewsite" href="'.$urlwithroot.'/public/websites/index.php?website='.$website.'" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint)).'">'; - print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint, $dataroot), 1, 'preview'); - print '</a>'; } if (in_array($action, array('editcss','editmenu','editmedias'))) @@ -1303,6 +1316,10 @@ if (count($object->records) > 0) $realpage=$urlwithroot.'/public/websites/index.php?website='.$website.'&pageref='.$websitepage->pageurl; $pagealias = $websitepage->pageurl; + print '<a class="websitebuttonsitepreview" id="previewpage" href="'.$realpage.'&nocache='.dol_now().'" class="button" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage, $dataroot), 1, 'preview'); + print '</a>'; // View page in new Tab + print '<div class="websiteinputurl" id="websiteinputpage">'; print '<input type="text" id="previewpageurl" class="minwidth200imp" name="previewsite" value="'.$pagealias.'" disabled="disabled">'; $htmltext=$langs->trans("PageNameAliasHelp", $langs->transnoentitiesnoconv("EditPageMeta")); @@ -1314,10 +1331,6 @@ if (count($object->records) > 0) print '<a class="websitebuttonsitepreview'.($virtualurl?'':' websitebuttonsitepreviewdisabled cursornotallowed').'" id="previewpageext" href="'.$urlext.'" target="tab'.$website.'ext" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $urlext)).'">'; print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $virtualurl?$urlext:'<span class="error">'.$langs->trans("VirtualHostUrlNotDefined").'</span>'), 1, 'preview_ext'); print '</a>'; - - print '<a class="websitebuttonsitepreview" id="previewpage" href="'.$realpage.'&nocache='.dol_now().'" class="button" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage)).'">'; - print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage, $dataroot), 1, 'preview'); - print '</a>'; // View page in new Tab //print '<input type="submit" class="button" name="previewpage" target="tab'.$website.'"value="'.$langs->trans("ViewPageInNewTab").'">'; // TODO Add js to save alias like we save virtual host name and use dynamic virtual host for url of id=previewpageext @@ -1767,14 +1780,18 @@ if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpa $objectpage->fetch($pageid); $csscontent = @file_get_contents($filecss); - $out = '<!-- Page content '.$filetpl.' : Div with (CSS + Page content from database) -->'."\n"; + $out = '<!-- Page content '.$filetpl.' : Div with (CSS Of website from file + Style/htmlheader of page from database + Page content from database) -->'."\n"; $out.='<div id="websitecontentundertopmenu" class="websitecontentundertopmenu">'."\n"; + // REPLACEMENT OF LINKS When page called by website editor $out.='<style scoped>'."\n"; // "scoped" means "apply to parent element only". Not yet supported by browsers + $out.= '<!-- Include website CSS file -->'."\n"; $out.=dolWebsiteReplacementOfLinks($object, $csscontent); + $out.= '<!-- Include HTML header from page inline block -->'."\n"; + $out.= $objectpage->htmlheader."\n"; $out.='</style>'."\n"; $out.='<div id="bodywebsite" class="bodywebsite">'."\n";