25 define(
'NOSCANPOSTFORINJECTION', 1);
26 define(
'NOSTYLECHECK', 1);
27 define(
'USEDOLIBARREDITOR', 1);
28 define(
'FORCE_CKEDITOR', 1);
29 if (!defined(
'DISABLE_JS_GRAHP')) define(
'DISABLE_JS_GRAPH', 1);
34 require
'../main.inc.php';
35 require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
36 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
37 require_once DOL_DOCUMENT_ROOT.
'/core/lib/website.lib.php';
38 require_once DOL_DOCUMENT_ROOT.
'/core/lib/website2.lib.php';
39 require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
40 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formadmin.class.php';
42 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formwebsite.class.php';
43 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
44 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/website/class/website.class.php';
46 require_once DOL_DOCUMENT_ROOT.
'/website/class/websitepage.class.php';
47 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
50 $langs->loadLangs(array(
"admin",
"other",
"website",
"errors"));
53 if (!$user->rights->website->read) {
57 $conf->dol_hide_leftmenu = 1;
60 $websiteid =
GETPOST(
'websiteid',
'int');
61 $websitekey =
GETPOST(
'website',
'alpha');
62 $page =
GETPOST(
'page',
'alpha');
63 $pageid =
GETPOST(
'pageid',
'int');
64 $pageref =
GETPOST(
'pageref',
'alphanohtml');
66 $action =
GETPOST(
'action',
'aZ09');
67 $massaction =
GETPOST(
'massaction',
'alpha');
68 $confirm =
GETPOST(
'confirm',
'alpha');
69 $cancel =
GETPOST(
'cancel',
'alpha');
70 $toselect =
GETPOST(
'toselect',
'array');
71 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'websitelist';
72 $backtopage =
GETPOST(
'backtopage',
'alpha');
73 $optioncss =
GETPOST(
'optioncss',
'aZ');
74 $dol_hide_topmenu =
GETPOST(
'dol_hide_topmenu',
'int');
75 $dol_hide_leftmenu =
GETPOST(
'dol_hide_leftmenu',
'int');
76 $dol_openinpopup =
GETPOST(
'dol_openinpopup',
'aZ09');
78 $type_container =
GETPOST(
'WEBSITE_TYPE_CONTAINER',
'alpha');
80 $section_dir =
GETPOST(
'section_dir',
'alpha');
81 $file_manager =
GETPOST(
'file_manager',
'alpha');
82 $replacesite =
GETPOST(
'replacesite',
'alpha');
83 $mode =
GETPOST(
'mode',
'alpha');
85 if (
GETPOST(
'deletesite',
'alpha')) {
86 $action =
'deletesite';
88 if (
GETPOST(
'delete',
'alpha')) {
91 if (
GETPOST(
'preview',
'alpha')) {
94 if (
GETPOST(
'createsite',
'alpha')) {
95 $action =
'createsite';
97 if (
GETPOST(
'createcontainer',
'alpha')) {
98 $action =
'createcontainer';
100 if (
GETPOST(
'editcss',
'alpha')) {
103 if (
GETPOST(
'editmenu',
'alpha')) {
104 $action =
'editmenu';
106 if (
GETPOST(
'setashome',
'alpha')) {
107 $action =
'setashome';
109 if (
GETPOST(
'editmeta',
'alpha')) {
110 $action =
'editmeta';
112 if (
GETPOST(
'editsource',
'alpha')) {
113 $action =
'editsource';
115 if (
GETPOST(
'editcontent',
'alpha')) {
116 $action =
'editcontent';
118 if (
GETPOST(
'exportsite',
'alpha')) {
119 $action =
'exportsite';
121 if (
GETPOST(
'importsite',
'alpha')) {
122 $action =
'importsite';
124 if (
GETPOST(
'createfromclone',
'alpha')) {
125 $action =
'createfromclone';
127 if (
GETPOST(
'createpagefromclone',
'alpha')) {
128 $action =
'createpagefromclone';
130 if (empty($action) && $file_manager) {
131 $action =
'file_manager';
133 if (empty($action) && $replacesite) {
134 $mode =
'replacesite';
141 $limit =
GETPOST(
'limit',
'int') ?
GETPOST(
'limit',
'int') : $conf->liste_limit;
142 $sortfield =
GETPOST(
'sortfield',
'aZ09comma');
143 $sortorder =
GETPOST(
'sortorder',
'aZ09comma');
145 if (empty($page) || $page == -1) {
148 $offset = $limit * $page;
149 $pageprev = $page - 1;
150 $pagenext = $page + 1;
154 if (empty($action)) {
161 $object->fetchAll(
'ASC',
'position');
164 if (!($websiteid > 0) && empty($websitekey) && $action !=
'createsite') {
165 foreach ($object->records as $key => $valwebsite) {
166 $websitekey = $valwebsite->ref;
170 if ($websiteid > 0 || $websitekey) {
171 $res = $object->fetch($websiteid, $websitekey);
172 $websitekey = $object->ref;
181 if (($pageid > 0 || $pageref) && $action !=
'addcontainer') {
182 $res = $objectpage->fetch($pageid, ($object->id > 0 ? $object->id :
null), $pageref);
184 $res = $objectpage->fetch($pageid, ($object->id > 0 ? $object->id :
null),
null, $pageref);
188 if ($res >= 0 && $object->id > 0) {
189 if ($objectpage->fk_website != $object->id) {
190 if ($object->fk_default_home > 0) {
191 $res = $objectpage->fetch($object->fk_default_home, $object->id,
'');
193 $pageid = $object->fk_default_home;
196 $res = $objectpage->fetch(0, $object->id,
'');
201 $pageid = $objectpage->id;
206 $pageid = $objectpage->id;
212 if (empty($pageid) && empty($pageref) && $object->id > 0 && $action !=
'createcontainer') {
213 $pageid = $object->fk_default_home;
214 if (empty($pageid)) {
215 $array = $objectpage->fetchAll($object->id,
'ASC,ASC',
'type_container,pageurl');
216 if (!is_array($array) && $array < 0) {
219 $atleastonepage = (is_array($array) && count($array) > 0);
221 $firstpageid = 0; $homepageid = 0;
222 foreach ($array as $key => $valpage) {
223 if (empty($firstpageid)) {
224 $firstpageid = $valpage->id;
226 if ($object->fk_default_home && $key == $object->fk_default_home) {
227 $homepageid = $valpage->id;
230 $pageid = ($homepageid ? $homepageid : $firstpageid);
235 global $dolibarr_main_data_root;
236 $pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ?
'/'.$conf->entity :
'').
'/website/'.$websitekey;
237 $filehtmlheader = $pathofwebsite.
'/htmlheader.html';
238 $filecss = $pathofwebsite.
'/styles.css.php';
239 $filejs = $pathofwebsite.
'/javascript.js.php';
240 $filerobot = $pathofwebsite.
'/robots.txt';
241 $filehtaccess = $pathofwebsite.
'/.htaccess';
242 $filetpl = $pathofwebsite.
'/page'.$pageid.
'.tpl.php';
243 $fileindex = $pathofwebsite.
'/index.php';
244 $filewrapper = $pathofwebsite.
'/wrapper.php';
245 $filemanifestjson = $pathofwebsite.
'/manifest.json.php';
246 $filereadme = $pathofwebsite.
'/README.md';
247 $filelicense = $pathofwebsite.
'/LICENSE';
248 $filemaster = $pathofwebsite.
'/master.inc.php';
251 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
252 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
256 $permtouploadfile = $user->hasRight(
'website',
'write');
257 $diroutput = $conf->medias->multidir_output[$conf->entity];
259 $relativepath = $section_dir;
260 $upload_dir = preg_replace(
'/\/$/',
'', $diroutput).
'/'.preg_replace(
'/^\//',
'', $relativepath);
262 $htmlheadercontentdefault =
'';
263 $htmlheadercontentdefault .=
'<link rel="stylesheet" id="google-fonts-css" href="//fonts.googleapis.com/css?family=Open+Sans:300,400,700" />'.
"\n";
264 $htmlheadercontentdefault .=
'<link rel="stylesheet" id="font-wasesome-css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />'.
"\n";
265 $htmlheadercontentdefault .=
'<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>'.
"\n";
266 $htmlheadercontentdefault .=
'<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>'.
"\n";
267 $htmlheadercontentdefault .=
'<!--'.
"\n";
268 $htmlheadercontentdefault .=
'<script src="/document.php?modulepart=medias&file=css/myfile.css"></script>'.
"\n";
269 $htmlheadercontentdefault .=
'<script src="/document.php?modulepart=medias&file=js/myfile.js"></script>'.
"\n";
270 $htmlheadercontentdefault .=
'-->'.
"\n";
272 $manifestjsoncontentdefault =
'';
273 $manifestjsoncontentdefault .=
'{
275 "short_name": "MyWebsite",
278 "display": "standalone",
279 "background_color": "#fff",
280 "description": "A simple Web app.",
282 "src": "images/'.urlencode($website->ref).
'/homescreen48.png",
286 "src": "image/'.urlencode($website->ref).
'/homescreen72.png",
290 "src": "image/'.urlencode($website->ref).
'/homescreen96.png",
294 "src": "image/'.urlencode($website->ref).
'/homescreen144.png",
298 "src": "image/'.urlencode($website->ref).
'/homescreen168.png",
302 "src": "image/'.urlencode($website->ref).
'/homescreen192.png",
306 "related_applications": [{
308 "url": "https://play.google.com/store/apps/details?id=com.nltechno.dolidroidpro"
312 $listofpages = array();
318 if (
GETPOST(
'optioncontent')) {
321 if (
GETPOST(
'optionsitefiles')) {
322 $algo .=
'sitefiles';
325 if (empty($sortfield)) {
326 if ($action ==
'file_manager') {
327 $sortfield =
'name'; $sortorder =
'ASC';
329 $sortfield =
'pageurl'; $sortorder =
'ASC';
333 $searchkey =
GETPOST(
'searchstring',
'restricthtml');
335 if ($mode ==
'replacesite') {
336 $containertype =
GETPOST(
'optioncontainertype',
'aZ09') !=
'-1' ?
GETPOST(
'optioncontainertype',
'aZ09') :
'';
337 $langcode =
GETPOST(
'optionlanguage',
'aZ09');
338 $otherfilters = array();
339 if (
GETPOST(
'optioncategory',
'int') > 0) {
340 $otherfilters[
'category'] =
GETPOST(
'optioncategory',
'int');
343 $listofpages =
getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
346 $usercanedit = $user->rights->website->write;
347 $permissiontoadd = $user->rights->website->write;
348 $permissiontodelete = $user->rights->website->delete;
359 if (
GETPOST(
'refreshsite',
'alpha') ||
GETPOST(
'refreshsite.x',
'alpha') ||
GETPOST(
'refreshsite_x',
'alpha')) {
360 if ($action ==
'addsite') {
363 if ($action ==
'updatesource') {
367 $pageid = $object->fk_default_home;
368 if (empty($pageid)) {
369 $array = $objectpage->fetchAll($object->id,
'ASC,ASC',
'type_container,pageurl');
370 if (!is_array($array) && $array < 0) {
373 $atleastonepage = (is_array($array) && count($array) > 0);
375 $firstpageid = 0; $homepageid = 0;
376 foreach ($array as $key => $valpage) {
377 if (empty($firstpageid)) {
378 $firstpageid = $valpage->id;
380 if ($object->fk_default_home && $key == $object->fk_default_home) {
381 $homepageid = $valpage->id;
384 $pageid = ($homepageid ? $homepageid : $firstpageid);
387 if (
GETPOST(
'refreshpage',
'alpha') && !in_array($action, array(
'updatecss'))) {
391 if ($cancel && $action ==
'renamefile') {
400 header(
"Location: ".$backtopage);
405 $savbacktopage = $backtopage;
406 $backtopage = $_SERVER[
"PHP_SELF"].
'?file_manager=1&website='.urlencode($websitekey).
'&pageid='.urlencode($pageid).(GETPOST(
'section_dir',
'alpha') ?
'§ion_dir='.urlencode(
GETPOST(
'section_dir',
'alpha')) :
'');
408 $backtopage .=
'&sortfield='.urlencode($sortfield);
411 $backtopage .=
'&sortorder='.urlencode($sortorder);
413 include DOL_DOCUMENT_ROOT.
'/core/actions_linkedfiles.inc.php';
415 $backtopage = $savbacktopage;
419 if ($action ==
'renamefile') {
420 $action =
'file_manager';
423 if ($action ==
'setwebsiteonline') {
424 $website->setStatut($website::STATUS_VALIDATED,
null,
'',
'WEBSITE_MODIFY',
'status');
426 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'websitepage',
'int'));
429 if ($action ==
'setwebsiteoffline') {
430 $result = $website->setStatut($website::STATUS_DRAFT,
null,
'',
'WEBSITE_MODIFY',
'status');
432 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'websitepage',
'int'));
435 if ($action ==
'seteditinline') {
437 setEventMessages($langs->trans(
"FeatureNotYetAvailable"),
null,
'warnings');
439 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'pageid',
'int'));
442 if ($action ==
'unseteditinline') {
444 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'pageid',
'int'));
447 if ($action ==
'setshowsubcontainers') {
450 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'pageid',
'int'));
453 if ($action ==
'unsetshowsubcontainers') {
455 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.
GETPOST(
'website',
'alphanohtml').
'&pageid='.
GETPOST(
'pageid',
'int'));
459 if ($massaction ==
'replace' &&
GETPOST(
'confirmmassaction',
'alpha') && !$searchkey) {
460 $mode =
'replacesite';
464 if ($action ==
'deletetemplate') {
465 $dirthemes = array(
'/doctemplates/websites');
466 if (!empty($conf->modules_parts[
'websitetemplates'])) {
467 foreach ($conf->modules_parts[
'websitetemplates'] as $reldir) {
468 $dirthemes = array_merge($dirthemes, (array) ($reldir.
'doctemplates/websites'));
471 $dirthemes = array_unique($dirthemes);
475 $mode =
'importsite';
476 $action =
'importsite';
478 if (count($dirthemes)) {
480 foreach ($dirthemes as $dir) {
482 $dirtheme = DOL_DATA_ROOT.$dir;
483 if (is_dir($dirtheme)) {
484 $templateuserfile =
GETPOST(
'templateuserfile');
485 $imguserfile = preg_replace(
'/\.zip$/',
'', $templateuserfile).
'.jpg';
494 if ($massaction ==
'setcategory' &&
GETPOST(
'confirmmassaction',
'alpha') && $usercanedit) {
500 $categoryid =
GETPOST(
'setcategory',
'int');
501 if ($categoryid > 0) {
504 $category->fetch($categoryid);
506 foreach ($toselect as $tmpid) {
507 $tmpwebsitepage->id = $tmpid;
508 $result = $category->add_type($tmpwebsitepage,
'website_page');
509 if ($result < 0 && $result != -3) {
523 setEventMessages($langs->trans(
"RecordsModified", $nbupdate),
null,
'mesgs');
529 $listofpages =
getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
533 if ($massaction ==
'delcategory' &&
GETPOST(
'confirmmassaction',
'alpha') && $usercanedit) {
539 $categoryid =
GETPOST(
'setcategory',
'int');
540 if ($categoryid > 0) {
543 $category->fetch($categoryid);
545 foreach ($toselect as $tmpid) {
546 $tmpwebsitepage->id = $tmpid;
547 $result = $category->del_type($tmpwebsitepage,
'website_page');
548 if ($result < 0 && $result != -3) {
562 setEventMessages($langs->trans(
"RecordsModified", $nbupdate),
null,
'mesgs');
568 $listofpages =
getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
572 if ($massaction ==
'replace' &&
GETPOST(
'confirmmassaction',
'alpha') && $usercanedit) {
573 $replacestring =
GETPOST(
'replacestring',
'none');
575 $dolibarrdataroot = preg_replace(
'/([\\/]+)$/i',
'', DOL_DATA_ROOT);
576 $allowimportsite =
true;
577 if (
dol_is_file($dolibarrdataroot.
'/installmodules.lock')) {
578 $allowimportsite =
false;
581 if (!$allowimportsite) {
585 $message = $langs->trans(
'InstallModuleFromWebHasBeenDisabledContactUs');
588 $message = $langs->trans(
"InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.
'/installmodules.lock');
591 } elseif (empty($user->rights->website->writephp)) {
593 } elseif (!$replacestring) {
598 foreach ($toselect as $keyselected) {
599 $objectpage = $listofpages[
'list'][$keyselected];
600 if ($objectpage->pageurl) {
601 dol_syslog(
"Replace string into page ".$objectpage->pageurl);
603 if (
GETPOST(
'optioncontent',
'aZ09')) {
604 $objectpage->content = str_replace($searchkey, $replacestring, $objectpage->content);
606 if (
GETPOST(
'optionmeta',
'aZ09')) {
607 $objectpage->title = str_replace($searchkey, $replacestring, $objectpage->title);
608 $objectpage->description = str_replace($searchkey, $replacestring, $objectpage->description);
609 $objectpage->keywords = str_replace($searchkey, $replacestring, $objectpage->keywords);
612 $filealias = $pathofwebsite.
'/'.$objectpage->pageurl.
'.php';
613 $filetpl = $pathofwebsite.
'/page'.$objectpage->id.
'.tpl.php';
618 setEventMessages(
'Failed to write file '.basename($filealias),
null,
'errors');
626 $objectpage->update($user);
630 $action =
'createcontainer';
636 if ($nbreplacement > 0) {
637 setEventMessages($langs->trans(
"ReplacementDoneInXPages", $nbreplacement),
null,
'mesgs');
640 $containertype =
GETPOST(
'optioncontainertype',
'aZ09') !=
'-1' ?
GETPOST(
'optioncontainertype',
'aZ09') :
'';
641 $langcode =
GETPOST(
'optionlanguage',
'aZ09');
642 $otherfilters = array();
643 if (
GETPOST(
'optioncategory',
'int') > 0) {
644 $otherfilters[
'category'] =
GETPOST(
'optioncategory',
'int');
648 $listofpages =
getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters);
678 if ($action ==
'addsite' && $usercanedit) {
681 if (
GETPOST(
'virtualhost',
'alpha') && !preg_match(
'/^http/',
GETPOST(
'virtualhost',
'alpha'))) {
683 setEventMessages($langs->trans(
'ErrorURLMustStartWithHttp', $langs->transnoentitiesnoconv(
"VirtualHost")),
null,
'errors');
686 if (!$error && !
GETPOST(
'WEBSITE_REF',
'alpha')) {
688 $langs->load(
"errors");
689 setEventMessages($langs->transnoentities(
"ErrorFieldRequired", $langs->transnoentities(
"WebsiteName")),
null,
'errors');
691 if (!$error && !preg_match(
'/^[a-z0-9_\-\.]+$/i',
GETPOST(
'WEBSITE_REF',
'alpha'))) {
693 $langs->load(
"errors");
694 setEventMessages($langs->transnoentities(
"ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities(
"Ref")),
null,
'errors');
698 $arrayotherlang = explode(
',',
GETPOST(
'WEBSITE_OTHERLANG',
'alphanohtml'));
699 foreach ($arrayotherlang as $key => $val) {
701 if (empty(trim($val)))
continue;
702 $arrayotherlang[$key] = substr(trim($val), 0, 2);
706 $tmpobject->ref =
GETPOST(
'WEBSITE_REF',
'alpha');
707 $tmpobject->description =
GETPOST(
'WEBSITE_DESCRIPTION',
'alphanohtml');
708 $tmpobject->lang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
709 $tmpobject->otherlang = join(
',', $arrayotherlang);
710 $tmpobject->virtualhost =
GETPOST(
'virtualhost',
'alpha');
712 $result = $tmpobject->create($user);
716 } elseif ($result < 0) {
727 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$tmpobject->ref);
731 $action =
'createsite';
741 if ($action ==
'addcontainer' && $usercanedit) {
746 $objectpage->fk_website = $object->id;
749 $urltograb =
GETPOST(
'externalurl',
'alpha');
750 $grabimages =
GETPOST(
'grabimages',
'alpha');
751 $grabimagesinto =
GETPOST(
'grabimagesinto',
'alpha');
753 include_once DOL_DOCUMENT_ROOT.
'/core/lib/geturl.lib.php';
755 if (empty($urltograb)) {
757 $langs->load(
"errors");
758 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"URL")),
null,
'errors');
759 $action =
'createcontainer';
760 } elseif (!preg_match(
'/^http/', $urltograb)) {
762 $langs->load(
"errors");
763 setEventMessages(
'Error URL must start with http:// or https://',
null,
'errors');
764 $action =
'createcontainer';
770 $urltograbwithoutdomainandparam = preg_replace(
'/^https?:\/\/[^\/]+\/?/i',
'', $urltograb);
772 $urltograbwithoutdomainandparam = preg_replace(
'/\?.*$/',
'', $urltograbwithoutdomainandparam);
773 if (empty($urltograbwithoutdomainandparam) && !preg_match(
'/\/$/', $urltograb)) {
776 $pageurl =
dol_sanitizeFileName(preg_replace(
'/[\/\.]/',
'-', preg_replace(
'/\/+$/',
'', $urltograbwithoutdomainandparam)));
778 $urltograbdirwithoutslash = dirname($urltograb.
'.');
787 $result = $tmpwebsitepage->fetch(0, $object->id, $pageurl);
789 setEventMessages($langs->trans(
"AliasPageAlreadyExists", $pageurl),
null,
'errors');
791 $action =
'createcontainer';
796 $tmp =
getURLContent($urltograb,
'GET',
'', 1, array(), array(
'http',
'https'), 0);
797 if ($tmp[
'curl_error_no']) {
799 setEventMessages(
'Error getting '.$urltograb.
': '.$tmp[
'curl_error_msg'],
null,
'errors');
800 $action =
'createcontainer';
801 } elseif ($tmp[
'http_code'] !=
'200') {
803 setEventMessages(
'Error getting '.$urltograb.
': '.$tmp[
'http_code'],
null,
'errors');
804 $action =
'createcontainer';
811 preg_match(
'/<head>(.*)<\/head>/ims', $tmp[
'content'], $regs);
814 $objectpage->type_container =
'page';
815 $objectpage->pageurl = $pageurl;
816 if (empty($objectpage->pageurl)) {
818 $objectpage->pageurl = $tmpdomain.
'-home';
821 $objectpage->aliasalt =
'';
823 if (preg_match(
'/^(\d+)\-/', basename($urltograb), $regs)) {
824 $objectpage->aliasalt = $regs[1];
828 if (preg_match(
'/<title>(.*)<\/title>/ims', $head, $regtmp)) {
829 $objectpage->title = $regtmp[1];
831 if (preg_match(
'/<meta name="title"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
832 if (empty($objectpage->title)) {
833 $objectpage->title = $regtmp[1];
836 if (preg_match(
'/<meta name="description"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
837 $objectpage->description = $regtmp[1];
839 if (preg_match(
'/<meta name="keywords"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
840 $objectpage->keywords = $regtmp[1];
842 if (preg_match(
'/<html\s+lang="([^"]+)"/ims', $tmp[
'content'], $regtmp)) {
843 $tmplang = explode(
'-', $regtmp[1]);
844 $objectpage->lang = $tmplang[0].($tmplang[1] ?
'_'.strtoupper($tmplang[1]) :
'');
847 $tmp[
'content'] = preg_replace(
'/\s*<meta name="generator"[^"]+content="([^"]+)"\s*\/?>/ims',
'', $tmp[
'content']);
849 $objectpage->content = $tmp[
'content'];
850 $objectpage->content = preg_replace(
'/^.*<body(\s[^>]*)*>/ims',
'', $objectpage->content);
851 $objectpage->content = preg_replace(
'/<\/body(\s[^>]*)*>.*$/ims',
'', $objectpage->content);
859 $objectpage->htmlheader = $tmp[
'content'];
860 $objectpage->htmlheader = preg_replace(
'/^.*<head(\s[^>]*)*>/ims',
'', $objectpage->htmlheader);
861 $objectpage->htmlheader = preg_replace(
'/<\/head(\s[^>]*)*>.*$/ims',
'', $objectpage->htmlheader);
862 $objectpage->htmlheader = preg_replace(
'/<base(\s[^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
863 $objectpage->htmlheader = preg_replace(
'/<meta http-equiv="content-type"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
864 $objectpage->htmlheader = preg_replace(
'/<meta name="robots"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
865 $objectpage->htmlheader = preg_replace(
'/<meta name="title"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
866 $objectpage->htmlheader = preg_replace(
'/<meta name="description"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
867 $objectpage->htmlheader = preg_replace(
'/<meta name="keywords"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
868 $objectpage->htmlheader = preg_replace(
'/<meta name="generator"([^>]*)*>\n*/ims',
'', $objectpage->htmlheader);
871 $objectpage->htmlheader = preg_replace(
'/<title>[^<]*<\/title>\n*/ims',
'', $objectpage->htmlheader);
872 $objectpage->htmlheader = preg_replace(
'/<link[^>]*rel="shortcut[^>]*>\n/ims',
'', $objectpage->htmlheader);
873 $objectpage->htmlheader = preg_replace(
'/<link[^>]*rel="alternate[^>]*>\n/ims',
'', $objectpage->htmlheader);
874 $objectpage->htmlheader = preg_replace(
'/<link[^>]*rel="canonical[^>]*>\n/ims',
'', $objectpage->htmlheader);
877 $tmp = $objectpage->htmlheader;
880 preg_match_all(
'/<script([^\.>]+)src=["\']([^"\'>]+)["\']([^>]*)><\/script>/i', $objectpage->htmlheader, $regs);
881 $errorforsubresource = 0;
882 foreach ($regs[0] as $key => $val) {
883 dol_syslog(
"We will grab the script resource found into script tag ".$regs[2][$key]);
885 $linkwithoutdomain = $regs[2][$key];
886 if (preg_match(
'/^\//', $regs[2][$key])) {
887 $urltograbbis = $urltograbdirrootwithoutslash.$regs[2][$key];
889 $urltograbbis = $urltograbdirwithoutslash.
'/'.$regs[2][$key];
893 if (preg_match(
'/^http/', $regs[2][$key])) {
894 $urltograbbis = $regs[2][$key];
895 $linkwithoutdomain = preg_replace(
'/^https?:\/\/[^\/]+\//i',
'', $regs[2][$key]);
905 if ($domaintograb != $domaintograbbis) {
938 $tmp = preg_replace(
'/'.preg_quote($regs[0][$key],
'/').
'/i',
'', $tmp);
940 $objectpage->htmlheader = trim($tmp).
"\n";
944 $pagecsscontent =
"\n".
'<style>'.
"\n";
946 preg_match_all(
'/<link([^\.>]+)href=["\']([^"\'>]+\.css[^"\'>]*)["\']([^>]*)>/i', $objectpage->htmlheader, $regs);
947 $errorforsubresource = 0;
948 foreach ($regs[0] as $key => $val) {
949 dol_syslog(
"We will grab the css resources found into link tag ".$regs[2][$key]);
951 $linkwithoutdomain = $regs[2][$key];
952 if (preg_match(
'/^\//', $regs[2][$key])) {
953 $urltograbbis = $urltograbdirrootwithoutslash.$regs[2][$key];
955 $urltograbbis = $urltograbdirwithoutslash.
'/'.$regs[2][$key];
959 if (preg_match(
'/^http/', $regs[2][$key])) {
960 $urltograbbis = $regs[2][$key];
961 $linkwithoutdomain = preg_replace(
'/^https?:\/\/[^\/]+\//i',
'', $regs[2][$key]);
971 if ($domaintograb != $domaintograbbis) {
975 $tmpgeturl =
getURLContent($urltograbbis,
'GET',
'', 1, array(), array(
'http',
'https'), 0);
976 if ($tmpgeturl[
'curl_error_no']) {
977 $errorforsubresource++;
978 setEventMessages(
'Error getting link tag url '.$urltograbbis.
': '.$tmpgeturl[
'curl_error_msg'],
null,
'errors');
979 dol_syslog(
'Error getting '.$urltograbbis.
': '.$tmpgeturl[
'curl_error_msg']);
980 $action =
'createcontainer';
981 } elseif ($tmpgeturl[
'http_code'] !=
'200') {
982 $errorforsubresource++;
983 setEventMessages(
'Error getting link tag url '.$urltograbbis.
': '.$tmpgeturl[
'http_code'],
null,
'errors');
984 dol_syslog(
'Error getting '.$urltograbbis.
': '.$tmpgeturl[
'curl_error_msg']);
985 $action =
'createcontainer';
994 $tmpgeturl[
'content'] = preg_replace(
'/\/\*\s+CSS content[a-z\s]*\s+\*\//',
'', $tmpgeturl[
'content']);
1005 $pagecsscontent .=
'/* Content of file '.$urltograbbis.
' */'.
"\n";
1007 getAllImages($object, $objectpage, $urltograbbis, $tmpgeturl[
'content'], $action, 1, $grabimages, $grabimagesinto);
1010 include_once DOL_DOCUMENT_ROOT.
'/core/class/lessc.class.php';
1011 $lesscobj =
new Lessc();
1013 $contentforlessc =
".bodywebsite {\n".$tmpgeturl[
'content'].
"\n}\n";
1015 $contentforlessc = $lesscobj->compile($contentforlessc);
1018 $pagecsscontent .= $contentforlessc.
"\n";
1020 }
catch (exception $e) {
1022 dol_syslog(
"Failed to compile the CSS from URL ".$urltograbbis.
" with lessc: ".$e->getMessage(), LOG_WARNING);
1023 $pagecsscontent .= $tmpgeturl[
'content'].
"\n";
1026 $objectpage->htmlheader = preg_replace(
'/'.preg_quote($regs[0][$key],
'/').
'\n*/ims',
'', $objectpage->htmlheader);
1030 $pagecsscontent .=
'</style>';
1034 $objectpage->htmlheader .= trim($pagecsscontent).
"\n";
1038 $tmp = $objectpage->content;
1040 getAllImages($object, $objectpage, $urltograb, $tmp, $action, 1, $grabimages, $grabimagesinto);
1043 $tmp = preg_replace(
'/a href="\/([^\/"]+)\/([^\/"]+)"/',
'a href="/\1-\2.php"', $tmp);
1044 $tmp = preg_replace(
'/a href="\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)"/',
'a href="/\1-\2-\3.php"', $tmp);
1045 $tmp = preg_replace(
'/a href="\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)"/',
'a href="/\1-\2-\3-\4.php"', $tmp);
1048 $objectpage->content = $tmp;
1050 $objectpage->grabbed_from = $urltograb;
1054 $newaliasnames =
'';
1055 if (!$error &&
GETPOST(
'WEBSITE_ALIASALT',
'alpha')) {
1056 $arrayofaliastotest = explode(
',', str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_ALIASALT',
'alpha')));
1058 foreach ($arrayofaliastotest as $aliastotest) {
1059 $aliastotest = trim(preg_replace(
'/\.php$/i',
'', $aliastotest));
1062 if (preg_match(
'/^page\d+/i', $aliastotest)) {
1064 $langs->load(
"errors");
1066 $action =
'createcontainer';
1069 $result = $websitepagetemp->fetch(0, $object->id, $aliastotest);
1072 $langs->load(
"errors");
1073 setEventMessages($websitepagetemp->error, $websitepagetemp->errors,
'errors');
1074 $action =
'createcontainer';
1079 $langs->load(
"errors");
1080 setEventMessages($langs->trans(
"ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl),
null,
'errors');
1081 $action =
'createcontainer';
1084 $newaliasnames .= ($newaliasnames ?
', ' :
'').$aliastotest;
1089 $objectpage->title = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_TITLE',
'alphanohtml'));
1090 $objectpage->type_container =
GETPOST(
'WEBSITE_TYPE_CONTAINER',
'aZ09');
1091 $objectpage->pageurl =
GETPOST(
'WEBSITE_PAGENAME',
'alpha');
1092 $objectpage->aliasalt = $newaliasnames;
1093 $objectpage->description = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_DESCRIPTION',
'alphanohtml'));
1094 $objectpage->lang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
1095 $objectpage->otherlang =
GETPOST(
'WEBSITE_OTHERLANG',
'aZ09comma');
1096 $objectpage->image =
GETPOST(
'WEBSITE_IMAGE',
'alpha');
1097 $objectpage->keywords = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_KEYWORDS',
'alphanohtml'));
1098 $objectpage->allowed_in_frames =
GETPOST(
'WEBSITE_ALLOWED_IN_FRAMES',
'aZ09');
1099 $objectpage->htmlheader =
GETPOST(
'htmlheader',
'none');
1100 $objectpage->author_alias =
GETPOST(
'WEBSITE_AUTHORALIAS',
'alphanohtml');
1101 $objectpage->object_type =
GETPOST(
'WEBSITE_OBJECTCLASS');
1102 $objectpage->fk_object =
GETPOST(
'WEBSITE_OBJECTID');
1103 $substitutionarray = array();
1104 $substitutionarray[
'__WEBSITE_CREATE_BY__'] = $user->getFullName($langs);
1107 $pageidfortranslation = (
GETPOST(
'pageidfortranslation',
'int') > 0 ?
GETPOST(
'pageidfortranslation',
'int') : 0);
1108 if ($pageidfortranslation > 0) {
1111 $objectpagetmp->fetch($pageidfortranslation);
1112 if ($objectpagetmp->fk_page > 0) {
1113 $pageidfortranslation = $objectpagetmp->fk_page;
1116 $objectpage->fk_page = $pageidfortranslation;
1118 $sample =
GETPOST(
'sample',
'alpha');
1119 if (empty($sample)) {
1123 $pathtosample = DOL_DOCUMENT_ROOT.
'/website/samples/page-sample-'.
dol_sanitizeFileName($sample).
'.html';
1126 $objectpage->content =
make_substitutions(@file_get_contents($pathtosample), $substitutionarray);
1130 if (empty($objectpage->pageurl)) {
1131 $langs->load(
"errors");
1132 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WEBSITE_PAGENAME")),
null,
'errors');
1134 $action =
'createcontainer';
1135 } elseif (!preg_match(
'/^[a-z0-9\-\_]+$/i', $objectpage->pageurl)) {
1136 $langs->load(
"errors");
1137 setEventMessages($langs->transnoentities(
"ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities(
'WEBSITE_PAGENAME')),
null,
'errors');
1139 $action =
'createcontainer';
1141 if (empty($objectpage->title)) {
1142 $langs->load(
"errors");
1143 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"WEBSITE_TITLE")),
null,
'errors');
1145 $action =
'createcontainer';
1147 if ($objectpage->fk_page > 0 && empty($objectpage->lang)) {
1148 $langs->load(
"errors");
1149 setEventMessages($langs->trans(
"ErrorLanguageRequiredIfPageIsTranslationOfAnother"),
null,
'errors');
1151 $action =
'createcontainer';
1153 if ($objectpage->fk_page > 0 && !empty($objectpage->lang)) {
1154 if ($objectpage->lang == $website->lang) {
1155 $langs->load(
"errors");
1156 setEventMessages($langs->trans(
"ErrorLanguageMustNotBeSourceLanguageIfPageIsTranslationOfAnother"),
null,
'errors');
1158 $action =
'createcontainer';
1164 $pageid = $objectpage->create($user);
1168 $action =
'createcontainer';
1174 $categoriesarray =
GETPOST(
'categories',
'array');
1175 $result = $objectpage->setCategories($categoriesarray);
1184 if (empty($object->fk_default_home)) {
1185 $object->fk_default_home = $pageid;
1186 $res = $object->update($user);
1191 $filetpl = $pathofwebsite.
'/page'.$pageid.
'.tpl.php';
1194 $result =
dolSaveIndexPage($pathofwebsite, $fileindex, $filetpl, $filewrapper, $object);
1204 if (!empty($objectpage->content)) {
1205 $filealias = $pathofwebsite.
'/'.$objectpage->pageurl.
'.php';
1206 $filetpl = $pathofwebsite.
'/page'.$objectpage->id.
'.tpl.php';
1211 setEventMessages(
'Failed to write file '.basename($filealias),
null,
'errors');
1220 $action =
'createcontainer';
1227 setEventMessages($langs->trans(
"PageAdded", $objectpage->pageurl),
null,
'mesgs');
1234 $pageid = $objectpage->id;
1239 $pathtomedias = DOL_DATA_ROOT.
'/medias';
1240 $pathtomediasinwebsite = $pathofwebsite.
'/medias';
1242 dol_syslog(
"Create symlink for ".$pathtomedias.
" into name ".$pathtomediasinwebsite);
1243 dol_mkdir(dirname($pathtomediasinwebsite));
1244 $result = symlink($pathtomedias, $pathtomediasinwebsite);
1257 $htmlheadercontent =
"<html>\n";
1258 $htmlheadercontent .= $htmlheadercontentdefault;
1259 $htmlheadercontent .=
"</html>";
1264 $csscontent =
"/* CSS content (all pages) */\nbody.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }\n.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}";
1269 $jscontent =
"/* JS content (all pages) */\n";
1274 $robotcontent =
"# Robot file. Generated with Dolibarr\nUser-agent: *\nAllow: /public/\nDisallow: /administrator/";
1279 $htaccesscontent =
"# Order allow,deny\n# Deny from all";
1284 $manifestjsoncontent =
"";
1289 $readmecontent =
"Website generated by Dolibarr ERP CRM";
1294 $licensecontent =
"MIT License";
1298 $action =
'preview';
1303 if ($action ==
'confirm_deletesite' && $confirm ==
'yes' && $permissiontodelete) {
1308 $res = $object->fetch(
GETPOST(
'id',
'int'));
1312 $res = $object->delete($user);
1319 if (
GETPOST(
'delete_also_js',
'alpha') ==
'on') {
1320 $pathofwebsitejs = DOL_DATA_ROOT.
'/medias/js/'.$object->ref;
1324 if (
GETPOST(
'delete_also_medias',
'alpha') ==
'on') {
1325 $pathofwebsitemedias = DOL_DATA_ROOT.
'/medias/image/'.$object->ref;
1333 setEventMessages($langs->trans(
"SiteDeleted", $object->ref),
null,
'mesgs');
1335 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?id='.$object->id);
1344 if (
GETPOSTISSET(
'pageid') && $action ==
'delete' && $permissiontodelete && !
GETPOST(
'file_manager')) {
1349 $res = $object->fetch(0, $websitekey);
1352 $res = $objectpage->fetch($pageid, $object->id);
1355 $res = $objectpage->delete($user);
1364 setEventMessages($langs->trans(
"PageDeleted", $objectpage->pageurl, $websitekey),
null,
'mesgs');
1366 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$websitekey);
1375 $objectclass =
'WebsitePage';
1379 if (!$error && ($massaction ==
'delete' || ($action ==
'delete' && $confirm ==
'yes')) && $permissiontodelete) {
1382 $objecttmp =
new $objectclass($db);
1384 foreach ($toselect as $toselectid) {
1385 $result = $objecttmp->fetch($toselectid);
1387 $result = $objecttmp->delete($user);
1416 if ($action ==
'delete') {
1417 $mode =
'replacesite';
1419 $containertype =
GETPOST(
'optioncontainertype',
'aZ09') !=
'-1' ?
GETPOST(
'optioncontainertype',
'aZ09') :
'';
1420 $langcode =
GETPOST(
'optionlanguage',
'aZ09');
1421 $otherfilters = array();
1422 if (
GETPOST(
'optioncategory',
'int') > 0) {
1423 $otherfilters[
'category'] =
GETPOST(
'optioncategory',
'int');
1426 $listofpages =
getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters);
1431 if ($action ==
'updatecss' && $usercanedit) {
1434 $action =
'editcss';
1436 $res = $object->fetch(0, $websitekey);
1440 $tmpvirtualhost = preg_replace(
'/\/$/',
'',
GETPOST(
'virtualhost',
'alpha'));
1441 if ($tmpvirtualhost && !preg_match(
'/^http/', $tmpvirtualhost)) {
1443 setEventMessages($langs->trans(
'ErrorURLMustStartWithHttp', $langs->transnoentitiesnoconv(
"VirtualHost")),
null,
'errors');
1444 $action =
'editcss';
1448 $arrayotherlang = explode(
',',
GETPOST(
'WEBSITE_OTHERLANG',
'alphanohtml'));
1449 foreach ($arrayotherlang as $key => $val) {
1451 if (empty(trim($val)))
continue;
1452 $arrayotherlang[$key] = substr(trim($val), 0, 2);
1455 $object->virtualhost = $tmpvirtualhost;
1456 $object->lang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
1457 $object->otherlang = join(
',', $arrayotherlang);
1458 $object->use_manifest =
GETPOST(
'use_manifest',
'alpha');
1460 $result = $object->update($user);
1464 $action =
'editcss';
1470 if (($_FILES[
'addedfile'][
"name"] !=
'')) {
1471 $uploadfolder = $conf->website->dir_output.
'/'.$websitekey;
1472 if ($_FILES[
'addedfile'][
'type'] !=
'image/png') {
1476 $filetoread = realpath(
dol_osencode($_FILES[
'addedfile'][
'tmp_name']));
1477 $filesize = getimagesize($filetoread);
1478 if ($filesize[0] != $filesize[1]) {
1480 setEventMessages($langs->trans(
'ErrorFaviconMustBeASquaredImage'), array(),
'errors');
1482 if (! $error && ($filesize[0] != 16 && $filesize[0] != 32 && $filesize[0] != 64)) {
1492 $action =
'preview';
1494 $backtopage = preg_replace(
'/searchstring=[^&]*/',
'', $backtopage);
1495 header(
"Location: ".$backtopage);
1499 $action =
'editcss';
1518 $dataposted = trim(
GETPOST(
'WEBSITE_HTML_HEADER',
'none'));
1519 $dataposted = preg_replace(array(
'/<html>\n*/ims',
'/<\/html>\n*/ims'), array(
'',
''), $dataposted);
1520 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1523 $phpfullcodestringold =
'';
1527 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1529 if (!$errorphpcheck) {
1530 $htmlheadercontent =
'';
1542 $htmlheadercontent .= $dataposted.
"\n";
1557 $dataposted = trim(
GETPOST(
'WEBSITE_CSS_INLINE',
'none'));
1558 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1561 $phpfullcodestringold =
'';
1565 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1567 if (!$errorphpcheck) {
1570 $csscontent .=
"<?php // BEGIN PHP\n";
1571 $csscontent .=
'$websitekey=basename(__DIR__);'.
"\n";
1572 $csscontent .=
"if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n";
1573 $csscontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1574 $csscontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1575 $csscontent .=
"ob_start();\n";
1576 $csscontent .=
"if (! headers_sent()) { /* because file is included inline when in edit mode and we don't want warning */ \n";
1577 $csscontent .=
"header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1578 $csscontent .=
"header('Content-type: text/css');\n";
1579 $csscontent .=
"}\n";
1580 $csscontent .=
"// END PHP ?>\n";
1582 $csscontent .= $dataposted.
"\n";
1584 $csscontent .=
'<?php // BEGIN PHP'.
"\n";
1585 $csscontent .=
'$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "css");'.
"\n";
1586 $csscontent .=
"// END PHP ?>\n";
1588 dol_syslog(
"Save css content into ".$filecss);
1600 $dataposted = trim(
GETPOST(
'WEBSITE_JS_INLINE',
'none'));
1601 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1604 $phpfullcodestringold =
'';
1608 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1610 if (!$errorphpcheck) {
1613 $jscontent .=
"<?php // BEGIN PHP\n";
1614 $jscontent .=
'$websitekey=basename(__DIR__);'.
"\n";
1615 $jscontent .=
"if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n";
1616 $jscontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1617 $jscontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1618 $jscontent .=
"ob_start();\n";
1619 $jscontent .=
"header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1620 $jscontent .=
"header('Content-type: application/javascript');\n";
1621 $jscontent .=
"// END PHP ?>\n";
1623 $jscontent .= $dataposted.
"\n";
1625 $jscontent .=
'<?php // BEGIN PHP'.
"\n";
1626 $jscontent .=
'$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "js");'.
"\n";
1627 $jscontent .=
"// END PHP ?>\n";
1638 $dataposted = trim(
GETPOST(
'WEBSITE_ROBOT',
'restricthtml'));
1639 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1642 $phpfullcodestringold =
'';
1646 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1648 if (!$errorphpcheck) {
1661 $robotcontent .= $dataposted.
"\n";
1676 $dataposted = trim(
GETPOST(
'WEBSITE_HTACCESS',
'restricthtml'));
1677 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1680 $phpfullcodestringold =
'';
1684 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1686 if (!$errorphpcheck) {
1687 $htaccesscontent =
'';
1688 $htaccesscontent .= $dataposted.
"\n";
1700 $dataposted = trim(
GETPOST(
'WEBSITE_MANIFEST_JSON',
'none'));
1701 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1704 $phpfullcodestringold =
'';
1708 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1710 if (!$errorphpcheck) {
1711 $manifestjsoncontent =
'';
1713 $manifestjsoncontent .=
"<?php // BEGIN PHP\n";
1714 $manifestjsoncontent .=
'$websitekey=basename(__DIR__);'.
"\n";
1715 $manifestjsoncontent .=
"if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n";
1716 $manifestjsoncontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1717 $manifestjsoncontent .=
"require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1718 $manifestjsoncontent .=
"ob_start();\n";
1719 $manifestjsoncontent .=
"header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1720 $manifestjsoncontent .=
"header('Content-type: application/manifest+json');\n";
1721 $manifestjsoncontent .=
"// END PHP ?>\n";
1723 $manifestjsoncontent .= $dataposted.
"\n";
1725 $manifestjsoncontent .=
'<?php // BEGIN PHP'.
"\n";
1726 $manifestjsoncontent .=
'$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "manifest");'.
"\n";
1727 $manifestjsoncontent .=
"// END PHP ?>\n";
1732 setEventMessages(
'Failed to write file '.$filemanifestjson,
null,
'errors');
1738 $dataposted = trim(
GETPOST(
'WEBSITE_README',
'restricthtml'));
1739 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1742 $phpfullcodestringold =
'';
1746 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1748 if (!$errorphpcheck) {
1749 $readmecontent =
'';
1761 $readmecontent .= $dataposted.
"\n";
1776 $dataposted = trim(
GETPOST(
'WEBSITE_LICENSE',
'restricthtml'));
1777 $dataposted = str_replace(
'<?=',
'<?php', $dataposted);
1780 $phpfullcodestringold =
'';
1784 $errorphpcheck =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
1786 if (!$errorphpcheck) {
1787 $licensecontent =
'';
1799 $licensecontent .= $dataposted.
"\n";
1824 $action =
'preview';
1826 $backtopage = preg_replace(
'/searchstring=[^&]*/',
'', $backtopage);
1827 header(
"Location: ".$backtopage);
1831 $action =
'editcss';
1838 if ($action ==
'setashome' && $usercanedit) {
1840 $object->fetch(0, $websitekey);
1843 $object->fk_default_home = $pageid;
1844 $res = $object->update($user);
1853 $filetpl = $pathofwebsite.
'/page'.$pageid.
'.tpl.php';
1856 $result =
dolSaveIndexPage($pathofwebsite, $fileindex, $filetpl, $filewrapper, $object);
1864 $action =
'preview';
1871 if ($action ==
'updatemeta' && $usercanedit) {
1874 $result = $object->fetch(0, $websitekey);
1877 $objectpage->fk_website = $object->id;
1880 if (!preg_match(
'/^[a-z0-9\-\_]+$/i',
GETPOST(
'WEBSITE_PAGENAME',
'alpha'))) {
1882 $langs->load(
"errors");
1883 setEventMessages($langs->transnoentities(
"ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities(
'WEBSITE_PAGENAME')),
null,
'errors');
1884 $action =
'editmeta';
1887 $res = $objectpage->fetch($pageid, $object->id);
1890 setEventMessages(
'Page not found '.$objectpage->error, $objectpage->errors,
'errors');
1894 if (!$error &&
GETPOST(
'WEBSITE_PAGENAME',
'alpha')) {
1896 $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id,
GETPOST(
'WEBSITE_PAGENAME',
'alpha'));
1899 $langs->load(
"errors");
1900 setEventMessages($websitepagetemp->error, $websitepagetemp->errors,
'errors');
1901 $action =
'editmeta';
1905 $langs->load(
"errors");
1906 setEventMessages($langs->trans(
"ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl),
null,
'errors');
1907 $action =
'editmeta';
1911 $newaliasnames =
'';
1912 if (!$error &&
GETPOST(
'WEBSITE_ALIASALT',
'alpha')) {
1913 $arrayofaliastotest = explode(
',', str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_ALIASALT',
'alpha')));
1916 foreach ($arrayofaliastotest as $aliastotest) {
1917 $aliastotest = trim(preg_replace(
'/\.php$/i',
'', $aliastotest));
1920 if (preg_match(
'/^page\d+/i', $aliastotest)) {
1922 $langs->load(
"errors");
1924 $action =
'editmeta';
1927 $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id, $aliastotest);
1930 $langs->load(
"errors");
1931 setEventMessages($websitepagetemp->error, $websitepagetemp->errors,
'errors');
1932 $action =
'editmeta';
1937 $langs->load(
"errors");
1938 setEventMessages($langs->trans(
"ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl),
null,
'errors');
1939 $action =
'editmeta';
1942 $newaliasnames .= ($newaliasnames ?
', ' :
'').$aliastotest;
1948 $objectpage->old_object = clone $objectpage;
1950 $objectpage->title = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_TITLE',
'alphanohtml'));
1951 $objectpage->type_container =
GETPOST(
'WEBSITE_TYPE_CONTAINER',
'aZ09');
1952 $objectpage->pageurl =
GETPOST(
'WEBSITE_PAGENAME',
'alpha');
1953 $objectpage->aliasalt = $newaliasnames;
1954 $objectpage->lang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
1955 $objectpage->otherlang =
GETPOST(
'WEBSITE_OTHERLANG',
'aZ09comma');
1956 $objectpage->description = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_DESCRIPTION',
'alphanohtml'));
1957 $objectpage->image =
GETPOST(
'WEBSITE_IMAGE',
'alpha');
1958 $objectpage->keywords = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_KEYWORDS',
'alphanohtml'));
1959 $objectpage->allowed_in_frames =
GETPOST(
'WEBSITE_ALLOWED_IN_FRAMES',
'aZ09');
1960 $objectpage->htmlheader = trim(
GETPOST(
'htmlheader',
'none'));
1961 $objectpage->fk_page = (
GETPOST(
'pageidfortranslation',
'int') > 0 ?
GETPOST(
'pageidfortranslation',
'int') : 0);
1962 $objectpage->author_alias = trim(
GETPOST(
'WEBSITE_AUTHORALIAS',
'alphanohtml'));
1963 $objectpage->object_type =
GETPOST(
'WEBSITE_OBJECTCLASS',
'alpha');
1964 $objectpage->fk_object =
GETPOST(
'WEBSITE_OBJECTID',
'aZ09');
1966 $newdatecreation =
dol_mktime(
GETPOST(
'datecreationhour',
'int'),
GETPOST(
'datecreationmin',
'int'),
GETPOST(
'datecreationsec',
'int'),
GETPOST(
'datecreationmonth',
'int'),
GETPOST(
'datecreationday',
'int'),
GETPOST(
'datecreationyear',
'int'));
1967 if ($newdatecreation) {
1968 $objectpage->date_creation = $newdatecreation;
1971 $res = $objectpage->update($user);
1973 $langs->load(
"errors");
1974 if ($db->lasterrno ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1976 $langs->load(
"errors");
1977 setEventMessages($langs->trans(
"ErrorAPageWithThisNameOrAliasAlreadyExists"),
null,
'errors');
1978 $action =
'editmeta';
1981 $langs->load(
"errors");
1983 $action =
'editmeta';
1990 $categoriesarray =
GETPOST(
'categories',
'array');
1991 $result = $objectpage->setCategories($categoriesarray);
2005 $filemaster = $pathofwebsite.
'/master.inc.php';
2006 $fileoldalias = $pathofwebsite.
'/'.$objectpage->old_object->pageurl.
'.php';
2007 $filealias = $pathofwebsite.
'/'.$objectpage->pageurl.
'.php';
2018 if (!empty($fileoldalias)) {
2019 dol_syslog(
"We delete old alias page name=".$fileoldalias.
" to build a new alias page=".$filealias);
2023 if (empty($objectpage->lang) || !in_array($objectpage->lang, explode(
',', $object->otherlang))) {
2024 $dirname = dirname($fileoldalias);
2025 $filename = basename($fileoldalias);
2026 $sublangs = explode(
',', $object->otherlang);
2027 foreach ($sublangs as $sublang) {
2031 if (empty(trim($sublang)))
continue;
2032 $fileoldaliassub = $dirname.
'/'.$sublang.
'/'.$filename;
2038 if (!empty($objectpage->old_object->aliasalt)) {
2039 $tmpaltaliases = explode(
',', $objectpage->old_object->aliasalt);
2040 if (is_array($tmpaltaliases)) {
2041 foreach ($tmpaltaliases as $tmpaliasalt) {
2042 dol_syslog(
"We delete old alt alias pages name=".trim($tmpaliasalt));
2046 if (empty($objectpage->lang) || !in_array($objectpage->lang, explode(
',', $object->otherlang))) {
2047 $dirname = dirname($pathofwebsite.
'/'.trim($tmpaliasalt).
'.php');
2048 $filename = basename($pathofwebsite.
'/'.trim($tmpaliasalt).
'.php');
2049 $sublangs = explode(
',', $object->otherlang);
2050 foreach ($sublangs as $sublang) {
2054 if (empty(trim($sublang)))
continue;
2055 $fileoldaliassub = $dirname.
'/'.$sublang.
'/'.$filename;
2069 if (!empty($objectpage->aliasalt)) {
2070 $tmpaltaliases = explode(
',', $objectpage->aliasalt);
2071 if (is_array($tmpaltaliases)) {
2072 foreach ($tmpaltaliases as $tmpaliasalt) {
2073 if (trim($tmpaliasalt)) {
2074 $filealias = $pathofwebsite.
'/'.trim($tmpaliasalt).
'.php';
2077 setEventMessages(
'Failed to write file '.basename($filealias),
null,
'errors');
2093 $action =
'preview';
2095 $action =
'editmeta';
2101 $action =
'preview';
2107 if ($usercanedit && (($action ==
'updatesource' || $action ==
'updatecontent' || $action ==
'confirm_createfromclone' || $action ==
'confirm_createpagefromclone')
2108 || ($action ==
'preview' && (
GETPOST(
'refreshsite') ||
GETPOST(
'refreshpage') ||
GETPOST(
'preview'))))) {
2109 $object->fetch(0, $websitekey);
2112 if ($action ==
'confirm_createfromclone') {
2115 $objectnew =
new Website($db);
2116 $result = $objectnew->createFromClone($user,
GETPOST(
'id',
'int'),
GETPOST(
'siteref',
'aZ09'), (
GETPOST(
'newlang',
'aZ09') ?
GETPOST(
'newlang',
'aZ09') :
''));
2121 $action =
'preview';
2125 $object = $objectnew;
2127 $pageid = $object->fk_default_home;
2128 $websitekey =
GETPOST(
'siteref',
'aZ09');
2134 if ($action ==
'confirm_createpagefromclone') {
2135 $istranslation = (
GETPOST(
'is_a_translation',
'aZ09') ==
'on' ? 1 : 0);
2137 if ($istranslation) {
2138 if (
GETPOST(
'newlang',
'aZ09') == $objectpage->lang || !
GETPOST(
'newlang',
'aZ09')) {
2140 setEventMessages($langs->trans(
"LanguageMustNotBeSameThanClonedPage"),
null,
'errors');
2141 $action =
'preview';
2143 if (
GETPOST(
'newwebsite',
'int') != $object->id) {
2145 setEventMessages($langs->trans(
"WebsiteMustBeSameThanClonedPageIfTranslation"),
null,
'errors');
2146 $action =
'preview';
2153 $newwebsiteid =
GETPOST(
'newwebsite',
'int');
2154 $pathofwebsitenew = $pathofwebsite;
2156 $tmpwebsite =
new Website($db);
2157 if ($newwebsiteid > 0 && $newwebsiteid != $object->id) {
2158 $tmpwebsite->fetch($newwebsiteid);
2159 $pathofwebsitenew = $dolibarr_main_data_root.($conf->entity > 1 ?
'/'.$conf->entity :
'').
'/website/'.$tmpwebsite->ref;
2161 $tmpwebsite = $object;
2165 $resultpage = $objectpage->createFromClone($user, $pageid,
GETPOST(
'newpageurl',
'aZ09'), (
GETPOST(
'newlang',
'aZ09') ?
GETPOST(
'newlang',
'aZ09') :
''), $istranslation, $newwebsiteid,
GETPOST(
'newtitle',
'alphanohtml'));
2166 if ($resultpage < 0) {
2169 $action =
'createpagefromclone';
2173 $filetpl = $pathofwebsitenew.
'/page'.$resultpage->id.
'.tpl.php';
2174 $fileindex = $pathofwebsitenew.
'/index.php';
2175 $filewrapper = $pathofwebsitenew.
'/wrapper.php';
2184 if (empty($newwebsiteid) || $newwebsiteid == $object->id) {
2185 $pageid = $resultpage->id;
2197 $pathtomedias = DOL_DATA_ROOT.
'/medias';
2198 $pathtomediasinwebsite = $pathofwebsite.
'/medias';
2200 dol_syslog(
"Create symlink for ".$pathtomedias.
" into name ".$pathtomediasinwebsite);
2201 dol_mkdir(dirname($pathtomediasinwebsite));
2202 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2211 $objectpage->fk_website = $object->id;
2214 $res = $objectpage->fetch($pageid);
2217 if ($object->fk_default_home > 0) {
2218 $res = $objectpage->fetch($object->fk_default_home);
2221 $res = $objectpage->fetch(0, $object->id);
2226 if (!$error && $res > 0) {
2227 if ($action ==
'updatesource' || $action ==
'updatecontent') {
2232 $objectpage->content =
GETPOST(
'PAGE_CONTENT',
'none');
2237 $error =
checkPHPCode($phpfullcodestringold, $phpfullcodestring);
2240 if ($action ==
'updatesource') {
2241 $action =
'editsource';
2243 if ($action ==
'updatecontent') {
2244 $action =
'editcontent';
2249 $objectpage->content = preg_replace(
'/<head>.*<\/head>/ims',
'', $objectpage->content);
2253 $res = $objectpage->update($user);
2257 if ($action ==
'updatesource') {
2258 $action =
'editsource';
2260 if ($action ==
'updatecontent') {
2261 $action =
'editcontent';
2268 $filemaster = $pathofwebsite.
'/master.inc.php';
2270 $filealias = $pathofwebsite.
'/'.$objectpage->pageurl.
'.php';
2278 setEventMessages(
'Failed to write the master file file '.$filemaster,
null,
'errors');
2302 setEventMessages(
'Failed to write the alias file '.basename($filealias),
null,
'errors');
2312 header(
"Location: ".$backtopage);
2315 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$websitekey.
'&pageid='.$pageid);
2319 if ($action ==
'updatesource') {
2320 $action =
'editsource';
2322 if ($action ==
'updatecontent') {
2323 $action =
'editcontent';
2328 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$websitekey.
'&pageid='.$pageid);
2335 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$websitekey.
'&pageid='.$pageid);
2340 if (empty($websitekey) || $websitekey ==
'-1') {
2341 setEventMessages($langs->trans(
"NoWebSiteCreateOneFirst"),
null,
'warnings');
2344 setEventMessages($langs->trans(
"YouCanCreatePageOrImportTemplate"),
null,
'warnings');
2351 if ($action ==
'exportsite' && !empty($user->rights->website->export)) {
2352 $fileofzip = $object->exportWebSite();
2355 $file_name = basename($fileofzip);
2357 header(
"Content-Type: application/zip");
2358 header(
"Content-Disposition: attachment; filename=".$file_name);
2359 header(
"Content-Length: ".filesize($fileofzip));
2361 readfile($fileofzip);
2365 $action =
'preview';
2370 if ($action ==
'regeneratesite' && $usercanedit) {
2372 $pathtomedias = DOL_DATA_ROOT.
'/medias';
2373 $pathtomediasinwebsite = $pathofwebsite.
'/medias';
2375 dol_syslog(
"Create symlink for ".$pathtomedias.
" into name ".$pathtomediasinwebsite);
2376 dol_mkdir(dirname($pathtomediasinwebsite));
2377 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2379 setEventMessages($langs->trans(
"ErrorFieldToCreateSymLinkToMedias", $pathtomediasinwebsite, $pathtomedias),
null,
'errors');
2380 $action =
'preview';
2384 $result = $object->rebuildWebSiteFiles();
2386 setEventMessages($langs->trans(
"PagesRegenerated", $result),
null,
'mesgs');
2387 $action =
'preview';
2390 $action =
'preview';
2395 if ($action ==
'importsiteconfirm' && $usercanedit) {
2396 $dolibarrdataroot = preg_replace(
'/([\\/]+)$/i',
'', DOL_DATA_ROOT);
2397 $allowimportsite =
true;
2398 if (
dol_is_file($dolibarrdataroot.
'/installmodules.lock')) {
2399 $allowimportsite =
false;
2402 if ($allowimportsite) {
2403 if (empty($_FILES) && !
GETPOSTISSET(
'templateuserfile')) {
2404 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
2405 $action =
'importsite';
2407 if (!empty($_FILES) ||
GETPOSTISSET(
'templateuserfile')) {
2409 $pathtomedias = DOL_DATA_ROOT.
'/medias';
2410 $pathtomediasinwebsite = $pathofwebsite.
'/medias';
2412 dol_syslog(
"Create symlink for ".$pathtomedias.
" into name ".$pathtomediasinwebsite);
2413 dol_mkdir(dirname($pathtomediasinwebsite));
2414 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2416 setEventMessages($langs->trans(
"ErrorFieldToCreateSymLinkToMedias", $pathtomediasinwebsite, $pathtomedias),
null,
'errors');
2417 $action =
'importsite';
2424 $fileofzip = DOL_DATA_ROOT.
'/doctemplates/websites/'.
GETPOST(
'templateuserfile',
'alpha');
2425 } elseif (!empty($_FILES)) {
2427 if (is_array($_FILES[
'userfile'][
'tmp_name'])) {
2428 $userfiles = $_FILES[
'userfile'][
'tmp_name'];
2430 $userfiles = array($_FILES[
'userfile'][
'tmp_name']);
2434 foreach ($userfiles as $key => $userfile) {
2435 if (empty($_FILES[
'userfile'][
'tmp_name'][$key])) {
2437 if ($_FILES[
'userfile'][
'error'][$key] == 1 || $_FILES[
'userfile'][
'error'][$key] == 2) {
2439 $action =
'importsite';
2441 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"File")),
null,
'errors');
2442 $action =
'importsite';
2449 $upload_dir = DOL_DATA_ROOT.
'/doctemplates/websites/';
2463 $action =
'importsite';
2467 $result = $object->importWebSite($fileofzip);
2471 $action =
'importsite';
2474 dolibarr_set_const($db,
'WEBSITE_SUBCONTAINERSINLINE', 1,
'chaine', 0,
'', $conf->entity);
2476 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?website='.$object->ref);
2485 $message = $langs->trans(
'InstallModuleFromWebHasBeenDisabledContactUs');
2488 $message = $langs->trans(
"InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.
'/installmodules.lock');
2494 $domainname =
'0.0.0.0:8080';
2495 $tempdir = $conf->website->dir_output.
'/'.$websitekey.
'/';
2498 if ($action ==
'generatesitemaps' && $usercanedit) {
2499 $domtree =
new DOMDocument(
'1.0',
'UTF-8');
2501 $root = $domtree->createElementNS(
'http://www.sitemaps.org/schemas/sitemap/0.9',
'urlset');
2502 $root->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:xhtml',
'http://www.w3.org/1999/xhtml');
2504 $domtree->formatOutput =
true;
2506 $xmlname =
'sitemap.xml';
2508 $sql =
"SELECT wp.rowid, wp.type_container , wp.pageurl, wp.lang, wp.fk_page, wp.tms as tms,";
2509 $sql .=
" w.virtualhost, w.fk_default_home";
2510 $sql .=
" FROM ".MAIN_DB_PREFIX.
"website_page as wp, ".MAIN_DB_PREFIX.
"website as w";
2511 $sql .=
" WHERE wp.type_container IN ('page', 'blogpost')";
2512 $sql .=
" AND wp.fk_website = w.rowid";
2513 $sql .=
" AND wp.status = ".WebsitePage::STATUS_VALIDATED;
2514 $sql .=
" AND wp.pageurl NOT IN ('404', '500', '501', '503')";
2515 $sql .=
" AND w.ref = '".dol_escape_json($websitekey).
"'";
2516 $sql .=
" ORDER BY wp.tms DESC, wp.rowid DESC";
2517 $resql = $db->query($sql);
2519 $num_rows = $db->num_rows(
$resql);
2520 if ($num_rows > 0) {
2522 while ($i < $num_rows) {
2523 $objp = $db->fetch_object(
$resql);
2524 $url = $domtree->createElement(
'url');
2526 $shortlangcode =
'';
2528 $shortlangcode = substr($objp->lang, 0, 2);
2530 if (empty($shortlangcode)) {
2531 $shortlangcode = substr($object->lang, 0, 2);
2535 $pageurl = $objp->pageurl.
'.php';
2536 if ($objp->fk_default_home == $objp->rowid) {
2539 if ($shortlangcode != substr($object->lang, 0, 2)) {
2540 $pageurl = $shortlangcode.
'/'.$pageurl;
2544 if ($objp->virtualhost) {
2545 $domainname = $objp->virtualhost;
2547 if (! preg_match(
'/^http/i', $domainname)) {
2548 $domainname =
'https://'.$domainname;
2553 $loc = $domtree->createElement(
'loc', $domainname.
'/'.$pageurl);
2554 $lastmod = $domtree->createElement(
'lastmod',
dol_print_date($db->jdate($objp->tms),
'dayrfc',
'gmt'));
2555 $changefreq = $domtree->createElement(
'changefreq',
'weekly');
2556 $priority = $domtree->createElement(
'priority',
'1');
2558 $url->appendChild($loc);
2559 $url->appendChild($lastmod);
2561 if (!empty($conf->global->WEBSITE_SITEMAPS_ADD_WEEKLY_FREQ)) {
2562 $url->appendChild($changefreq);
2565 if ($objp->fk_default_home == $objp->rowid) {
2566 $url->appendChild($priority);
2570 if ($object->isMultiLang()) {
2571 $alternatefound = 0;
2574 $translationof = $objp->fk_page;
2575 if ($translationof) {
2577 $tmppage->fetch($translationof);
2578 if ($tmppage->id > 0) {
2579 $tmpshortlangcode =
'';
2580 if ($tmppage->lang) {
2581 $tmpshortlangcode = preg_replace(
'/[_-].*$/',
'', $tmppage->lang);
2583 if (empty($tmpshortlangcode)) {
2584 $tmpshortlangcode = preg_replace(
'/[_-].*$/',
'', $object->lang);
2586 if ($tmpshortlangcode != $shortlangcode) {
2587 $xhtmllink = $domtree->createElement(
'xhtml:link',
'');
2588 $xhtmllink->setAttribute(
"rel",
"alternate");
2589 $xhtmllink->setAttribute(
"hreflang", $tmpshortlangcode);
2590 $xhtmllink->setAttribute(
"href", $domainname.($objp->fk_default_home == $tmppage->id ?
'/' : (($tmpshortlangcode != substr($object->lang, 0, 2)) ?
'/'.$tmpshortlangcode :
'').
'/'.$tmppage->pageurl.
'.php'));
2591 $url->appendChild($xhtmllink);
2599 $sql =
'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.
'website_page';
2600 $sql .=
" WHERE status = ".((int) WebsitePage::STATUS_VALIDATED).
' AND fk_page IN ('.$db->sanitize($objp->rowid.($translationof ?
", ".$translationof :
"")).
")";
2601 $resqlhastrans = $db->query($sql);
2602 if ($resqlhastrans) {
2603 $num_rows_hastrans = $db->num_rows($resqlhastrans);
2604 if ($num_rows_hastrans > 0) {
2605 while ($objhastrans = $db->fetch_object($resqlhastrans)) {
2606 $tmpshortlangcode =
'';
2607 if ($objhastrans->lang) {
2608 $tmpshortlangcode = preg_replace(
'/[_-].*$/',
'', $objhastrans->lang);
2610 if ($tmpshortlangcode != $shortlangcode) {
2611 $xhtmllink = $domtree->createElement(
'xhtml:link',
'');
2612 $xhtmllink->setAttribute(
"rel",
"alternate");
2613 $xhtmllink->setAttribute(
"hreflang", $tmpshortlangcode);
2614 $xhtmllink->setAttribute(
"href", $domainname.($objp->fk_default_home == $objhastrans->id ?
'/' : (($tmpshortlangcode != substr($object->lang, 0, 2) ?
'/'.$tmpshortlangcode :
'')).
'/'.$objhastrans->pageurl.
'.php'));
2615 $url->appendChild($xhtmllink);
2625 if ($alternatefound) {
2627 $xhtmllink = $domtree->createElement(
'xhtml:link',
'');
2628 $xhtmllink->setAttribute(
"rel",
"alternate");
2629 $xhtmllink->setAttribute(
"hreflang", $shortlangcode);
2630 $xhtmllink->setAttribute(
"href", $domainname.
'/'.$pageurl);
2631 $url->appendChild($xhtmllink);
2647 $root->appendChild($url);
2650 $domtree->appendChild($root);
2651 if ($domtree->save($tempdir.$xmlname)) {
2652 if (!empty($conf->global->MAIN_UMASK)) {
2653 @chmod($tempdir.$xmlname, octdec($conf->global->MAIN_UMASK));
2655 setEventMessages($langs->trans(
"SitemapGenerated", $xmlname),
null,
'mesgs');
2665 $robotcontent = @file_get_contents($filerobot);
2666 $robotsitemap =
"Sitemap: ".$domainname.
"/".$xmlname;
2667 $result = strpos($robotcontent,
'Sitemap: ');
2669 $result = preg_replace(
'/Sitemap:.*/', $robotsitemap, $robotcontent);
2670 $robotcontent = $result ? $result : $robotcontent;
2672 $robotcontent .= $robotsitemap.
"\n";
2679 $action =
'preview';
2694 if ($action ==
'confirmgeneratesitemaps') {
2695 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?website='.urlencode($website->ref), $langs->trans(
'ConfirmSitemapsCreation'), $langs->trans(
'ConfirmGenerateSitemaps', $object->ref),
'generatesitemaps',
'',
"yes", 1);
2696 $action =
'preview';
2698 $helpurl =
'EN:Module_Website|FR:Module_Website_FR|ES:Módulo_Website';
2701 '/includes/ace/src/ace.js',
2702 '/includes/ace/src/ext-statusbar.js',
2703 '/includes/ace/src/ext-language_tools.js',
2707 $arrayofcss = array();
2712 $arrayofjs[] =
'includes/jquery/plugins/blockUI/jquery.blockUI.js';
2713 $arrayofjs[] =
'core/js/blockUI.js';
2714 if (empty($conf->global->MAIN_ECM_DISABLE_JS)) {
2715 $arrayofjs[] =
"includes/jquery/plugins/jqueryFileTree/jqueryFileTree.js";
2718 $moreheadjs .=
'<script type="text/javascript">'.
"\n";
2719 $moreheadjs .=
'var indicatorBlockUI = \''.DOL_URL_ROOT.
"/theme/".$conf->theme.
"/img/working.gif".
'\';
'."\n";
2720 $moreheadjs .= '</script>
'."\n";
2722 llxHeader($moreheadcss.$moreheadjs, $langs->trans("Website").(empty($website->ref) ? '' : ' -
'.$website->ref), $helpurl, '', 0, 0, $arrayofjs, $arrayofcss, '', '', '<!-- Begin div
class=
"fiche" -->
'."\n".'<div
class=
"fichebutwithotherclass">
');
2725 print '<!-- Open form
for all page -->
'."\n";
2726 print '<form action=
"'.$_SERVER["PHP_SELF
"].($action == 'file_manager' ? '?uploadform=1': '').'" method=
"POST" enctype=
"multipart/form-data" class=
"websiteformtoolbar">
';
2727 print '<input
type=
"hidden" name=
"token" value=
"'.newToken().'">
';
2728 print '<input
type=
"hidden" name=
"backtopage" value=
"'.$backtopage.'">
';
2729 print '<input
type=
"hidden" name=
"dol_openinpopup" value=
"'.$dol_openinpopup.'">
';
2731 if ($action == 'createsite
') {
2732 print '<input
type=
"hidden" name=
"action" value=
"addsite">
';
2734 if ($action == 'createcontainer
') {
2735 print '<input
type=
"hidden" name=
"action" value=
"addcontainer">
';
2737 if ($action == 'editcss
') {
2738 print '<input
type=
"hidden" name=
"action" value=
"updatecss">
';
2740 if ($action == 'editmenu
') {
2741 print '<input
type=
"hidden" name=
"action" value=
"updatemenu">
';
2743 if ($action == 'setashome
') {
2744 print '<input
type=
"hidden" name=
"action" value=
"updateashome">
';
2746 if ($action == 'editmeta
') {
2747 print '<input
type=
"hidden" name=
"action" value=
"updatemeta">
';
2749 if ($action == 'editsource
') {
2750 print '<input
type=
"hidden" name=
"action" value=
"updatesource">
';
2752 if ($action == 'editcontent
') {
2753 print '<input
type=
"hidden" name=
"action" value=
"updatecontent">
';
2755 if ($action == 'edit
') {
2756 print '<input
type=
"hidden" name=
"action" value=
"update">
';
2758 if ($action == 'importsite
') {
2759 print '<input
type=
"hidden" name=
"action" value=
"importsiteconfirm">
';
2761 if ($action == 'file_manager
') {
2762 print '<input
type=
"hidden" name=
"action" value=
"file_manager">
';
2765 print '<input
type=
"hidden" name=
"mode" value=
"'.$mode.'">
';
2770 // Add a margin under toolbar ?
2772 if ($action != 'preview
' && $action != 'editcontent
' && $action != 'editsource
' && !GETPOST('createpagefromclone
', 'alphanohtml
')) {
2773 $style = ' margin-bottom: 5px;
';
2777 if (!GETPOST('hide_websitemenu
')) {
2779 if (empty($user->rights->website->write)) {
2780 $disabled = ' disabled=
"disabled"';
2782 $disabledexport = '';
2783 if (empty($user->rights->website->export)) {
2784 $disabledexport = ' disabled=
"disabled"';
2789 $dataroot = DOL_DATA_ROOT.($conf->entity > 1 ? '/
'.$conf->entity : '').'/website/
'.$websitekey;
2790 if (!empty($object->virtualhost)) {
2791 $virtualurl = $object->virtualhost;
2796 if ($object->id > 0) {
2797 $array = $objectpage->fetchAll($object->id, 'ASC,ASC
', 'type_container,pageurl
');
2798 $object->lines = $array;
2800 if (!is_array($array) && $array < 0) {
2801 dol_print_error('', $objectpage->error, $objectpage->errors);
2803 $atleastonepage = (is_array($array) && count($array) > 0);
2805 $websitepage = new WebSitePage($db);
2806 if ($pageid > 0 && ($action == 'preview
' || $action == 'createfromclone
' || $action == 'createpagefromclone
')) {
2807 $websitepage->fetch($pageid);
2811 //var_dump($objectpage);exit;
2812 print '<div
class=
"centpercent websitebar'.(GETPOST('dol_openinpopup', 'aZ09') ? ' hidden' : '').'">
';
2815 // Toolbar for websites
2818 print '<!-- Toolbar
for website -->
';
2819 if ($action != 'file_manager
') {
2820 print '<div
class=
"websiteselection hideonsmartphoneimp minwidth75 tdoverflowmax100 inline-block">
';
2821 print $langs->trans("Website").':
';
2824 // Button Add new website
2825 $urltocreatenewwebsite = $_SERVER["PHP_SELF"].'?action=createsite
';
2826 print '<span
class=
"websiteselection paddingrightonly">
';
2827 print '<a href=
"'.$urltocreatenewwebsite.'" class=
""'.$disabled.' title=
"'.dol_escape_htmltag($langs->trans("AddWebsite
")).'"><span
class=
"fa fa-plus-circle valignmiddle btnTitle-icon"><span></a>
';
2831 print '<span
class=
"websiteselection nopaddingrightimp">
';
2834 $out .= '<select
name=
"website" class=
"minwidth100 width200 maxwidth150onsmartphone" id=
"website">
';
2835 if (empty($object->records)) {
2836 $out .= '<option value=
"-1"> </option>
';
2839 // Loop on each sites
2841 foreach ($object->records as $key => $valwebsite) {
2842 if (empty($websitekey)) {
2843 if ($action != 'createsite
') {
2844 $websitekey = $valwebsite->ref;
2848 $out .= '<option value=
"'.$valwebsite->ref.'"';
2849 if ($websitekey == $valwebsite->ref) {
2850 $out .= ' selected
'; // To preselect a value
2852 //$outoption = $valwebsite->getLibStatut(3).' '.$valwebsite->ref.' ';
2853 $outoption = (($valwebsite->status == $valwebsite::STATUS_DRAFT) ? '<span
class=
"opacitymedium">
' : '').$valwebsite->ref.(($valwebsite->status == $valwebsite::STATUS_DRAFT) ? '</span>
' : '');
2854 $out .= ' data-html=
"'.dol_escape_htmltag($outoption).'"';
2856 $out .= $valwebsite->ref;
2857 $out .= '</option>
';
2860 $out .= '</select>
';
2861 $out .= ajax_combobox('website
');
2863 if (!empty($conf->use_javascript_ajax)) {
2864 $out .= '<script
type=
"text/javascript">
';
2865 $out .= 'jQuery(document).ready(
function () {
';
2866 $out .= ' jQuery(
"#website").change(
function () {
';
2867 $out .= ' console.log(
"We select "+jQuery(
"#website option:selected").val());
';
2868 $out .= ' if (jQuery(
"#website option:selected").val() == \
'-2\') {';
2869 $out .=
' window.location.href = "'.dol_escape_js($urltocreatenewwebsite).
'";';
2870 $out .=
' } else {';
2871 $out .=
' window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?website="+jQuery("#website option:selected").val();';
2875 $out .=
'</script>';
2882 if (!empty($conf->use_javascript_ajax)) {
2883 print
'<span class="websiteselection">';
2888 if ($website->status == $website::STATUS_DRAFT) {
2889 $text_off =
'Offline';
2890 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=setwebsiteonline&token='.newToken().
'&website='.urlencode($website->ref).
'&websitepage='.((int) $websitepage->id).
'">'.img_picto($langs->trans($text_off),
'switch_off').
'</a>';
2892 $text_off =
'Online';
2893 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=setwebsiteoffline&token='.newToken().
'&website='.urlencode($website->ref).
'&websitepage='.((int) $websitepage->id).
'">'.img_picto($langs->trans($text_off),
'switch_on').
'</a>';
2899 if (empty($conf->use_javascript_ajax)) {
2900 print
'<span class="websiteselection">';
2901 print
'<input type="image" class="valignmiddle" src="'.img_picto(
'',
'refresh',
'', 0, 1).
'" name="refreshsite" value="'.$langs->trans(
"Load").
'">';
2906 print
'<span class="websiteselection">';
2908 if ($websitekey && $websitekey !=
'-1' && ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone' || $action ==
'deletesite')) {
2910 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?website='.urlencode($object->ref).
'&pageid='.((int) $pageid).
'&action=editcss&token='.
newToken().
'" class="button bordertransp" title="'.
dol_escape_htmltag($langs->trans(
"EditCss")).
'"'.$disabled.
'><span class="fa fa-cog paddingrightonly"></span><span class="hideonsmartphone">'.
dol_escape_htmltag($langs->trans(
"EditCss")).
'</span></a>';
2913 $importlabel = $langs->trans(
"ImportSite");
2914 $exportlabel = $langs->trans(
"ExportSite");
2915 if (!empty($conf->dol_optimize_smallscreen)) {
2916 $importlabel = $langs->trans(
"Import");
2917 $exportlabel = $langs->trans(
"Export");
2920 if ($atleastonepage) {
2921 print
'<input type="submit" class="button bordertransp" disabled="disabled" value="'.dol_escape_htmltag($importlabel).
'" name="importsite">';
2923 print
'<input type="submit" class="button bordertransp"'.$disabled.
' value="'.
dol_escape_htmltag($importlabel).
'" name="importsite">';
2927 print
'<input type="submit" class="button bordertransp"'.$disabledexport.
' value="'.
dol_escape_htmltag($exportlabel).
'" name="exportsite">';
2930 print
'<input type="submit" class="button bordertransp"'.$disabled.
' value="'.
dol_escape_htmltag($langs->trans(
"CloneSite")).
'" name="createfromclone">';
2933 if ($website->status == $website::STATUS_VALIDATED) {
2934 $disabled =
' disabled="disabled"';
2935 $title = $langs->trans(
"WebsiteMustBeDisabled", $langs->transnoentitiesnoconv($website->LibStatut(0, 0)));
2939 $title = $langs->trans(
"Delete");
2940 $url = $_SERVER[
"PHP_SELF"].
'?action=deletesite&token='.
newToken().
'&website='.urlencode($website->ref);
2942 print
'<a href="'.$url.
'" class="buttonDelete bordertransp'.($disabled ?
' disabled' :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($title).
'">'.
img_picto(
'',
'delete',
'class=""').
'<span class="hideonsmartphone paddingleft">'.$langs->trans(
"Delete").
'</span></a>';
2945 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=regeneratesite&token='.
newToken().
'&website='.urlencode($website->ref).
'" class="button bordertransp"'.$disabled.
' title="'.
dol_escape_htmltag($langs->trans(
"RegenerateWebsiteContent")).
'"><span class="far fa-hdd"></span></a>';
2948 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=confirmgeneratesitemaps&token='.
newToken().
'&website='.urlencode($website->ref).
'" class="button bordertransp"'.$disabled.
' title="'.
dol_escape_htmltag($langs->trans(
"GenerateSitemaps")).
'"><span class="fa fa-sitemap"></span></a>';
2951 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?mode=replacesite&website='.urlencode($website->ref).
'" class="button bordertransp"'.$disabled.
' title="'.
dol_escape_htmltag($langs->trans(
"ReplaceWebsiteContent")).
'"><span class="fa fa-search"></span></a>';
2956 if ($websitekey && $websitekey !=
'-1' && ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone' || $action ==
'deletesite')) {
2957 print
'<span class="websiteselection">';
2959 print
dolButtonToOpenUrlInDialogPopup(
'file_manager', $langs->transnoentitiesnoconv(
"MediaFiles"),
'<span class="fa fa-image"></span>',
'/website/index.php?action=file_manager&website='.urlencode($website->ref).
'§ion_dir='.urlencode(
'image/'.$website->ref.
'/'), $disabled);
2963 print
dolButtonToOpenUrlInDialogPopup(
'categories', $langs->transnoentitiesnoconv(
"Categories"),
'<span class="fa fa-tags"></span>',
'/categories/index.php?leftmenu=website&nosearch=1&type=website_page&website='.urlencode($website->ref), $disabled);
2969 print
'<input type="hidden" name="website" id="website" value="'.$websitekey.
'">';
2973 print
'<span class="websitetools">';
2975 if ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone' || $action ==
'deletesite') {
2976 $urlext = $virtualurl;
2977 $urlint = $urlwithroot.
'/public/website/index.php?website='.$websitekey;
2979 print
'<span class="websiteinputurl valignmiddle" id="websiteinputurl">';
2980 $linktotestonwebserver =
'<a href="'.($virtualurl ? $virtualurl :
'#').
'" class="valignmiddle">';
2981 $linktotestonwebserver .=
'<span class="hideonsmartphone paddingrightonly">'.$langs->trans(
"TestDeployOnWeb", $virtualurl).
'</span>'.
img_picto(
'',
'globe');
2982 $linktotestonwebserver .=
'</a>';
2984 if (empty($object->fk_default_home)) {
2985 $htmltext .=
'<br><span class="error">'.$langs->trans(
"YouMustDefineTheHomePage").
'</span><br><br>';
2986 } elseif (empty($virtualurl)) {
2989 $htmltext .=
'<br><center>'.$langs->trans(
"GoTo").
' <a href="'.$virtualurl.
'" target="_website">'.$virtualurl.
'</a></center><br>';
2991 if (!empty($conf->global->WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER)) {
2992 $htmltext .=
'<!-- Message defined translate key set into WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER -->';
2993 $htmltext .=
'<br>'.$langs->trans($conf->global->WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER);
2995 $htmltext .= $langs->trans(
"SetHereVirtualHost", $dataroot);
2996 $htmltext .=
'<br>';
2997 $htmltext .=
'<br>'.$langs->trans(
"CheckVirtualHostPerms", $langs->transnoentitiesnoconv(
"ReadPerm"), DOL_DOCUMENT_ROOT);
2998 $htmltext .=
'<br>'.$langs->trans(
"CheckVirtualHostPerms", $langs->transnoentitiesnoconv(
"WritePerm"),
'{s1}');
2999 $htmltext = str_replace(
'{s1}', DOL_DATA_ROOT.
'/website<br>'.DOL_DATA_ROOT.
'/medias', $htmltext);
3001 $examplewithapache =
'#php_admin_value open_basedir /tmp/:'.DOL_DOCUMENT_ROOT.
':'.DOL_DATA_ROOT.
':/dev/urandom'.
"\n";
3002 $examplewithapache .=
'<Directory "'.DOL_DOCUMENT_ROOT.
'">'.
"\n";
3003 $examplewithapache .=
'AllowOverride FileInfo Options
3004 Options -Indexes -MultiViews -FollowSymLinks -ExecCGI
3007 <Directory "'.DOL_DATA_ROOT.
'/website">
3008 AllowOverride FileInfo Options
3009 Options -Indexes -MultiViews +FollowSymLinks -ExecCGI
3012 <Directory "'.DOL_DATA_ROOT.
'/medias">
3013 AllowOverride FileInfo Options
3014 Options -Indexes -MultiViews -FollowSymLinks -ExecCGI
3018 $htmltext .=
'<br>'.$langs->trans(
"ExampleToUseInApacheVirtualHostConfig").
':<br>';
3019 $htmltext .=
'<div class="centpercent exampleapachesetup">'.dol_nl2br(
dol_escape_htmltag($examplewithapache, 1, 1)).
'</div>';
3021 $htmltext .=
'<br>';
3022 $htmltext .= $langs->trans(
"YouCanAlsoTestWithPHPS", $dataroot);
3023 $htmltext .=
'<br>';
3024 $htmltext .=
'<br>';
3025 $htmltext .= $langs->trans(
"YouCanAlsoDeployToAnotherWHP");
3027 print
$form->textwithpicto($linktotestonwebserver, $htmltext, 1,
'none',
'valignmiddle', 0, 3,
'helpvirtualhost');
3031 if (in_array($action, array(
'editcss',
'editmenu',
'file_manager',
'replacesiteconfirm')) || in_array($mode, array(
'replacesite'))) {
3032 if ($action ==
'editcss') {
3033 print
'<input type="submit" id="savefileandstay" class="button buttonforacesave hideonsmartphone small" value="'.dol_escape_htmltag($langs->trans(
"SaveAndStay")).
'" name="updateandstay">';
3035 if (preg_match(
'/^create/', $action) && $action !=
'file_manager' && $action !=
'replacesite' && $action !=
'replacesiteconfirm') {
3036 print
'<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'" name="update">';
3038 if (preg_match(
'/^edit/', $action) && $action !=
'file_manager' && $action !=
'replacesite' && $action !=
'replacesiteconfirm') {
3039 print
'<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'" name="update">';
3041 if ($action !=
'preview') {
3042 print
'<input type="submit" class="button button-cancel small" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'" name="cancel">';
3052 if ($websitekey && $websitekey !=
'-1' && (!in_array($action, array(
'editcss',
'editmenu',
'importsite',
'file_manager',
'replacesiteconfirm'))) && (!in_array($mode, array(
'replacesite'))) && !$file_manager) {
3055 print
'<!-- Toolbar for websitepage -->';
3056 print
'<div class="centpercent websitebar"'.($style ?
' style="'.$style.
'"' :
'').
'">';
3058 print
'<div class="websiteselection hideonsmartphoneimp minwidth75 tdoverflowmax100 inline-block">';
3059 print $langs->trans(
"PageContainer").
': ';
3063 print
'<span class="websiteselection paddingrightonly">';
3064 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=createcontainer&token='.
newToken().
'&website='.urlencode($website->ref).
'" class=""'.$disabled.
' title="'.
dol_escape_htmltag($langs->trans(
"AddPage")).
'"><span class="fa fa-plus-circle valignmiddle btnTitle-icon"></span></a>';
3070 $s = $formwebsite->selectContainer($website,
'pageid', $pageid, 0, $action,
'minwidth100 maxwidth200onsmartphone');
3072 $out .=
'<span class="websiteselection nopaddingrightimp">';
3076 $urltocreatenewpage = $_SERVER[
"PHP_SELF"].
'?action=createcontainer&token='.
newToken().
'&website='.urlencode($website->ref);
3078 if (!empty($conf->use_javascript_ajax)) {
3079 $out .=
'<script type="text/javascript">';
3080 $out .=
'jQuery(document).ready(function () {';
3081 $out .=
' jQuery("#pageid").change(function () {';
3082 $out .=
' console.log("We select "+jQuery("#pageid option:selected").val());';
3083 $out .=
' if (jQuery("#pageid option:selected").val() == \'-2\') {';
3084 $out .=
' window.location.href = "'.$urltocreatenewpage.
'";';
3085 $out .=
' } else {';
3086 $out .=
' window.location.href = "'.$_SERVER[
"PHP_SELF"].
'?website='.urlencode($website->ref).
'&pageid="+jQuery("#pageid option:selected").val();';
3090 $out .=
'</script>';
3095 if (!empty($conf->use_javascript_ajax)) {
3096 print
'<span class="websiteselection">';
3098 if ($object->status == $object::STATUS_DRAFT) {
3099 $text_off =
'SetWebsiteOnlineBefore';
3100 if ($websitepage->status == $websitepage::STATUS_DRAFT) {
3101 print
'<span class="valignmiddle disabled opacitymedium">'.img_picto($langs->trans($text_off),
'switch_off').
'</span>';
3103 print
'<span class="valignmiddle disabled opacitymedium">'.img_picto($langs->trans($text_off),
'switch_on').
'</span>';
3106 print
ajax_object_onoff($websitepage,
'status',
'status',
'Online',
'Offline', array(),
'valignmiddle'.(empty($websitepage->id) ?
' opacitymedium disabled' :
''),
'statuswebsitepage');
3112 print
'<span class="websiteselection">';
3114 print
'<input type="image" class="valignmiddle buttonwebsite" src="'.img_picto(
'',
'refresh',
'', 0, 1).
'" name="refreshpage" value="'.$langs->trans(
"Load").
'"'.(($action !=
'editsource') ?
'' :
' disabled="disabled"').
'>';
3117 $pagepreviousid = 0;
3120 $sql =
"SELECT MAX(rowid) as pagepreviousid FROM ".MAIN_DB_PREFIX.
"website_page WHERE rowid < ".((int) $pageid).
" AND fk_website = ".((int) $object->id);
3121 $resql = $db->query($sql);
3123 $obj = $db->fetch_object(
$resql);
3125 $pagepreviousid = $obj->pagepreviousid;
3130 $sql =
"SELECT MIN(rowid) as pagenextid FROM ".MAIN_DB_PREFIX.
"website_page WHERE rowid > ".((int) $pageid).
" AND fk_website = ".((int) $object->id);
3131 $resql = $db->query($sql);
3133 $obj = $db->fetch_object(
$resql);
3135 $pagenextid = $obj->pagenextid;
3142 if ($pagepreviousid) {
3143 print
'<a class="valignmiddle" href="'.$_SERVER[
'PHP_SELF'].
'?website='.urlencode($object->ref).
'&pageid='.((int) $pagepreviousid).
'&action='.urlencode($action).
'&token='.
newToken().
'">'.
img_previous($langs->trans(
"PreviousContainer")).
'</a>';
3145 print
'<span class="valignmiddle opacitymedium">'.img_previous($langs->trans(
"PreviousContainer")).
'</span>';
3148 print
'<a class="valignmiddle" href="'.$_SERVER[
'PHP_SELF'].
'?website='.urlencode($object->ref).
'&pageid='.((int) $pagenextid).
'&action='.urlencode($action).
'&token='.
newToken().
'">'.
img_next($langs->trans(
"NextContainer")).
'</a>';
3150 print
'<span class="valignmiddle opacitymedium">'.img_next($langs->trans(
"NextContainer")).
'</span>';
3155 if ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone' || $action ==
'deletesite') {
3157 if (empty($user->rights->website->write)) {
3158 $disabled =
' disabled="disabled"';
3162 if ($action ==
'deletesite') {
3164 $formquestion = array(
3165 array(
'type' =>
'checkbox',
'name' =>
'delete_also_js',
'label' => $langs->trans(
"DeleteAlsoJs"),
'value' => 0),
3166 array(
'type' =>
'checkbox',
'name' =>
'delete_also_medias',
'label' => $langs->trans(
"DeleteAlsoMedias"),
'value' => 0),
3171 if ($atleastonepage) {
3172 $langs->load(
"errors");
3173 $formquestion[] = array(
'type' =>
'onecolumn',
'value' =>
'<div class="warning">'.$langs->trans(
"WarningPagesWillBeDeleted").
'</div>');
3176 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteWebsite'),
'',
'confirm_deletesite', $formquestion, 0, 1, 210 + ($atleastonepage ? 70 : 0), 580);
3182 if ($action ==
'createfromclone') {
3184 $formquestion = array(
3185 array(
'type' =>
'text',
'name' =>
'siteref',
'label'=> $langs->trans(
"WebSite"),
'value'=>
'copy_of_'.$object->ref)
3188 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'CloneSite'),
'',
'confirm_createfromclone', $formquestion, 0, 1, 200);
3193 if ($pageid > 0 && $atleastonepage) {
3195 if ($action ==
'createpagefromclone') {
3197 $preselectedlanguage =
GETPOST(
'newlang',
'aZ09') ?
GETPOST(
'newlang',
'aZ09') :
'';
3198 $onlylang = array();
3199 if ($website->otherlang) {
3200 if (!empty($website->lang)) {
3201 $onlylang[$website->lang] = $website->lang.
' ('.$langs->trans(
"Default").
')';
3203 foreach (explode(
',', $website->otherlang) as $langkey) {
3204 if (empty(trim($langkey)))
continue;
3205 $onlylang[$langkey] = $langkey;
3207 $textifempty = $langs->trans(
"Default");
3209 $onlylang[
'none'] =
'none';
3210 $textifempty = $langs->trans(
"Default");
3212 $formquestion = array(
3213 array(
'type' =>
'hidden',
'name' =>
'sourcepageurl',
'value'=> $objectpage->pageurl),
3214 array(
'type' =>
'other',
'tdclass'=>
'fieldrequired',
'name' =>
'newwebsite',
'label' => $langs->trans(
"WebSite"),
'value' => $formwebsite->selectWebsite($object->id,
'newwebsite', 0)),
3215 array(
'type' =>
'text',
'tdclass'=>
'maxwidth200 fieldrequired',
'moreattr'=>
'autofocus="autofocus"',
'name' =>
'newtitle',
'label'=> $langs->trans(
"WEBSITE_TITLE"),
'value'=> $langs->trans(
"CopyOf").
' '.$objectpage->title),
3216 array(
'type' =>
'text',
'tdclass'=>
'maxwidth200',
'name' =>
'newpageurl',
'label'=> $langs->trans(
"WEBSITE_PAGENAME"),
'value'=>
'')
3218 if (count($onlylang) > 1) {
3219 $formquestion[] = array(
'type' =>
'checkbox',
'tdclass'=>
'maxwidth200',
'name' =>
'is_a_translation',
'label' => $langs->trans(
"PageIsANewTranslation"),
'value' => 0,
'morecss'=>
'margintoponly');
3222 $value= $formadmin->select_language($preselectedlanguage,
'newlang', 0,
null, $textifempty, 0, 0,
'minwidth200', 1, 0, 0, $onlylang, 1);
3223 $formquestion[] = array(
'type' =>
'other',
'name' =>
'newlang',
'label' =>
$form->textwithpicto($langs->trans(
"Language"), $langs->trans(
"DefineListOfAltLanguagesInWebsiteProperties")),
'value' => $value);
3225 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$pageid, $langs->trans(
'ClonePage'),
'',
'confirm_createpagefromclone', $formquestion, 0, 1, 300, 550);
3230 print
'<span class="websiteselection">';
3233 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$pageid.
'&action=editmeta&token='.
newToken().
'" class="button bordertransp" title="'.
dol_escape_htmltag($langs->trans(
"EditPageMeta")).
'"'.$disabled.
'><span class="fa fa-cog paddingrightonly"></span><span class="hideonsmartphone">'.
dol_escape_htmltag($langs->trans(
"EditPageMeta")).
'</span></a>';
3236 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$pageid.
'&action=editsource&token='.
newToken().
'" class="button bordertransp"'.$disabled.
'>'.
dol_escape_htmltag($langs->trans($conf->dol_optimize_smallscreen ?
"HTML" :
"EditHTMLSource")).
'</a>';
3241 print
'<!-- button EditInLine and ShowSubcontainers -->'.
"\n";
3242 print
'<div class="websiteselectionsection inline-block">';
3244 print
'<div class="inline-block marginrightonly">';
3245 print $langs->trans(
"ShowSubcontainers");
3246 if (empty($conf->global->WEBSITE_SUBCONTAINERSINLINE)) {
3247 print
'<a class="nobordertransp nohoverborder marginleftonlyshort valignmiddle"'.$disabled.
' href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$websitepage->id.
'&action=setshowsubcontainers&token='.
newToken().
'">'.
img_picto($langs->trans(
"ShowSubContainersOnOff", $langs->transnoentitiesnoconv(
"Off")),
'switch_off',
'',
false, 0, 0,
'',
'nomarginleft').
'</a>';
3249 print
'<a class="nobordertransp nohoverborder marginleftonlyshort valignmiddle"'.$disabled.
' href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$websitepage->id.
'&action=unsetshowsubcontainers&token='.
newToken().
'">'.
img_picto($langs->trans(
"ShowSubContainersOnOff", $langs->transnoentitiesnoconv(
"On")),
'switch_on',
'',
false, 0, 0,
'',
'nomarginleft').
'</a>';
3253 print
'<div class="inline-block marginrightonly">';
3255 print
'<span id="switchckeditorinline">'.
"\n";
3256 print
'<!-- Code to enabled edit inline ckeditor -->'.
"\n";
3257 print
'<script type="text/javascript">
3258 $(document).ready(function() {
3259 var isEditingEnabled = '.(getDolGlobalString(
"WEBSITE_EDITINLINE") ?
'true' :
'false').
';
3260 if (isEditingEnabled)
3262 switchEditorOnline(true);
3265 $( "#switchckeditorinline" ).click(function() {
3266 switchEditorOnline();
3269 function switchEditorOnline(forceenable)
3271 if (! isEditingEnabled || forceenable)
3273 console.log("Enable inline edit");
3274 jQuery(\'section[contenteditable="true"],div[contenteditable="true"]\').each(function(idx){
3275 var idtouse = $(this).attr(\'id\');
3276 console.log("Enable inline edit for "+idtouse);
3277 CKEDITOR.inline(idtouse, {
3278 // Allow some non-standard markup that we used in the introduction.
3279 extraAllowedContent: \'span(*);cite(*);q(*);dl(*);dt(*);dd(*);ul(*);li(*);header(*);button(*);h1(*);h2(*);\',
3280 //extraPlugins: \'sourcedialog\',
3281 removePlugins: \'flash,stylescombo,exportpdf,scayt,wsc,pagebreak,iframe,smiley\',
3282 // Show toolbar on startup (optional).
3283 // startupFocus: true
3287 isEditingEnabled = true;
3290 console.log("Disable inline edit");
3291 for(name in CKEDITOR.instances)
3293 CKEDITOR.instances[name].destroy(true);
3295 isEditingEnabled = false;
3300 print $langs->trans(
"EditInLine");
3304 $disableeditinline = 0;
3305 if ($disableeditinline) {
3307 print
'<a class="nobordertransp opacitymedium nohoverborder marginleftonlyshort"'.$disabled.
' href="#" disabled="disabled" title="'.
dol_escape_htmltag($langs->trans(
"OnlyEditionOfSourceForGrabbedContent")).
'">'.
img_picto($langs->trans(
"OnlyEditionOfSourceForGrabbedContent"),
'switch_off',
'',
false, 0, 0,
'',
'nomarginleft').
'</a>';
3310 if (empty($conf->global->WEBSITE_EDITINLINE)) {
3311 print
'<a class="nobordertransp nohoverborder marginleftonlyshort valignmiddle"'.$disabled.
' href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$websitepage->id.
'&action=seteditinline&token='.
newToken().
'">'.
img_picto($langs->trans(
"EditInLineOnOff", $langs->transnoentitiesnoconv(
"Off")),
'switch_off',
'',
false, 0, 0,
'',
'nomarginleft').
'</a>';
3313 print
'<a class="nobordertransp nohoverborder marginleftonlyshort valignmiddle"'.$disabled.
' href="'.$_SERVER[
"PHP_SELF"].
'?website='.$object->ref.
'&pageid='.$websitepage->id.
'&action=unseteditinline&token='.
newToken().
'">'.
img_picto($langs->trans(
"EditInLineOnOff", $langs->transnoentitiesnoconv(
"On")),
'switch_on',
'',
false, 0, 0,
'',
'nomarginleft').
'</a>';
3322 if ($object->fk_default_home > 0 && $pageid == $object->fk_default_home) {
3326 print
'<a href="#" class="button bordertransp disabled" disabled="disabled" title="'.dol_escape_htmltag($langs->trans(
"SetAsHomePage")).
'"><span class="fa fa-home valignmiddle btnTitle-icon"></span></a>';
3330 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=setashome&token='.
newToken().
'&website='.urlencode($website->ref).
'&pageid='.((int) $pageid).
'" class="button bordertransp"'.$disabled.
' title="'.
dol_escape_htmltag($langs->trans(
"SetAsHomePage")).
'"><span class="fa fa-home valignmiddle btnTitle-icon"></span></a>';
3332 print
'<input type="submit" class="button bordertransp"'.$disabled.
' value="'.
dol_escape_htmltag($langs->trans(
"ClonePage")).
'" name="createpagefromclone">';
3335 if ($websitepage->status != $websitepage::STATUS_DRAFT) {
3336 $disabled =
' disabled="disabled"';
3337 $title = $langs->trans(
"WebpageMustBeDisabled", $langs->transnoentitiesnoconv($websitepage->LibStatut(0, 0)));
3342 $url = $_SERVER[
"PHP_SELF"].
'?action=delete&token='.
newToken().
'&pageid='.((int) $websitepage->id).
'&website='.urlencode($website->ref);
3344 print
'<a href="'.$url.
'" class="buttonDelete bordertransp'.($disabled ?
' disabled' :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($title).
'">'.
img_picto(
'',
'delete',
'class=""').
'<span class="hideonsmartphone paddingleft">'.$langs->trans(
"Delete").
'</span></a>';
3350 print
'<span class="websitetools">';
3352 if (($pageid > 0 && $atleastonepage) && ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone' || $action ==
'deletesite')) {
3353 $realpage = $urlwithroot.
'/public/website/index.php?website='.$websitekey.
'&pageref='.$websitepage->pageurl;
3354 $pagealias = $websitepage->pageurl;
3356 $htmltext = $langs->trans(
"PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv(
"Page"), $langs->transnoentitiesnoconv(
"Page"), $realpage, $dataroot);
3357 $htmltext .=
'<br>'.$langs->trans(
"CheckVirtualHostPerms", $langs->transnoentitiesnoconv(
"ReadPerm"),
'{s1}');
3358 $htmltext = str_replace(
'{s1}', $dataroot.
'<br>'.DOL_DATA_ROOT.
'/medias<br>'.DOL_DOCUMENT_ROOT, $htmltext);
3362 print
'<div class="websiteinputurl inline-block paddingright">';
3363 print
'<a class="websitebuttonsitepreview inline-block" id="previewpage" href="'.$realpage.
'&nocache='.
dol_now().
'" class="button" target="tab'.$websitekey.
'" alt="'.
dol_escape_htmltag($htmltext).
'">';
3364 print
$form->textwithpicto(
'', $htmltext, 1,
'preview');
3388 if (!in_array($mode, array(
'replacesite')) && !in_array($action, array(
'editcss',
'editmenu',
'file_manager',
'replacesiteconfirm',
'createsite',
'createcontainer',
'createfromclone',
'createpagefromclone',
'deletesite'))) {
3389 if ($action ==
'editsource' || $action ==
'editmeta') {
3390 print
'<input type="submit" id="savefileandstay" class="button buttonforacesave hideonsmartphone small" value="'.dol_escape_htmltag($langs->trans(
"SaveAndStay")).
'" name="updateandstay">';
3392 if (preg_match(
'/^create/', $action)) {
3393 print
'<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'" name="update">';
3395 if (preg_match(
'/^edit/', $action)) {
3396 print
'<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'" name="update">';
3398 if ($action !=
'preview') {
3399 print
'<input type="submit" class="button button-cancel small" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'" name="cancel">';
3405 print
'<span class="websitehelp">';
3406 if ($action ==
'editsource' || $action ==
'editcontent' ||
GETPOST(
'editsource',
'alpha') ||
GETPOST(
'editcontent',
'alpha')) {
3407 $url =
'https://wiki.dolibarr.org/index.php/Module_Website';
3409 $htmltext = $langs->transnoentitiesnoconv(
"YouCanEditHtmlSource", $url);
3410 $htmltext .= $langs->transnoentitiesnoconv(
"YouCanEditHtmlSource2", $url);
3411 $htmltext .= $langs->transnoentitiesnoconv(
"YouCanEditHtmlSourceMore", $url);
3412 $htmltext .=
'<br>';
3413 if ($conf->browser->layout ==
'phone') {
3414 print
$form->textwithpicto(
'', $htmltext, 1,
'help',
'inline-block', 1, 2,
'tooltipsubstitution');
3417 print
$form->textwithpicto($langs->trans(
"SyntaxHelp").
' '.
img_help(2, $langs->trans(
"SyntaxHelp")), $htmltext, 1,
'none',
'inline-block', 1, 2,
'tooltipsubstitution');
3423 if ($action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone') {
3425 if (!empty($conf->use_javascript_ajax)) {
3426 print
'<script type="text/javascript">
3427 jQuery(document).ready(function() {
3428 jQuery("#websiteinputurl").keyup(function() {
3429 console.log("Website external url modified "+jQuery("#previewsiteurl").val());
3430 if (jQuery("#previewsiteurl").val() != "" && jQuery("#previewsiteurl").val().startsWith("http"))
3432 jQuery("a.websitebuttonsitepreviewdisabled img").css({ opacity: 1 });
3434 else jQuery("a.websitebuttonsitepreviewdisabled img").css({ opacity: 0.2 });
3438 jQuery("#previewsiteext,#previewpageext").click(function() {
3440 newurl=jQuery("#previewsiteurl").val();
3441 if (! newurl.startsWith("http"))
3443 alert(\''.dol_escape_js($langs->trans(
"ErrorURLMustStartWithHttp")).
'\');
3447 newpage=jQuery(
"#previewsiteurl").val() +
"/" + jQuery(
"#previewpageurl").val() +
".php";
3448 console.log(
"Open url "+newurl);
3452 url:
"'.DOL_URL_ROOT.'/core/ajax/saveinplace.php",
3454 field: \
'editval_virtualhost\',
3455 element: \'website\',
3456 table_element: \'website\',
3457 fk_element: '.((int) $object->id).
',
3460 context: document.body
3463 jQuery("#previewsiteext").attr("href",newurl);
3464 jQuery("#previewpageext").attr("href",newpage);
3483 if ($action ==
'editcss') {
3484 print
'<div class="fiche">';
3489 $csscontent = @file_get_contents($filecss);
3491 $csscontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $csscontent);
3493 $csscontent =
GETPOST(
'WEBSITE_CSS_INLINE',
'none');
3495 if (!trim($csscontent)) {
3496 $csscontent =
'/* CSS content (all pages) */'.
"\nbody.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; }\n.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;}";
3500 $jscontent = @file_get_contents($filejs);
3502 $jscontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $jscontent);
3504 $jscontent =
GETPOST(
'WEBSITE_JS_INLINE',
'none');
3506 if (!trim($jscontent)) {
3507 $jscontent =
'/* JS content (all pages) */'.
"\n";
3511 $htmlheadercontent = @file_get_contents($filehtmlheader);
3513 $htmlheadercontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $htmlheadercontent);
3515 $htmlheadercontent =
GETPOST(
'WEBSITE_HTML_HEADER',
'none');
3517 if (!trim($htmlheadercontent)) {
3518 $htmlheadercontent =
"<html>\n";
3519 $htmlheadercontent .= $htmlheadercontentdefault;
3520 $htmlheadercontent .=
"</html>";
3522 $htmlheadercontent = preg_replace(
'/^\s*<html>/ims',
'', $htmlheadercontent);
3523 $htmlheadercontent = preg_replace(
'/<\/html>\s*$/ims',
'', $htmlheadercontent);
3524 $htmlheadercontent =
'<html>'.
"\n".trim($htmlheadercontent).
"\n".
'</html>';
3528 $robotcontent = @file_get_contents($filerobot);
3530 $robotcontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $robotcontent);
3532 $robotcontent =
GETPOST(
'WEBSITE_ROBOT',
'nothtml');
3534 if (!trim($robotcontent)) {
3535 $robotcontent .=
"# Robot file. Generated with ".DOL_APPLICATION_TITLE.
"\n";
3536 $robotcontent .=
"User-agent: *\n";
3537 $robotcontent .=
"Allow: /public/\n";
3538 $robotcontent .=
"Disallow: /administrator/\n";
3542 $htaccesscontent = @file_get_contents($filehtaccess);
3544 $htaccesscontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $htaccesscontent);
3546 $htaccesscontent =
GETPOST(
'WEBSITE_HTACCESS',
'nohtml');
3548 if (!trim($htaccesscontent)) {
3549 $htaccesscontent .=
"# Order allow,deny\n";
3550 $htaccesscontent .=
"# Deny from all\n";
3555 $manifestjsoncontent = @file_get_contents($filemanifestjson);
3557 $manifestjsoncontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $manifestjsoncontent);
3559 $manifestjsoncontent =
GETPOST(
'WEBSITE_MANIFEST_JSON',
'restricthtml');
3561 if (!trim($manifestjsoncontent)) {
3566 $readmecontent = @file_get_contents($filereadme);
3568 $readmecontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $readmecontent);
3570 $readmecontent =
GETPOST(
'WEBSITE_README',
'none');
3572 if (!trim($readmecontent)) {
3577 $licensecontent = @file_get_contents($filelicense);
3579 $licensecontent = preg_replace(
'/<\?php \/\/ BEGIN PHP[^\?]*END PHP \?>\n*/ims',
'', $licensecontent);
3581 $licensecontent =
GETPOST(
'WEBSITE_LICENSE',
'none');
3583 if (!trim($licensecontent)) {
3589 print
'<!-- Edit Website properties -->'.
"\n";
3590 print
'<table class="border centpercent">';
3593 print
'<tr><td class="titlefieldcreate fieldrequired">';
3594 print $langs->trans(
'WebSite');
3600 if ($action !=
'createcontainer') {
3601 if (empty($conf->use_javascript_ajax)) {
3602 print
'<!-- Status of web site page -->'.
"\n";
3603 print
'<tr><td class="fieldrequired">';
3604 print $langs->trans(
'Status');
3606 print
$form->selectyesno(
'status', $object->status);
3612 print
'<tr><td class="tdtop fieldrequired">';
3614 print
$form->textwithpicto($langs->trans(
'MainLanguage'), $htmltext, 1,
'help',
'', 0, 2,
'WEBSITE_LANG');
3616 print
img_picto(
'',
'language',
'class="picotfixedwidth"');
3617 print $formadmin->select_language((
GETPOSTISSET(
'WEBSITE_LANG') ?
GETPOST(
'WEBSITE_LANG',
'aZ09comma') : ($object->lang ? $object->lang :
'0')),
'WEBSITE_LANG', 0,
null, 1, 0, 0,
'minwidth300', 2, 0, 0, array(), 1);
3622 print
'<tr><td class="tdtop">';
3623 $htmltext = $langs->trans(
"Example").
': fr,de,sv,it,pt';
3624 print
$form->textwithpicto($langs->trans(
'OtherLanguages'), $htmltext, 1,
'help',
'', 0, 2);
3626 print
img_picto(
'',
'language',
'class="picotfixedwidth"');
3627 print
'<input type="text" class="flat" value="'.(GETPOSTISSET(
'WEBSITE_OTHERLANG') ?
GETPOST(
'WEBSITE_OTHERLANG',
'alpha') : $object->otherlang).
'" name="WEBSITE_OTHERLANG">';
3632 print
'<tr><td class="tdtop">';
3634 $htmltext = $langs->trans(
"VirtualhostDesc");
3635 print
$form->textwithpicto($langs->trans(
'Virtualhost'), $htmltext, 1,
'help',
'', 0, 2,
'virtualhosttooltip');
3637 print
'<input type="text" class="flat minwidth300" value="'.(GETPOSTISSET(
'virtualhost') ?
GETPOST(
'virtualhost',
'alpha') : $virtualurl).
'" name="virtualhost">';
3643 print
$form->textwithpicto($langs->trans(
'ImportFavicon'), $langs->trans(
'FaviconTooltip'));
3646 $maxmin = $maxfilesizearray[
'maxmin'];
3648 print
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
3650 print
'<input type="file" class="flat minwidth300" name="addedfile" id="addedfile"/>';
3654 print
'<tr><td class="tdtop">';
3655 $htmlhelp = $langs->trans(
"CSSContentTooltipHelp");
3656 print
$form->textwithpicto($langs->trans(
'WEBSITE_CSS_INLINE'), $htmlhelp, 1,
'help',
'', 0, 2,
'csstooltip');
3659 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_CSS_INLINE_x'),
'y'=>
GETPOST(
'WEBSITE_CSS_INLINE_y'));
3660 $doleditor =
new DolEditor(
'WEBSITE_CSS_INLINE', $csscontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3661 print $doleditor->Create(1,
'',
true,
'CSS',
'css');
3666 print
'<tr><td class="tdtop">';
3667 $textwithhelp = $langs->trans(
'WEBSITE_JS_INLINE');
3668 $htmlhelp2 = $langs->trans(
"LinkAndScriptsHereAreNotLoadedInEditor").
'<br>';
3669 print
$form->textwithpicto($textwithhelp, $htmlhelp2, 1,
'warning',
'', 0, 2,
'htmljstooltip2');
3673 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_JS_INLINE_x'),
'y'=>
GETPOST(
'WEBSITE_JS_INLINE_y'));
3674 $doleditor =
new DolEditor(
'WEBSITE_JS_INLINE', $jscontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3675 print $doleditor->Create(1,
'',
true,
'JS',
'javascript');
3680 print
'<tr><td class="tdtop">';
3681 print $langs->trans(
'WEBSITE_HTML_HEADER');
3682 $htmlhelp = $langs->trans(
"Example").
' :<br>';
3684 $textwithhelp =
$form->textwithpicto(
'', $htmlhelp, 1,
'help',
'', 0, 2,
'htmlheadertooltip');
3685 $htmlhelp2 = $langs->trans(
"LinkAndScriptsHereAreNotLoadedInEditor").
'<br>';
3686 print
$form->textwithpicto($textwithhelp, $htmlhelp2, 1,
'warning',
'', 0, 2,
'htmlheadertooltip2');
3689 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_HTML_HEADER_x'),
'y'=>
GETPOST(
'WEBSITE_HTML_HEADER_y'));
3690 $doleditor =
new DolEditor(
'WEBSITE_HTML_HEADER', $htmlheadercontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3691 print $doleditor->Create(1,
'',
true,
'HTML Header',
'html');
3696 print
'<tr><td class="tdtop">';
3697 print $langs->trans(
'WEBSITE_ROBOT');
3700 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_ROBOT_x'),
'y'=>
GETPOST(
'WEBSITE_ROBOT_y'));
3701 $doleditor =
new DolEditor(
'WEBSITE_ROBOT', $robotcontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3702 print $doleditor->Create(1,
'',
true,
'Robot file',
'text');
3707 print
'<tr><td class="tdtop">';
3708 print $langs->trans(
'WEBSITE_HTACCESS');
3711 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_HTACCESS_x'),
'y'=>
GETPOST(
'WEBSITE_HTACCESS_y'));
3712 $doleditor =
new DolEditor(
'WEBSITE_HTACCESS', $htaccesscontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3713 print $doleditor->Create(1,
'',
true, $langs->trans(
"File").
' .htaccess',
'text');
3718 print
'<tr><td class="tdtop">';
3719 $htmlhelp = $langs->trans(
"Example").
' :<br>';
3720 $htmlhelp .=
'<small>'.dol_htmlentitiesbr($manifestjsoncontentdefault).
'</small>';
3721 print
$form->textwithpicto($langs->trans(
'WEBSITE_MANIFEST_JSON'), $htmlhelp, 1,
'help',
'', 0, 2,
'manifestjsontooltip');
3723 print $langs->trans(
"UseManifest").
': '.
$form->selectyesno(
'use_manifest', $website->use_manifest, 1).
'<br>';
3725 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_MANIFEST_JSON_x'),
'y'=>
GETPOST(
'WEBSITE_MANIFEST_JSON_y'));
3726 $doleditor =
new DolEditor(
'WEBSITE_MANIFEST_JSON', $manifestjsoncontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3727 print $doleditor->Create(1,
'',
true, $langs->trans(
"File").
' manifest.json',
'text');
3731 print
'<tr><td class="tdtop">';
3732 $htmlhelp = $langs->trans(
"EnterHereReadmeInformation");
3733 print
$form->textwithpicto($langs->trans(
"File").
' README.md', $htmlhelp, 1,
'help',
'', 0, 2,
'readmetooltip');
3736 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_README_x'),
'y'=>
GETPOST(
'WEBSITE_README_y'));
3737 $doleditor =
new DolEditor(
'WEBSITE_README', $readmecontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3738 print $doleditor->Create(1,
'',
true, $langs->trans(
"File").
' README.md',
'text');
3743 print
'<tr><td class="tdtop">';
3744 $htmlhelp = $langs->trans(
"EnterHereLicenseInformation");
3745 print
$form->textwithpicto($langs->trans(
"File").
' LICENSE', $htmlhelp, 1,
'help',
'', 0, 2,
'licensetooltip');
3748 $poscursor = array(
'x'=>
GETPOST(
'WEBSITE_LICENSE_x'),
'y'=>
GETPOST(
'WEBSITE_LICENSE_y'));
3749 $doleditor =
new DolEditor(
'WEBSITE_LICENSE', $licensecontent,
'',
'220',
'ace',
'In',
true,
false,
'ace', 0,
'100%',
'', $poscursor);
3750 print $doleditor->Create(1,
'',
true, $langs->trans(
"File").
' LICENSE',
'text');
3755 print
'<tr><td class="tdtop">';
3756 $htmlhelp = $langs->trans(
'RSSFeedDesc');
3757 print
$form->textwithpicto($langs->trans(
'RSSFeed'), $htmlhelp, 1,
'help',
'', 0, 2,
'');
3759 print
'/wrapper.php?rss=1[&l=XX][&limit=123]';
3772 if ($action ==
'createsite') {
3773 print
'<div class="fiche">';
3787 if ($action ==
'createcontainer') {
3791 print
'<!-- Add site -->'.
"\n";
3792 print
'<div class="tabBar tabBarWithBottom">';
3794 print
'<table class="border centpercent">';
3796 $siteref = $sitedesc = $sitelang = $siteotherlang =
'';
3798 $siteref =
GETPOST(
'WEBSITE_REF',
'aZ09');
3800 if (
GETPOST(
'WEBSITE_DESCRIPTION')) {
3801 $sitedesc =
GETPOST(
'WEBSITE_DESCRIPTION',
'alpha');
3803 if (
GETPOST(
'WEBSITE_LANG')) {
3804 $sitelang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
3806 if (
GETPOST(
'WEBSITE_OTHERLANG')) {
3807 $siteotherlang =
GETPOST(
'WEBSITE_OTHERLANG',
'aZ09comma');
3810 print
'<tr><td class="titlefieldcreate fieldrequired">';
3811 print
$form->textwithpicto($langs->trans(
'WebsiteName'), $langs->trans(
"Example").
': MyPortal, www.mywebsite.com, ...');
3813 print
'<input type="text" class="flat maxwidth300" name="WEBSITE_REF" value="'.dol_escape_htmltag($siteref).
'" autofocus>';
3816 print
'<tr><td class="fieldrequired">';
3817 print $langs->trans(
'MainLanguage');
3819 $shortlangcode = preg_replace(
'/[_-].*$/',
'', trim($langs->defaultlang));
3820 print
img_picto(
'',
'language',
'class="pictofixedwidth"');
3821 print $formadmin->select_language((
GETPOSTISSET(
'WEBSITE_LANG') ?
GETPOST(
'WEBSITE_LANG',
'aZ09comma') : $shortlangcode),
'WEBSITE_LANG', 0,
null, 1, 0, 0,
'minwidth300', 2, 0, 0, array(), 1);
3825 $htmltext = $langs->trans(
"Example").
': fr,de,sv,it,pt';
3826 print
$form->textwithpicto($langs->trans(
'OtherLanguages'), $htmltext, 1,
'help',
'', 0, 2);
3828 print
img_picto(
'',
'language',
'class="pictofixedwidth"');
3829 print
'<input type="text" class="flat minwidth300" name="WEBSITE_OTHERLANG" value="'.dol_escape_htmltag($siteotherlang).
'">';
3833 print $langs->trans(
'Description');
3835 print
'<input type="text" class="flat minwidth500" name="WEBSITE_DESCRIPTION" value="'.dol_escape_htmltag($sitedesc).
'">';
3840 $htmltext = $langs->trans(
"VirtualhostDesc");
3848 print
$form->textwithpicto($langs->trans(
'Virtualhost'), $htmltext, 1,
'help',
'', 0, 2,
'');
3850 print
'<input type="text" class="flat minwidth300" name="virtualhost" value="'.dol_escape_htmltag(
GETPOST(
'virtualhost',
'alpha')).
'">';
3856 if ($action ==
'createsite') {
3857 print
'<div class="center">';
3859 print
'<input type="submit" class="button small" name="addcontainer" value="'.$langs->trans(
"Create").
'">';
3860 print
'<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans(
"Cancel").
'">';
3875 if ($action ==
'importsite') {
3876 print
'<div class="fiche">';
3884 print
'<span class="opacitymedium">'.$langs->trans(
"ZipOfWebsitePackageToImport").
'</span><br><br>';
3887 $dolibarrdataroot = preg_replace(
'/([\\/]+)$/i',
'', DOL_DATA_ROOT);
3888 $allowimportsite =
true;
3889 if (
dol_is_file($dolibarrdataroot.
'/installmodules.lock')) {
3890 $allowimportsite =
false;
3893 if ($allowimportsite) {
3895 $maxmin = $maxfilesizearray[
'maxmin'];
3897 print
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
3899 print
'<input class="flat minwidth400" type="file" name="userfile[]" accept=".zip">';
3900 print
'<input type="submit" class="button small" name="buttonsubmitimportfile" value="'.dol_escape_htmltag($langs->trans(
"Upload")).
'">';
3901 print
'<input type="submit" class="button button-cancel small" name="preview" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'">';
3902 print
'<br><br><br>';
3906 $message = $langs->trans(
'InstallModuleFromWebHasBeenDisabledContactUs');
3909 $message = $langs->trans(
"InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.
'/installmodules.lock');
3915 print
'<span class="opacitymedium">'.$langs->trans(
"ZipOfWebsitePackageToLoad").
'</span><br><br>';
3926 if ($action ==
'editmeta' || $action ==
'createcontainer') {
3927 print
'<div class="fiche">';
3941 if ($action ==
'createcontainer') {
3945 print
'<!-- Edit or create page/container -->'.
"\n";
3948 $hiddenfromfetchingafterload =
' hideobject';
3949 $hiddenmanuallyafterload =
' hideobject';
3950 if (
GETPOST(
'radiocreatefrom') ==
'checkboxcreatefromfetching') {
3951 $hiddenfromfetchingafterload =
'';
3953 if (
GETPOST(
'radiocreatefrom') ==
'checkboxcreatemanually') {
3954 $hiddenmanuallyafterload =
'';
3957 if ($action ==
'editmeta' || empty($conf->use_javascript_ajax)) {
3958 $hiddenfromfetchingafterload =
'';
3959 $hiddenmanuallyafterload =
'';
3962 if ($action ==
'createcontainer') {
3965 if (!empty($conf->use_javascript_ajax)) {
3966 print
'<input type="radio" name="radiocreatefrom" id="checkboxcreatemanually" value="checkboxcreatemanually"'.(GETPOST(
'radiocreatefrom') ==
'checkboxcreatemanually' ?
' checked' :
'').
'> ';
3968 print
'<label for="checkboxcreatemanually"><span class="opacitymediumxx">'.$langs->trans(
"OrEnterPageInfoManually").
'</span></label><br>';
3969 print
'<hr class="tablecheckboxcreatemanually'.$hiddenmanuallyafterload.
'">';
3972 print
'<table class="border tableforfield nobackground centpercent tablecheckboxcreatemanually'.$hiddenmanuallyafterload.
'">';
3974 if ($action !=
'createcontainer') {
3975 print
'<tr><td class="titlefield fieldrequired">';
3976 print $langs->trans(
'IDOfPage').
' - '.$langs->trans(
'InternalURLOfPage');
3984 print
' - ';
3985 print
'/public/website/index.php?website='.urlencode($websitekey).
'&pageid='.urlencode($pageid);
3989 $type_container = $objectpage->type_container;
3990 $pageurl = $objectpage->pageurl;
3991 $pagealiasalt = $objectpage->aliasalt;
3992 $pagetitle = $objectpage->title;
3993 $pagedescription = $objectpage->description;
3994 $pageimage = $objectpage->image;
3995 $pagekeywords = $objectpage->keywords;
3996 $pagelang = $objectpage->lang;
3997 $pageallowedinframes = $objectpage->allowed_in_frames;
3998 $pagehtmlheader = $objectpage->htmlheader;
3999 $pagedatecreation = $objectpage->date_creation;
4000 $pagedatemodification = $objectpage->date_modification;
4001 $pageauthorid = $objectpage->fk_user_creat;
4002 $pageusermodifid = $objectpage->fk_user_modif;
4003 $pageauthoralias = $objectpage->author_alias;
4004 $pagestatus = $objectpage->status;
4006 $type_container =
'page';
4010 $pagedescription =
'';
4014 $pageallowedinframes = 0;
4015 $pagehtmlheader =
'';
4016 $pagedatecreation =
dol_now();
4017 $pagedatemodification =
'';
4018 $pageauthorid = $user->id;
4019 $pageusermodifid = 0;
4020 $pageauthoralias =
'';
4023 if (
GETPOST(
'WEBSITE_TITLE',
'alpha')) {
4024 $pagetitle = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_TITLE',
'alphanohtml'));
4026 if (
GETPOST(
'WEBSITE_PAGENAME',
'alpha')) {
4027 $pageurl =
GETPOST(
'WEBSITE_PAGENAME',
'alpha');
4029 if (
GETPOST(
'WEBSITE_ALIASALT',
'alpha')) {
4030 $pagealiasalt = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_ALIASALT',
'alphanohtml'));
4032 if (
GETPOST(
'WEBSITE_DESCRIPTION',
'alpha')) {
4033 $pagedescription = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_DESCRIPTION',
'alphanohtml'));
4035 if (
GETPOST(
'WEBSITE_IMAGE',
'alpha')) {
4036 $pageimage =
GETPOST(
'WEBSITE_IMAGE',
'alpha');
4038 if (
GETPOST(
'WEBSITE_KEYWORDS',
'alpha')) {
4039 $pagekeywords = str_replace(array(
'<',
'>'),
'',
GETPOST(
'WEBSITE_KEYWORDS',
'alphanohtml'));
4041 if (
GETPOST(
'WEBSITE_LANG',
'aZ09')) {
4042 $pagelang =
GETPOST(
'WEBSITE_LANG',
'aZ09');
4044 if (
GETPOST(
'WEBSITE_ALLOWED_IN_FRAMES',
'aZ09')) {
4045 $pageallowedinframes =
GETPOST(
'WEBSITE_ALLOWED_IN_FRAMES',
'aZ09');
4047 if (
GETPOST(
'htmlheader',
'none')) {
4048 $pagehtmlheader =
GETPOST(
'htmlheader',
'none');
4051 if ($action !=
'createcontainer') {
4052 if (empty($conf->use_javascript_ajax)) {
4053 print
'<!-- Status of web site page -->'.
"\n";
4054 print
'<tr><td class="fieldrequired">';
4055 print $langs->trans(
'Status');
4057 print
$form->selectyesno(
'status', $objectpage->status);
4063 print
'<tr><td class="titlefield fieldrequired">';
4064 print $langs->trans(
'WEBSITE_TYPE_CONTAINER');
4066 print
img_picto(
'',
'object_technic',
'class="paddingrightonly"').
' ';
4067 $formwebsite->selectTypeOfContainer(
'WEBSITE_TYPE_CONTAINER', (
GETPOST(
'WEBSITE_TYPE_CONTAINER',
'alpha') ?
GETPOST(
'WEBSITE_TYPE_CONTAINER',
'alpha') : $type_container), 0,
'', 1);
4071 if ($action ==
'createcontainer') {
4072 print
'<tr><td class="titlefield fieldrequired">';
4073 print $langs->trans(
'WEBSITE_PAGE_EXAMPLE');
4075 print $formwebsite->selectSampleOfContainer(
'sample', (
GETPOSTISSET(
'sample') ?
GETPOST(
'sample',
'alpha') :
'empty'), 0,
'', 1,
'minwidth300');
4080 print
'<tr><td class="fieldrequired">';
4081 print $langs->trans(
'WEBSITE_TITLE');
4083 print
'<input type="text" class="flat quatrevingtpercent" name="WEBSITE_TITLE" id="WEBSITE_TITLE" value="'.dol_escape_htmltag($pagetitle).
'" autofocus>';
4087 print
'<tr><td class="titlefieldcreate fieldrequired">';
4088 print $langs->trans(
'WEBSITE_PAGENAME');
4090 print
'<input type="text" class="flat minwidth300" name="WEBSITE_PAGENAME" id="WEBSITE_PAGENAME" value="'.dol_escape_htmltag($pageurl).
'">';
4093 print
'<tr><td class="titlefieldcreate">';
4094 $htmlhelp = $langs->trans(
"WEBSITE_ALIASALTDesc");
4095 print
$form->textwithpicto($langs->trans(
'WEBSITE_ALIASALT'), $htmlhelp, 1,
'help',
'', 0, 2,
'aliastooltip');
4097 print
'<input type="text" class="flat minwidth500" name="WEBSITE_ALIASALT" value="'.dol_escape_htmltag($pagealiasalt).
'">';
4101 print $langs->trans(
'WEBSITE_DESCRIPTION');
4103 print
'<input type="text" class="flat quatrevingtpercent" name="WEBSITE_DESCRIPTION" value="'.dol_escape_htmltag($pagedescription).
'">';
4107 $htmlhelp = $langs->trans(
"WEBSITE_IMAGEDesc");
4108 print
$form->textwithpicto($langs->trans(
'WEBSITE_IMAGE'), $htmlhelp, 1,
'help',
'', 0, 2,
'imagetooltip');
4110 print
'<input type="text" class="flat quatrevingtpercent" name="WEBSITE_IMAGE" value="'.dol_escape_htmltag($pageimage).
'">';
4115 $htmlhelp = $langs->trans(
"WEBSITE_KEYWORDSDesc");
4116 print
$form->textwithpicto($langs->trans(
'WEBSITE_KEYWORDS'), $htmlhelp, 1,
'help',
'', 0, 2,
'keywordtooltip');
4118 print
'<input type="text" class="flat quatrevingtpercent" name="WEBSITE_KEYWORDS" value="'.dol_escape_htmltag($pagekeywords).
'">';
4122 print $langs->trans(
'Language');
4124 $onlykeys = array();
4125 if ($object->lang) {
4126 $onlykeys[$object->lang] = $object->lang;
4128 $onlykeys[$langs->defaultlang] = $langs->defaultlang;
4130 if ($object->otherlang) {
4131 $tmparray = explode(
',', $object->otherlang);
4132 foreach ($tmparray as $key) {
4133 $tmpkey = trim($key);
4134 if (strlen($key) == 2) {
4135 $tmpkey = strtolower($key);
4137 $onlykeys[$tmpkey] = $tmpkey;
4140 if (empty($object->lang) && empty($object->otherlang)) {
4143 print
img_picto(
'',
'language',
'class="pictofixedwidth"').$formadmin->select_language($pagelang ? $pagelang :
'',
'WEBSITE_LANG', 0,
null,
'1', 0, 0,
'minwidth200', 0, 0, 0, $onlykeys, 1);
4144 $htmltext = $langs->trans(
"AvailableLanguagesAreDefinedIntoWebsiteProperties");
4145 print
$form->textwithpicto(
'', $htmltext);
4151 print
'<!-- Translation of --><tr><td>';
4152 print $langs->trans(
'TranslationLinks');
4154 if ($action !=
'createcontainer') {
4156 $sql =
"SELECT rowid, lang from ".MAIN_DB_PREFIX.
"website_page where fk_page = ".((int) $objectpage->id);
4157 $resql = $db->query($sql);
4159 $num_rows = $db->num_rows(
$resql);
4160 if ($num_rows > 0) {
4161 print
'<span class="opacitymedium">'.$langs->trans(
'ThisPageHasTranslationPages').
':</span>';
4165 while ($obj = $db->fetch_object(
$resql)) {
4166 $result = $tmppage->fetch($obj->rowid);
4169 $tmpstring .=
'<br>';
4171 $tmpstring .= $tmppage->getNomUrl(1).
' ('.$tmppage->lang.
')';
4187 if (empty($translatedby) && ($action ==
'editmeta' || $action ==
'createcontainer' || $objectpage->fk_page > 0)) {
4189 $result = $sourcepage->fetch($objectpage->fk_page);
4192 } elseif ($result > 0) {
4193 $translationof = $objectpage->fk_page;
4194 print
'<span class="opacitymedium">'.$langs->trans(
'ThisPageIsTranslationOf').
'</span> ';
4195 print $formwebsite->selectContainer($website,
'pageidfortranslation', ($translationof ? $translationof : -1), 1, $action,
'minwidth300', array($objectpage->id));
4196 if ($translationof > 0 && $sourcepage->lang) {
4197 print $sourcepage->getNomUrl(2).
' ('.$sourcepage->lang.
')';
4205 print $langs->trans(
'AllowedInFrames');
4209 print
'<input type="checkbox" class="flat" name="WEBSITE_ALLOWED_IN_FRAMES" value="1"'.($pageallowedinframes ?
'checked="checked"' :
'').
'>';
4213 if (
isModEnabled(
'categorie') && !empty($user->rights->categorie->lire)) {
4214 $langs->load(
'categories');
4217 $cate_arbo =
$form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE,
'',
null,
null,
null, 1);
4219 $cats = $c->containing($objectpage->id, Categorie::TYPE_WEBSITE_PAGE);
4220 $arrayselected = array();
4221 if (is_array($cats)) {
4222 foreach ($cats as $cat) {
4223 $arrayselected[] = $cat->id;
4227 $cate_arbo =
$form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE,
'',
'parent',
null,
null, 1);
4230 print
'<tr><td class="toptd">'.$form->editfieldkey(
'Categories',
'categories',
'', $objectpage, 0).
'</td><td>';
4231 print
img_picto(
'',
'category',
'class="pictofixedwidth"');
4232 print
$form->multiselectarray(
'categories', $cate_arbo, (
GETPOSTISSET(
'categories') ?
GETPOST(
'categories',
'array') : $arrayselected),
null,
null,
'minwidth200 widthcentpercentminusxx');
4236 if (!empty($conf->global->WEBSITE_PAGE_SHOW_INTERNAL_LINKS_TO_OBJECT)) {
4237 print
'<tr><td class="titlefieldcreate">';
4238 print
'ObjectClass';
4240 print
'<input type="text" class="flat minwidth300" name="WEBSITE_OBJECTCLASS" placeholder="ClassName::/path/class/ObjectClass.class.php" >';
4243 print
'<tr><td class="titlefieldcreate">';
4246 print
'<input type="text" class="flat minwidth300" name="WEBSITE_OBJECTID" >';
4250 $fuser =
new User($db);
4253 print $langs->trans(
'Author');
4255 if ($pageauthorid > 0) {
4256 $fuser->fetch($pageauthorid);
4257 print $fuser->getNomUrl(1);
4259 print
'<span class="opacitymedium">'.$langs->trans(
"Unknown").
'</span>';
4264 print $langs->trans(
'PublicAuthorAlias');
4266 print
'<input type="text" class="flat minwidth300" name="WEBSITE_AUTHORALIAS" value="'.dol_escape_htmltag($pageauthoralias).
'" placeholder="Anonymous">';
4270 print $langs->trans(
'DateCreation');
4272 print
$form->selectDate($pagedatecreation,
'datecreation', 1, 1, 0,
'', 1, 1);
4276 if ($action !=
'createcontainer') {
4278 print $langs->trans(
'UserModif');
4280 if ($pageusermodifid > 0) {
4281 $fuser->fetch($pageusermodifid);
4282 print $fuser->getNomUrl(1);
4287 print $langs->trans(
'DateModification');
4289 print
dol_print_date($pagedatemodification,
'dayhour',
'tzuser');
4293 print
'<tr><td class="tdhtmlheader tdtop">';
4294 $htmlhelp = $langs->trans(
"EditTheWebSiteForACommonHeader").
'<br><br>';
4295 $htmlhelp .= $langs->trans(
"Example").
' :<br>';
4297 print
$form->textwithpicto($langs->trans(
'HtmlHeaderPage'), $htmlhelp, 1,
'help',
'', 0, 2,
'htmlheadertooltip');
4299 $poscursor = array(
'x'=>
GETPOST(
'htmlheader_x'),
'y'=>
GETPOST(
'htmlheader_y'));
4300 $doleditor =
new DolEditor(
'htmlheader', $pagehtmlheader,
'',
'120',
'ace',
'In',
true,
false,
'ace', ROWS_3,
'100%',
'', $poscursor);
4301 print $doleditor->Create(1,
'',
true,
'HTML Header',
'html');
4306 if ($action ==
'createcontainer') {
4307 print
'<div class="center tablecheckboxcreatemanually'.$hiddenmanuallyafterload.
'">';
4309 print
'<input type="submit" class="button small" name="addcontainer" value="'.$langs->trans(
"Create").
'">';
4310 print
'<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans(
"Cancel").
'">';
4317 if (!empty($conf->use_javascript_ajax)) {
4318 print
'<input type="radio" name="radiocreatefrom" id="checkboxcreatefromfetching" value="checkboxcreatefromfetching"'.(GETPOST(
'radiocreatefrom') ==
'checkboxcreatefromfetching' ?
' checked' :
'').
'> ';
4320 print
'<label for="checkboxcreatefromfetching"><span class="opacitymediumxx">'.$langs->trans(
"CreateByFetchingExternalPage").
'</span></label><br>';
4321 print
'<hr class="tablecheckboxcreatefromfetching'.$hiddenfromfetchingafterload.
'">';
4322 print
'<table class="tableforfield centpercent tablecheckboxcreatefromfetching'.$hiddenfromfetchingafterload.
'">';
4323 print
'<tr><td class="titlefield">';
4324 print $langs->trans(
"URL");
4326 print
info_admin($langs->trans(
"OnlyEditionOfSourceForGrabbedContentFuture"), 0, 0,
'warning');
4327 print
'<input class="flat minwidth500" type="text" name="externalurl" value="'.dol_escape_htmltag(
GETPOST(
'externalurl',
'alpha')).
'" placeholder="https://externalsite/pagetofetch"> ';
4328 print
'<br><input class="flat paddingtop" type="checkbox" name="grabimages" value="1" checked="checked"> '.$langs->trans(
"GrabImagesInto");
4330 print $langs->trans(
"ImagesShouldBeSavedInto").
' ';
4331 $arraygrabimagesinto = array(
'root'=>$langs->trans(
"WebsiteRootOfImages"),
'subpage'=>$langs->trans(
"SubdirOfPage"));
4332 print
$form->selectarray(
'grabimagesinto', $arraygrabimagesinto,
GETPOSTISSET(
'grabimagesinto') ?
GETPOST(
'grabimagesinto') :
'root', 0, 0, 0,
'', 0, 0, 0,
'',
'', 1);
4335 print
'<input class="button small" style="margin-top: 5px" type="submit" name="fetchexternalurl" value="'.dol_escape_htmltag($langs->trans(
"FetchAndCreate")).
'">';
4336 print
'<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans(
"Cancel").
'">';
4342 if ($action ==
'createcontainer') {
4343 print
'<script type="text/javascript">
4344 jQuery(document).ready(function() {
4345 var disableautofillofalias = 0;
4346 var selectedm = \'\';
4347 var selectedf = \'\';
4348 jQuery("#WEBSITE_TITLE").keyup(function() {
4349 if (disableautofillofalias == 0)
4351 var valnospecial = jQuery("#WEBSITE_TITLE").val();
4352 valnospecial = valnospecial.replace(/[éèê]/g, \'e\').replace(/[à ]/g, \'a\').replace(/[ù]/g, \'u\').replace(/[î]/g, \'i\');
4353 valnospecial = valnospecial.replace(/[ç]/g, \'c\').replace(/[ö]/g, \'o\');
4354 valnospecial = valnospecial.replace(/[^\w]/gi, \'-\').toLowerCase();
4355 valnospecial = valnospecial.replace(/\-+/g, \'-\').replace(/\-$/, \'\');
4356 console.log("disableautofillofalias=0 so we replace WEBSITE_TITLE with "+valnospecial);
4357 jQuery("#WEBSITE_PAGENAME").val(valnospecial);
4360 jQuery("#WEBSITE_PAGENAME").keyup(function() {
4361 disableautofillofalias = 1;
4364 jQuery("#checkboxcreatefromfetching,#checkboxcreatemanually").click(function() {
4365 console.log("we select a method to create a new container "+jQuery("#checkboxcreatefromfetching:checked").val())
4366 jQuery(".tablecheckboxcreatefromfetching").hide();
4367 jQuery(".tablecheckboxcreatemanually").hide();
4368 if (typeof(jQuery("#checkboxcreatefromfetching:checked").val()) != \'undefined\') {
4369 console.log("show a");
4370 if (selectedf != \'createfromfetching\') {
4371 jQuery(".tablecheckboxcreatefromfetching").show();
4372 selectedf = \'createfromfetching\';
4375 jQuery(".tablecheckboxcreatefromfetching").hide();
4379 if (typeof(jQuery("#checkboxcreatemanually:checked").val()) != \'undefined\') {
4380 console.log("show b");
4381 if (selectedm != \'createmanually\') {
4382 jQuery(".tablecheckboxcreatemanually").show();
4383 selectedm = \'createmanually\';
4386 jQuery(".tablecheckboxcreatemanually").hide();
4405 if ($action ==
'preview') {
4409 if ($action ==
'editfile' || $action ==
'file_manager' || $action ==
'convertimgwebp' || $action ==
'confirmconvertimgwebp') {
4410 print
'<!-- Edit Media -->'.
"\n";
4411 print
'<div class="fiche"><br>';
4416 $formalreadyopen = 2;
4418 $url = DOL_URL_ROOT.
'/website/index.php';
4420 include DOL_DOCUMENT_ROOT.
'/core/tpl/filemanager.tpl.php';
4425 if ($action ==
'editmenu') {
4426 print
'<!-- Edit Menu -->'.
"\n";
4427 print
'<div class="center">'.$langs->trans(
"FeatureNotYetAvailable").
'</center>';
4430 if ($action ==
'editsource') {
4433 $contentforedit =
'';
4437 $contentforedit .= $objectpage->content;
4439 $maxheightwin = 480;
4440 if (isset($_SESSION[
"dol_screenheight"])) {
4441 if ($_SESSION[
"dol_screenheight"] > 680) {
4442 $maxheightwin = $_SESSION[
"dol_screenheight"] - 400;
4444 if ($_SESSION[
"dol_screenheight"] > 800) {
4445 $maxheightwin = $_SESSION[
"dol_screenheight"] - 490;
4449 $poscursor = array(
'x'=>
GETPOST(
'PAGE_CONTENT_x'),
'y'=>
GETPOST(
'PAGE_CONTENT_y'));
4450 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
4451 $doleditor =
new DolEditor(
'PAGE_CONTENT', $contentforedit,
'', $maxheightwin,
'Full',
'',
true,
true,
'ace', ROWS_5,
'40%', 0, $poscursor);
4452 $doleditor->Create(0,
'',
false,
'HTML Source',
'php');
4477 if ($mode ==
'replacesite' || $massaction ==
'replace') {
4478 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
4479 print
'<input type="hidden" name="token" value="'.newToken().
'">';
4480 print
'<input type="hidden" name="action" value="replacesiteconfirm">';
4481 print
'<input type="hidden" name="mode" value="replacesite">';
4482 print
'<input type="hidden" name="website" value="'.$website->ref.
'">';
4485 print
'<!-- Search page and replace string -->'.
"\n";
4486 print
'<div class="fiche"><br>';
4488 print
load_fiche_titre($langs->trans(
"ReplaceWebsiteContent"),
'',
'search');
4490 print
'<div class="fichecenter"><div class="fichehalfleft">';
4492 print
'<div class="tagtable">';
4494 print
'<div class="tagtr">';
4495 print
'<div class="tagtd paddingrightonly opacitymedium">';
4496 print $langs->trans(
"SearchReplaceInto");
4498 print
'<div class="tagtd">';
4499 print
'<input type="checkbox" class="marginleftonly" id="checkboxoptioncontent" name="optioncontent" value="content"'.((!
GETPOSTISSET(
'buttonreplacesitesearch') ||
GETPOST(
'optioncontent',
'aZ09')) ?
' checked' :
'').
'> <label for="checkboxoptioncontent" class="tdoverflowmax150onsmartphone inline-block valignmiddle">'.$langs->trans(
"Content").
'</label><br>';
4500 print
'<input type="checkbox" class="marginleftonly" id="checkboxoptionmeta" name="optionmeta" value="meta"'.(GETPOST(
'optionmeta',
'aZ09') ?
' checked' :
'').
'> <label for="checkboxoptionmeta" class="tdoverflowmax150onsmartphone inline-block valignmiddle">'.$langs->trans(
"Title").
' | '.$langs->trans(
"Description").
' | '.$langs->trans(
"Keywords").
'</label><br>';
4501 print
'<input type="checkbox" class="marginleftonly" id="checkboxoptionsitefiles" name="optionsitefiles" value="sitefiles"'.(GETPOST(
'optionsitefiles',
'aZ09') ?
' checked' :
'').
'> <label for="checkboxoptionsitefiles" class="tdoverflowmax150onsmartphone inline-block valignmiddle">'.$langs->trans(
"GlobalCSSorJS").
'</label><br>';
4505 print
'<div class="tagtr">';
4506 print
'<div class="tagtd paddingrightonly opacitymedium" style="padding-right: 10px !important">';
4507 print $langs->trans(
"SearchString");
4509 print
'<div class="tagtd">';
4510 print
'<input type="text" name="searchstring" value="'.dol_escape_htmltag($searchkey, 0, 0,
'', 1).
'" autofocus>';
4516 print
'</div><div class="fichehalfleft">';
4518 print
'<div class="tagtable">';
4520 print
'<div class="tagtr">';
4521 print
'<div class="tagtd paddingrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4522 print $langs->trans(
"WEBSITE_TYPE_CONTAINER");
4524 print
'<div class="tagtd">';
4525 print
img_picto(
'',
'object_technic',
'class="paddingrightonly"').
' ';
4526 $formwebsite->selectTypeOfContainer(
'optioncontainertype', (
GETPOST(
'optioncontainertype',
'alpha') ?
GETPOST(
'optioncontainertype',
'alpha') :
''), 1,
'', 1,
'minwidth125 maxwidth400 widthcentpercentminusx');
4530 print
'<div class="tagtr">';
4531 print
'<div class="tagtd paddingrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4532 print $langs->trans(
"Language");
4534 print
'<div class="tagtd">';
4535 print
img_picto(
'',
'language',
'class="paddingrightonly"').
' '.$formadmin->select_language(
GETPOSTISSET(
'optionlanguage') ?
GETPOST(
'optionlanguage') :
'',
'optionlanguage', 0,
null,
'1', 0, 0,
'minwidth125 maxwidth400 widthcentpercentminusx', 2, 0, 0,
null, 1);
4540 if (
isModEnabled(
'categorie') && !empty($user->rights->categorie->lire)) {
4541 print
'<div class="tagtr">';
4542 print
'<div class="tagtd paddingrightonly marginrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4543 print $langs->trans(
"Category");
4545 print
'<div class="tagtd">';
4546 print
img_picto(
'',
'category',
'class="paddingrightonly"').
' '.
$form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE,
GETPOSTISSET(
'optioncategory') ?
GETPOST(
'optioncategory') :
'',
'optioncategory', 0, 0, 0, 0,
'minwidth125 maxwidth400 widthcentpercentminusx');
4547 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
4555 print
'<input type="submit" class="button margintoponly" name="buttonreplacesitesearch" value="'.dol_escape_htmltag($langs->trans(
"Search")).
'">';
4557 print
'</div></div>';
4559 if ($mode ==
'replacesite') {
4560 print
'<!-- List of search result -->'.
"\n";
4561 print
'<div class="rowsearchresult clearboth">';
4566 if ($listofpages[
'code'] ==
'OK') {
4567 $arrayofselected = is_array($toselect) ? $toselect : array();
4571 $permissiontodelete = $user->hasRight(
'website',
'delete');
4574 $arrayofmassactions = array();
4575 if ($user->hasRight(
'website',
'writephp') && $searchkey) {
4576 $arrayofmassactions[
'replace'] =
img_picto(
'',
'replacement',
'class="pictofixedwidth"').$langs->trans(
"Replace");
4578 if ($user->hasRight(
'website',
'write')) {
4579 $arrayofmassactions[
'setcategory'] =
img_picto(
'',
'category',
'class="pictofixedwidth"').$langs->trans(
"ClassifyInCategory");
4581 if ($user->hasRight(
'website',
'write')) {
4582 $arrayofmassactions[
'delcategory'] =
img_picto(
'',
'category',
'class="pictofixedwidth"').$langs->trans(
"RemoveCategory");
4584 if ($permissiontodelete) {
4585 $arrayofmassactions[
'predelete'] =
img_picto(
'',
'delete',
'class="pictofixedwidth"').$langs->trans(
"Delete");
4587 if (
GETPOST(
'nomassaction',
'int') || in_array($massaction, array(
'presend',
'predelete'))) {
4588 $arrayofmassactions = array();
4591 $massactionbutton =
$form->selectMassAction(
'', $arrayofmassactions);
4592 $massactionbutton .=
'<div class="massactionother massactionreplace hidden">';
4593 $massactionbutton .= $langs->trans(
"ReplaceString");
4594 $massactionbutton .=
' <input type="text" name="replacestring" value="'.dol_escape_htmltag(
GETPOST(
'replacestring',
'none')).
'">';
4595 $massactionbutton .=
'</div>';
4596 $massactionbutton .=
'<div class="massactionother massactionsetcategory massactiondelcategory hidden">';
4597 $massactionbutton .=
img_picto(
'',
'category').
' '.$langs->trans(
"Category");
4598 $massactionbutton .=
' '.$form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE,
GETPOSTISSET(
'setcategory') ?
GETPOST(
'setcategory') :
'',
'setcategory', 64, 0, 0, 0,
'minwidth300 alignstart');
4599 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
4601 $massactionbutton .=
'</div>';
4603 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
4606 $selectedfields =
'';
4607 $selectedfields .= (count($arrayofmassactions) ?
$form->showCheckAddButtons(
'checkforselect', 1) :
'');
4609 print_barre_liste($langs->trans(
"Results"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num,
$nbtotalofrecords,
'generic', 0,
'',
'', $limit, 1, 1, 1);
4611 $topicmail =
"WebsitePageRef";
4612 $modelmail =
"websitepage_send";
4614 $trackid =
'wsp'.$object->id;
4615 include DOL_DOCUMENT_ROOT.
'/core/tpl/massactions_pre.tpl.php';
4617 $param =
'mode=replacesite&website='.urlencode($website->ref);
4618 $param .=
'&searchstring='.urlencode($searchkey);
4619 if (
GETPOST(
'optioncontent')) {
4620 $param .=
'&optioncontent=content';
4623 $param .=
'&optionmeta=meta';
4625 if (
GETPOST(
'optionsitefiles')) {
4626 $param .=
'&optionsitefiles=optionsitefiles';
4628 if (
GETPOST(
'optioncontainertype')) {
4629 $param .=
'&optioncontainertype='.GETPOST(
'optioncontainertype',
'aZ09');
4631 if (
GETPOST(
'optionlanguage')) {
4632 $param .=
'&optionlanguage='.GETPOST(
'optionlanguage',
'aZ09');
4634 if (
GETPOST(
'optioncategory')) {
4635 $param .=
'&optioncategory='.GETPOST(
'optioncategory',
'aZ09');
4638 print
'<div class="div-table-responsive-no-min">';
4639 print
'<table class="noborder centpercent">';
4640 print
'<tr class="liste_titre">';
4641 print
getTitleFieldOfList(
"Type", 0, $_SERVER[
'PHP_SELF'],
'type_container',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
4642 print
getTitleFieldOfList(
"Page", 0, $_SERVER[
'PHP_SELF'],
'pageurl',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
4644 print
getTitleFieldOfList(
"Language", 0, $_SERVER[
'PHP_SELF'],
'lang',
'', $param,
'', $sortfield, $sortorder,
'center ').
"\n";
4646 print
getTitleFieldOfList(
"DateLastModification", 0, $_SERVER[
'PHP_SELF'],
'tms',
'', $param,
'', $sortfield, $sortorder,
'center ').
"\n";
4648 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
4651 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
4656 foreach ($listofpages[
'list'] as $answerrecord) {
4657 if (is_object($answerrecord) && get_class($answerrecord) ==
'WebsitePage') {
4661 print
'<td class="nowraponall">'.$langs->trans(
"Container").
' - ';
4662 print $langs->trans($answerrecord->type_container);
4667 print $answerrecord->getNomUrl(1);
4668 print
' <span class="opacitymedium">('.($answerrecord->title ? $answerrecord->title : $langs->trans(
"NoTitle")).
')</span>';
4672 print
'<span class="opacitymedium">'.$answerrecord->description.
'</span>';
4677 if (
isModEnabled(
'categorie') && !empty($user->rights->categorie->lire)) {
4679 $existing = $c->containing($answerrecord->id, Categorie::TYPE_WEBSITE_PAGE,
'object');
4680 if (is_array($existing)) {
4681 foreach ($existing as $tmpcategory) {
4683 print
img_object($langs->trans(
"Category").
' : '.$tmpcategory->label,
'category',
'style="padding-left: 2px; padding-right: 2px; color: #'.($tmpcategory->color !=
'' ? $tmpcategory->color :
'888').
'"');
4691 $param =
'?mode=replacesite';
4692 $param .=
'&websiteid='.$website->id;
4693 $param .=
'&optioncontent='.GETPOST(
'optioncontent',
'aZ09');
4694 $param .=
'&optionmeta='.GETPOST(
'optionmeta',
'aZ09');
4695 $param .=
'&optionsitefiles='.GETPOST(
'optionsitefiles',
'aZ09');
4696 $param .=
'&optioncontainertype='.GETPOST(
'optioncontainertype',
'aZ09');
4697 $param .=
'&optionlanguage='.GETPOST(
'optionlanguage',
'aZ09');
4698 $param .=
'&optioncategory='.GETPOST(
'optioncategory',
'aZ09');
4699 $param .=
'&searchstring='.urlencode($searchkey);
4702 print
'<td class="center">';
4707 print
'<td class="center nowraponall">';
4709 $characterMap =
'áà éèëÃóúüñùç0123456789';
4710 $nbofwords = str_word_count($textwithouthtml, 0, $characterMap);
4712 print $nbofwords.
' '.$langs->trans(
"words");
4713 $totalnbwords += $nbofwords;
4718 print
'<td class="center nowraponall">';
4719 print
dol_print_date($answerrecord->date_modification,
'dayhour');
4723 print
'<td class="tdwebsitesearchresult right nowraponall">';
4725 $urltoedithtmlsource = $_SERVER[
"PHP_SELF"].
'?action=editmeta&token='.
newToken().
'&websiteid='.$website->id.
'&pageid='.$answerrecord->id.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].$param);
4726 if (empty($user->rights->website->write)) {
4727 $disabled =
' disabled';
4728 $urltoedithtmlsource =
'';
4730 print
'<a class="editfielda marginleftonly marginrightonly '.$disabled.
'" href="'.$urltoedithtmlsource.
'" title="'.$langs->trans(
"EditPageMeta").
'">'.
img_picto($langs->trans(
"EditPageMeta"),
'pencil-ruler').
'</a>';
4733 $urltoedithtmlsource = $_SERVER[
"PHP_SELF"].
'?action=editsource&token='.
newToken().
'&websiteid='.$website->id.
'&pageid='.$answerrecord->id.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].$param);
4734 if (empty($user->rights->website->write)) {
4735 $disabled =
' disabled';
4736 $urltoedithtmlsource =
'';
4738 print
'<a class="editfielda marginleftonly marginrightonly '.$disabled.
'" href="'.$urltoedithtmlsource.
'" title="'.$langs->trans(
"EditHTMLSource").
'">'.
img_picto($langs->trans(
"EditHTMLSource"),
'edit').
'</a>';
4740 print
'<span class="marginleftonly marginrightonly"></span>';
4741 print
ajax_object_onoff($answerrecord,
'status',
'status',
'Enabled',
'Disabled', array(),
'valignmiddle');
4746 print
'<td class="nowrap center">';
4748 print
'<!-- Status of page -->'.
"\n";
4749 if ($massactionbutton || $massaction) {
4751 if (in_array($answerrecord->id, $arrayofselected)) {
4754 print
'<input id="'.$answerrecord->id.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$answerrecord->id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
4764 $translateofrecordtype = array(
4765 'website_csscontent'=>
'WEBSITE_CSS_INLINE',
4766 'website_jscontent'=>
'WEBSITE_JS_INLINE',
4767 'website_robotcontent'=>
'WEBSITE_ROBOT',
4768 'website_htmlheadercontent'=>
'WEBSITE_HTML_HEADER',
4769 'website_htaccess'=>
'WEBSITE_HTACCESS',
4770 'website_readme'=>
'WEBSITE_README',
4771 'website_manifestjson'=>
'WEBSITE_MANIFEST_JSON'
4773 if (!empty($translateofrecordtype[$answerrecord[
'type']])) {
4774 print $langs->trans($translateofrecordtype[$answerrecord[
'type']]);
4776 print $answerrecord[
'type'];
4780 $param =
'?mode=replacesite';
4781 $param .=
'&websiteid='.$website->id;
4782 $param .=
'&optioncontent='.GETPOST(
'optioncontent',
'aZ09');
4783 $param .=
'&optionmeta='.GETPOST(
'optionmeta',
'aZ09');
4784 $param .=
'&optionsitefiles='.GETPOST(
'optionsitefiles',
'aZ09');
4785 $param .=
'&optioncontainertype='.GETPOST(
'optioncontainertype',
'aZ09');
4786 $param .=
'&optionlanguage='.GETPOST(
'optionlanguage',
'aZ09');
4787 $param .=
'&optioncategory='.GETPOST(
'optioncategory',
'aZ09');
4788 $param .=
'&searchstring='.urlencode($searchkey);
4792 $backtopageurl = $_SERVER[
"PHP_SELF"].$param;
4793 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?action=editcss&token='.
newToken().
'&website='.urlencode($website->ref).
'&backtopage='.urlencode($backtopageurl).
'">'.$langs->trans(
"EditCss").
'</a>';
4809 print
'<td class="center nowraponall">';
4818 print
'<td class="nowrap center">';
4825 if (count($listofpages[
'list']) >= 2) {
4827 print
'<tr class="lite_titre">';
4831 print $langs->trans(
"Total");
4847 print
'<td class="center nowraponall">';
4848 print $totalnbwords.
' '.$langs->trans(
"words");
4860 print
'<td class="nowrap center">';
4870 print
'<div class="warning">'.$listofpages[
'message'].
'</div>';
4879 if ((empty($action) || $action ==
'preview' || $action ==
'createfromclone' || $action ==
'createpagefromclone') && !in_array($mode, array(
'replacesite'))) {
4880 if ($pageid > 0 && $atleastonepage) {
4886 $objectpage->fetch($pageid);
4888 $jscontent = @file_get_contents($filejs);
4890 $out =
'<!-- Page content '.$filetpl.
' : Div with (Htmlheader/Style of page from database + CSS Of website from file + Page content from database or by include if WEBSITE_SUBCONTAINERSINLINE is on) -->'.
"\n";
4899 $out .=
"\n<html><head>\n";
4900 $out .=
"<!-- htmlheader/style of page from database -->\n";
4903 $out .=
"<!-- htmlheader/style of website from files -->\n";
4921 $out .=
"</head>\n";
4925 $out .=
'<div id="websitecontentundertopmenu" class="websitecontentundertopmenu boostrap-iso">'.
"\n";
4929 $out .=
'<!-- style of website from file -->'.
"\n";
4930 $out .=
'<style scoped>'.
"\n";
4932 $tmpout .=
'/* Include website CSS file */'.
"\n";
4936 $csscontent = ob_get_contents();
4939 $tmpout .=
'/* Include style from the HTML header of page */'.
"\n";
4941 $tmp = preg_split(
'(<style[^>]*>|</style>)', $objectpage->htmlheader);
4942 $tmpstyleinheader =
'';
4944 foreach ($tmp as $valtmp) {
4947 $tmpstyleinheader .= $valtmp.
"\n";
4950 $tmpout .= $tmpstyleinheader.
"\n";
4952 $tmpout = preg_replace(
'/}[\s\n]*body\s*{[^}]+}/ims',
'}', $tmpout);
4954 $out .=
'</style>'.
"\n";
4961 $out .=
'<div id="divbodywebsite" class="bodywebsite bodywebpage-'.$objectpage->ref.
'">'.
"\n";
4963 $newcontent = $objectpage->content;
4966 if (!empty($conf->global->WEBSITE_SUBCONTAINERSINLINE)) {
4970 $filephp = $filetpl;
4973 $res = include $filephp;
4975 print
"ERROR: Failed to include file '".$filephp.
"'. Try to edit and re-save page ith this ID.";
4978 print $e->getMessage();
4980 $newcontent = ob_get_contents();
4985 if (empty($conf->global->WEBSITE_EDITINLINE)) {
4987 $newcontent = preg_replace(
'/(div|section)(\s[^>]*)contenteditable="true"/',
'\1\2', $newcontent);
4996 $out .=
'</div> <!-- End div id=websitecontentundertopmenu -->';
5002 $out .=
"\n</body></html>\n";
5004 $out .=
"\n".
'<!-- End page content '.$filetpl.
' -->'.
"\n\n";
5029 if (empty($websitekey) || $websitekey ==
'-1') {
5030 print
'<br><br><div class="center previewnotyetavailable"><span class="">'.$langs->trans(
"NoWebSiteCreateOneFirst").
'</span></div><br><br><br>';
5031 print
'<div class="center"><div class="logo_setup"></div></div>';
5033 print
'<br><br><div class="center previewnotyetavailable"><span class="">'.$langs->trans(
"PreviewOfSiteNotYetAvailable", $object->ref).
'</span></div><br><br><br>';
5034 print
'<div class="center"><div class="logo_setup"></div></div>';
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='')
On/off button to change status of an object This is called when MAIN_DIRECT_STATUS_UPDATE is set and ...
Class to manage categories.
Class to manage a WYSIWYG editor.
lessphp v0.5.0 http://leafo.net/lessphp
Class to manage Dolibarr users.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_is_file($pathoffile)
Return if path is a file.
dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesession=0, $varfiles='addedfile', $savingdocmask='', $link=null, $trackid='', $generatethumbs=1, $object=null)
Get and save an upload file (for example after submitting a new file a mail form).
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='button bordertransp', $backtopagejsfields='')
Return HTML code to output a button to open a dialog popup box.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
img_previous($titlealt='default', $moreatt='')
Show previous logo.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
if(!function_exists('utf8_encode')) if(!function_exists('utf8_decode')) getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
img_next($titlealt='default', $moreatt='')
Show next logo.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
getDomainFromURL($url, $mode=0)
Function get second level domain name.
getRootURLFromURL($url)
Function root url from a long url For example: https://www.abc.mydomain.com/dir/page....
getURLContent($url, $postorget='GET', $param='', $followlocation=1, $addheaders=array(), $allowedschemes=array('http', 'https'), $localurl=0, $ssl_verifypeer=-1)
Function to get a content from an URL (use proxy if proxy defined).
removeHtmlComment($content)
Function to remove comments into HTML content.
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
$formconfirm
if ($action == 'delbookkeepingyear') {
$nbtotalofrecords
Count total nb of records.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
getMaxFileSizeArray()
Return the max allowed for file upload.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
checkPHPCode($phpfullcodestringold, $phpfullcodestring)
checkPHPCode
dolSaveMasterFile($filemaster)
Save content of a page on disk.
showWebsiteTemplates(Website $website)
Show list of themes.
dolSaveLicense($file, $content)
Save content of a page on disk.
dolSaveHtmlHeader($filehtmlheader, $htmlheadercontent)
Save content of a page on disk.
dolSaveReadme($file, $content)
Save content of a page on disk.
dolSaveManifestJson($file, $content)
Save content of a page on disk.
dolSaveIndexPage($pathofwebsite, $fileindex, $filetpl, $filewrapper, $object=null)
Save content of the index.php and/or the wrapper.php page.
dolSavePageAlias($filealias, $object, $objectpage)
Save an alias page on disk (A page that include the reference page).
dolSaveHtaccessFile($filehtaccess, $htaccess)
Save content of a page on disk.
dolSaveJsFile($filejs, $jscontent)
Save content of a page on disk.
dolSavePageContent($filetpl, Website $object, WebsitePage $objectpage, $backupold=0)
Save content of a page on disk (page name is generally ID_of_page.php).
dolSaveCssFile($filecss, $csscontent)
Save content of a page on disk.
dolSaveRobotFile($filerobot, $robotcontent)
Save content of a page on disk.
getAllImages($object, $objectpage, $urltograb, &$tmp, &$action, $modifylinks=0, $grabimages=1, $grabimagesinto='subpage')
Download all images found into page content $tmp.
getPagesFromSearchCriterias($type, $algo, $searchstring, $max=25, $sortfield='date_creation', $sortorder='DESC', $langcode='', $otherfilters='null', $status=1)
Return list of containers object that match a criteria.
dolWebsiteReplacementOfLinks($website, $content, $removephppart=0, $contenttype='html', $containerid='')
Convert a page content to have correct links (based on DOL_URL_ROOT) into an html content.
dolStripPhpCode($str, $replacewith='')
Remove PHP code part from a string.
dolKeepOnlyPhpCode($str)
Keep only PHP code part from a HTML string page.