dolibarr 20.0.2
index.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2016-2023 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2020 Nicolas ZABOURI <info@inovea-conseil.com>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
29// We allow POST of rich content with js and style, but only for this php file and if into some given POST variable
30define('NOSCANPOSTFORINJECTION', array('PAGE_CONTENT', 'WEBSITE_CSS_INLINE', 'WEBSITE_JS_INLINE', 'WEBSITE_HTML_HEADER', 'htmlheader'));
31
32define('USEDOLIBARREDITOR', 1);
33define('FORCE_CKEDITOR', 1); // We need CKEditor, even if module is off.
34if (!defined('DISABLE_JS_GRAHP')) {
35 define('DISABLE_JS_GRAPH', 1);
36}
37
38//header('X-XSS-Protection:0'); // Disable XSS filtering protection of some browsers (note: use of Content-Security-Policy is more efficient). Disabled as deprecated.
39
40// Load Dolibarr environment
41require '../main.inc.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/website2.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/html.formwebsite.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
52require_once DOL_DOCUMENT_ROOT.'/website/class/website.class.php';
53require_once DOL_DOCUMENT_ROOT.'/website/class/websitepage.class.php';
54require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
55require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
56
57
58// Load translation files required by the page
59$langs->loadLangs(array("admin", "other", "website", "errors"));
60
61// Security check
62if (!$user->hasRight('website', 'read')) {
64}
65
66$conf->dol_hide_leftmenu = 1; // Force hide of left menu.
67
68$error = 0;
69$virtualurl = '';
70$dataroot = '';
71$websiteid = GETPOSTINT('websiteid');
72$websitekey = GETPOST('website', 'alpha');
73$page = GETPOST('page', 'alpha');
74$pageid = GETPOSTINT('pageid');
75$pageref = GETPOST('pageref', 'alphanohtml');
76
77$action = GETPOST('action', 'aZ09');
78$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
79$confirm = GETPOST('confirm', 'alpha');
80$cancel = GETPOST('cancel', 'alpha');
81$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
82$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'websitelist'; // To manage different context of search
83$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
84$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
85$dol_hide_topmenu = GETPOSTINT('dol_hide_topmenu');
86$dol_hide_leftmenu = GETPOSTINT('dol_hide_leftmenu');
87$dol_openinpopup = GETPOST('dol_openinpopup', 'aZ09');
88
89$type_container = GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha');
90$section_dir = GETPOST('section_dir', 'alpha');
91$file_manager = GETPOST('file_manager', 'alpha');
92$replacesite = GETPOST('replacesite', 'alpha');
93$mode = GETPOST('mode', 'alpha');
94
95if (GETPOST('deletesite', 'alpha')) {
96 $action = 'deletesite';
97}
98if (GETPOST('delete', 'alpha')) {
99 $action = 'delete';
100}
101if (GETPOST('preview', 'alpha')) {
102 $action = 'preview';
103}
104if (GETPOST('createsite', 'alpha')) {
105 $action = 'createsite';
106}
107if (GETPOST('createcontainer', 'alpha')) {
108 $action = 'createcontainer';
109}
110if (GETPOST('editcss', 'alpha')) {
111 $action = 'editcss';
112}
113if (GETPOST('editmenu', 'alpha')) {
114 $action = 'editmenu';
115}
116if (GETPOST('setashome', 'alpha')) {
117 $action = 'setashome';
118}
119if (GETPOST('editmeta', 'alpha')) {
120 $action = 'editmeta';
121}
122if (GETPOST('editsource', 'alpha')) {
123 $action = 'editsource';
124}
125if (GETPOST('editcontent', 'alpha')) {
126 $action = 'editcontent';
127}
128if (GETPOST('exportsite', 'alpha')) {
129 $action = 'exportsite';
130}
131if (GETPOST('importsite', 'alpha')) {
132 $action = 'importsite';
133}
134if (GETPOST('createfromclone', 'alpha')) {
135 $action = 'createfromclone';
136}
137if (GETPOST('createpagefromclone', 'alpha')) {
138 $action = 'createpagefromclone';
139}
140if (empty($action) && $file_manager) {
141 $action = 'file_manager';
142}
143if ($action == 'replacesite' || (empty($action) && $replacesite)) { // Test on permission not required
144 $mode = 'replacesite';
145}
146if (GETPOST('refreshsite') || GETPOST('refreshsite_x') || GETPOST('refreshsite.x')) {
147 $pageid = 0;
148}
149
150// Load variable for pagination
151$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
152$sortfield = GETPOST('sortfield', 'aZ09comma');
153$sortorder = GETPOST('sortorder', 'aZ09comma');
154$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
155if (empty($page) || $page == -1) {
156 $page = 0;
157} // If $page is not defined, or '' or -1
158$offset = $limit * $page;
159$pageprev = $page - 1;
160$pagenext = $page + 1;
161//if (! $sortfield) $sortfield='name';
162//if (! $sortorder) $sortorder='ASC';
163
164if (empty($action)) {
165 $action = 'preview';
166}
167
168$object = new Website($db);
169$objectpage = new WebsitePage($db);
170
171$listofwebsites = $object->fetchAll('ASC', 'position'); // Init list of websites
172
173// If website not defined, we take first found
174if (!($websiteid > 0) && empty($websitekey) && $action != 'createsite') {
175 foreach ($listofwebsites as $key => $valwebsite) {
176 $websitekey = $valwebsite->ref;
177 break;
178 }
179}
180if ($websiteid > 0 || $websitekey) {
181 $res = $object->fetch($websiteid, $websitekey);
182 $websitekey = $object->ref;
183}
184
185$website = $object;
186
187// Check pageid received as parameter
188if ($pageid < 0) {
189 $pageid = 0;
190}
191if (($pageid > 0 || $pageref) && $action != 'addcontainer') {
192 $res = $objectpage->fetch($pageid, ($object->id > 0 ? $object->id : null), $pageref);
193 // @phan-suppress
194 if ($res == 0) {
195 $res = $objectpage->fetch($pageid, ($object->id > 0 ? $object->id : null), null, $pageref);
196 }
197
198 // Check if pageid is inside the new website, if not we reset param pageid
199 if ($res >= 0 && $object->id > 0) {
200 if ($objectpage->fk_website != $object->id) { // We have a bad page that does not belong to web site
201 if ($object->fk_default_home > 0) {
202 $res = $objectpage->fetch($object->fk_default_home, $object->id, ''); // We search first page of web site
203 if ($res > 0) {
204 $pageid = $object->fk_default_home;
205 }
206 } else {
207 $res = $objectpage->fetch(0, $object->id, ''); // We search first page of web site
208 if ($res == 0) { // Page was not found, we reset it
209 $objectpage = new WebsitePage($db);
210 } else { // We found a page, we set pageid to it.
211 $pageid = $objectpage->id;
212 }
213 }
214 } else { // We have a valid page. We force pageid for the case we got the page with a fetch on ref.
215 $pageid = $objectpage->id;
216 }
217 }
218}
219
220// Define pageid if pageid and pageref not received as parameter or was wrong
221if (empty($pageid) && empty($pageref) && $object->id > 0 && $action != 'createcontainer') {
222 $pageid = $object->fk_default_home;
223 if (empty($pageid)) {
224 $array = $objectpage->fetchAll($object->id, 'ASC,ASC', 'type_container,pageurl');
225 if (!is_array($array) && $array < 0) {
226 dol_print_error(null, $objectpage->error, $objectpage->errors);
227 }
228 $atleastonepage = (is_array($array) && count($array) > 0);
229
230 $firstpageid = 0;
231 $homepageid = 0;
232 foreach ($array as $key => $valpage) {
233 if (empty($firstpageid)) {
234 $firstpageid = $valpage->id;
235 }
236 if ($object->fk_default_home && $key == $object->fk_default_home) {
237 $homepageid = $valpage->id;
238 }
239 }
240 $pageid = ($homepageid ? $homepageid : $firstpageid); // We choose home page and if not defined yet, we take first page
241 }
242}
243
244
245global $dolibarr_main_data_root;
246$pathofwebsite = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey;
247$filehtmlheader = $pathofwebsite.'/htmlheader.html';
248$filecss = $pathofwebsite.'/styles.css.php';
249$filejs = $pathofwebsite.'/javascript.js.php';
250$filerobot = $pathofwebsite.'/robots.txt';
251$filehtaccess = $pathofwebsite.'/.htaccess';
252$filetpl = $pathofwebsite.'/page'.$pageid.'.tpl.php';
253$fileindex = $pathofwebsite.'/index.php';
254$filewrapper = $pathofwebsite.'/wrapper.php';
255$filemanifestjson = $pathofwebsite.'/manifest.json.php';
256$filereadme = $pathofwebsite.'/README.md';
257$filelicense = $pathofwebsite.'/LICENSE';
258$filemaster = $pathofwebsite.'/master.inc.php';
259
260// Define $urlwithroot
261$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
262$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
263//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
264
265
266$permtouploadfile = $user->hasRight('website', 'write');
267$diroutput = $conf->medias->multidir_output[$conf->entity];
268
269$relativepath = $section_dir;
270$upload_dir = preg_replace('/\/$/', '', $diroutput).'/'.preg_replace('/^\//', '', $relativepath);
271
272$htmlheadercontentdefault = '';
273$htmlheadercontentdefault .= '<link rel="stylesheet" id="google-fonts-css" href="//fonts.googleapis.com/css?family=Open+Sans:300,400,700" />'."\n";
274$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";
275$htmlheadercontentdefault .= '<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>'."\n";
276$htmlheadercontentdefault .= '<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>'."\n";
277$htmlheadercontentdefault .= '<!--'."\n";
278$htmlheadercontentdefault .= '<script src="/document.php?modulepart=medias&file=css/myfile.css"></script>'."\n";
279$htmlheadercontentdefault .= '<script src="/document.php?modulepart=medias&file=js/myfile.js"></script>'."\n";
280$htmlheadercontentdefault .= '-->'."\n";
281
282$manifestjsoncontentdefault = '';
283$manifestjsoncontentdefault .= '{
284 "name": "MyWebsite",
285 "short_name": "MyWebsite",
286 "start_url": "/",
287 "lang": "en-US",
288 "display": "standalone",
289 "background_color": "#fff",
290 "description": "A simple Web app.",
291 "icons": [{
292 "src": "images/'.urlencode($website->ref).'/homescreen48.png",
293 "sizes": "48x48",
294 "type": "image/png"
295 }, {
296 "src": "image/'.urlencode($website->ref).'/homescreen72.png",
297 "sizes": "72x72",
298 "type": "image/png"
299 }, {
300 "src": "image/'.urlencode($website->ref).'/homescreen96.png",
301 "sizes": "96x96",
302 "type": "image/png"
303 }, {
304 "src": "image/'.urlencode($website->ref).'/homescreen144.png",
305 "sizes": "144x144",
306 "type": "image/png"
307 }, {
308 "src": "image/'.urlencode($website->ref).'/homescreen168.png",
309 "sizes": "168x168",
310 "type": "image/png"
311 }, {
312 "src": "image/'.urlencode($website->ref).'/homescreen192.png",
313 "sizes": "192x192",
314 "type": "image/png"
315 }],
316 "related_applications": [{
317 "platform": "play",
318 "url": "https://play.google.com/store/apps/details?id=com.nltechno.dolidroidpro"
319 }]
320}';
321
322$listofpages = array();
323
324$algo = '';
325if (GETPOST('optionmeta')) {
326 $algo .= 'meta';
327}
328if (GETPOST('optioncontent')) {
329 $algo .= 'content';
330}
331if (GETPOST('optionsitefiles')) {
332 $algo .= 'sitefiles';
333}
334
335if (empty($sortfield)) {
336 if ($action == 'file_manager') { // Test on permission not required
337 $sortfield = 'name';
338 $sortorder = 'ASC';
339 } else {
340 $sortfield = 'pageurl';
341 $sortorder = 'ASC';
342 }
343}
344
345$searchkey = GETPOST('searchstring', 'restricthtmlallowunvalid'); // or 'none', must be same then $searchstring
346
347if ($action == 'replacesite' || $mode == 'replacesite') { // Test on permission not required
348 $containertype = GETPOST('optioncontainertype', 'aZ09') != '-1' ? GETPOST('optioncontainertype', 'aZ09') : '';
349 $langcode = GETPOST('optionlanguage', 'aZ09');
350 $otherfilters = array();
351 if (GETPOSTINT('optioncategory') > 0) {
352 $otherfilters['category'] = GETPOSTINT('optioncategory');
353 }
354
355 $listofpages = getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
356}
357
358$usercanedit = $user->hasRight('website', 'write');
359$permissiontoadd = $user->hasRight('website', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_linkedfiles
360$permissiontodelete = $user->hasRight('website', 'delete');
361
362
363/*
364 * Actions
365 */
366
367// Protections
368if (GETPOST('refreshsite') || GETPOST('refreshsite_x') || GETPOST('refreshsite.x') || GETPOST('refreshpage') || GETPOST('refreshpage_x') || GETPOST('refreshpage.x')) {
369 $action = 'preview'; // To avoid to make an action on another page or another site when we click on button to select another site or page.
370}
371if (GETPOST('refreshsite', 'alpha') || GETPOST('refreshsite.x', 'alpha') || GETPOST('refreshsite_x', 'alpha')) { // If we change the site, we reset the pageid and cancel addsite action.
372 if ($action == 'addsite') {
373 $action = 'preview';
374 }
375 if ($action == 'updatesource') {
376 $action = 'preview';
377 }
378
379 $pageid = $object->fk_default_home;
380 if (empty($pageid)) {
381 $array = $objectpage->fetchAll($object->id, 'ASC,ASC', 'type_container,pageurl');
382 if (!is_array($array) && $array < 0) {
383 dol_print_error(null, $objectpage->error, $objectpage->errors);
384 }
385 $atleastonepage = (is_array($array) && count($array) > 0);
386
387 $firstpageid = 0;
388 $homepageid = 0;
389 foreach ($array as $key => $valpage) {
390 if (empty($firstpageid)) {
391 $firstpageid = $valpage->id;
392 }
393 if ($object->fk_default_home && $key == $object->fk_default_home) {
394 $homepageid = $valpage->id;
395 }
396 }
397 $pageid = ($homepageid ? $homepageid : $firstpageid); // We choose home page and if not defined yet, we take first page
398 }
399}
400if (GETPOST('refreshpage', 'alpha') && !in_array($action, array('updatecss'))) {
401 $action = 'preview';
402}
403
404if ($cancel && $action == 'renamefile') {
405 $cancel = '';
406}
407
408// Cancel
409if ($cancel) {
410 $action = 'preview';
411 $mode = '';
412 if ($backtopage) {
413 header("Location: ".$backtopage);
414 exit;
415 }
416}
417
418$savbacktopage = $backtopage;
419$backtopage = $_SERVER["PHP_SELF"].'?file_manager=1&website='.urlencode($websitekey).'&pageid='.urlencode($pageid).(GETPOST('section_dir', 'alpha') ? '&section_dir='.urlencode(GETPOST('section_dir', 'alpha')) : ''); // used after a confirm_deletefile into actions_linkedfiles.inc.php
420if ($sortfield) {
421 $backtopage .= '&sortfield='.urlencode($sortfield);
422}
423if ($sortorder) {
424 $backtopage .= '&sortorder='.urlencode($sortorder);
425}
426include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; // This manage 'sendit', 'confirm_deletefile', 'renamefile' action when submitting new file.
427
428$backtopage = $savbacktopage;
429//var_dump($backtopage);
430//var_dump($action);
431
432if ($action == 'renamefile') { // Must be after include DOL_DOCUMENT_ROOT.'/core/actions_linkedfiles.inc.php'; If action were renamefile, we set it to 'file_manager'
433 $action = 'file_manager';
434}
435
436if ($action == 'setwebsiteonline' && $usercanedit) {
437 $website->setStatut($website::STATUS_VALIDATED, null, '', 'WEBSITE_MODIFY', 'status');
438
439 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('websitepage'));
440 exit;
441}
442if ($action == 'setwebsiteoffline' && $usercanedit) {
443 $result = $website->setStatut($website::STATUS_DRAFT, null, '', 'WEBSITE_MODIFY', 'status');
444
445 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('websitepage'));
446 exit;
447}
448if ($action == 'seteditinline') { // No need of write permission
449 dolibarr_set_const($db, 'WEBSITE_EDITINLINE', 1);
450 setEventMessages($langs->trans("FeatureNotYetAvailable"), null, 'warnings');
451 //dolibarr_set_const($db, 'WEBSITE_SUBCONTAINERSINLINE', 0); // Force disable of 'Include dynamic content'
452 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('pageid'));
453 exit;
454}
455if ($action == 'unseteditinline') { // No need of write permission
456 dolibarr_del_const($db, 'WEBSITE_EDITINLINE');
457 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('pageid'));
458 exit;
459}
460if ($action == 'setshowsubcontainers') { // No need of write permission
461 dolibarr_set_const($db, 'WEBSITE_SUBCONTAINERSINLINE', 1);
462 //dolibarr_set_const($db, 'WEBSITE_EDITINLINE', 0); // Force disable of edit inline
463 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('pageid'));
464 exit;
465}
466if ($action == 'unsetshowsubcontainers') { // No need of write permission
467 dolibarr_del_const($db, 'WEBSITE_SUBCONTAINERSINLINE');
468 header("Location: ".$_SERVER["PHP_SELF"].'?website='.urlencode(GETPOST('website')).'&pageid='.GETPOSTINT('pageid'));
469 exit;
470}
471
472if ($massaction == 'replace' && GETPOST('confirmmassaction', 'alpha') && !$searchkey && $usercanedit) {
473 $mode = 'replacesite';
474 $action = 'replacesite';
475 $massaction = '';
476}
477
478if ($action == 'deletetemplate' && $usercanedit) {
479 $dirthemes = array('/doctemplates/websites');
480 if (!empty($conf->modules_parts['websitetemplates'])) { // Using this feature slow down application
481 foreach ($conf->modules_parts['websitetemplates'] as $reldir) {
482 $dirthemes = array_merge($dirthemes, (array) ($reldir.'doctemplates/websites'));
483 }
484 }
485 $dirthemes = array_unique($dirthemes);
486
487
488 // Delete template files and dir
489 $mode = 'importsite';
490 $action = 'importsite';
491
492 if (count($dirthemes)) {
493 $i = 0;
494 foreach ($dirthemes as $dir) {
495 //print $dirroot.$dir;exit;
496 $dirtheme = DOL_DATA_ROOT.$dir; // This include loop on $conf->file->dol_document_root
497 if (is_dir($dirtheme)) {
498 $templateuserfile = GETPOST('templateuserfile');
499 $imguserfile = preg_replace('/\.zip$/', '', $templateuserfile).'.jpg';
500 dol_delete_file($dirtheme.'/'.$templateuserfile);
501 dol_delete_file($dirtheme.'/'.$imguserfile);
502 }
503 }
504 }
505}
506
507// Set category
508if ($massaction == 'setcategory' && GETPOST('confirmmassaction', 'alpha') && $usercanedit) {
509 $error = 0;
510 $nbupdate = 0;
511
512 $db->begin();
513
514 $categoryid = GETPOSTINT('setcategory');
515 if ($categoryid > 0) {
516 $tmpwebsitepage = new WebsitePage($db);
517 $category = new Categorie($db);
518 $category->fetch($categoryid);
519
520 foreach ($toselect as $tmpid) {
521 $tmpwebsitepage->id = $tmpid;
522 $result = $category->add_type($tmpwebsitepage, 'website_page');
523 if ($result < 0 && $result != -3) {
524 $error++;
525 setEventMessages($category->error, $category->errors, 'errors');
526 break;
527 } else {
528 $nbupdate++;
529 }
530 }
531 }
532
533 if ($error) {
534 $db->rollback();
535 } else {
536 if ($nbupdate) {
537 setEventMessages($langs->trans("RecordsModified", $nbupdate), null, 'mesgs');
538 }
539
540 $db->commit();
541 }
542 // Now we reload list
543 $listofpages = getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
544}
545
546// Del category
547if ($massaction == 'delcategory' && GETPOST('confirmmassaction', 'alpha') && $usercanedit) {
548 $error = 0;
549 $nbupdate = 0;
550
551 $db->begin();
552
553 $categoryid = GETPOSTINT('setcategory');
554 if ($categoryid > 0) {
555 $tmpwebsitepage = new WebsitePage($db);
556 $category = new Categorie($db);
557 $category->fetch($categoryid);
558
559 foreach ($toselect as $tmpid) {
560 $tmpwebsitepage->id = $tmpid;
561 $result = $category->del_type($tmpwebsitepage, 'website_page');
562 if ($result < 0 && $result != -3) {
563 $error++;
564 setEventMessages($category->error, $category->errors, 'errors');
565 break;
566 } else {
567 $nbupdate++;
568 }
569 }
570 }
571
572 if ($error) {
573 $db->rollback();
574 } else {
575 if ($nbupdate) {
576 setEventMessages($langs->trans("RecordsModified", $nbupdate), null, 'mesgs');
577 }
578
579 $db->commit();
580 }
581 // Now we reload list
582 $listofpages = getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters, -1);
583}
584
585// Replacement of string into pages
586if ($massaction == 'replace' && GETPOST('confirmmassaction', 'alpha') && $usercanedit) {
587 $replacestring = GETPOST('replacestring', 'restricthtmlallowunvalid'); // or 'none', must be same then $searchstring
588
589 $dolibarrdataroot = preg_replace('/([\\/]+)$/i', '', DOL_DATA_ROOT);
590 $allowimportsite = true;
591 if (dol_is_file($dolibarrdataroot.'/installmodules.lock')) {
592 $allowimportsite = false;
593 }
594
595 if (!$allowimportsite) {
596 // Blocked by installmodules.lock
597 if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
598 // Show clean corporate message
599 $message = $langs->trans('InstallModuleFromWebHasBeenDisabledContactUs');
600 } else {
601 // Show technical generic message
602 $message = $langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock');
603 }
604 setEventMessages($message, null, 'errors');
605 } elseif (!$user->hasRight('website', 'writephp')) {
606 setEventMessages("NotAllowedToAddDynamicContent", null, 'errors');
607 } elseif (!$replacestring) {
608 setEventMessages("ErrorReplaceStringEmpty", null, 'errors');
609 } else {
610 $nbreplacement = 0;
611
612 foreach ($toselect as $keyselected) {
613 $objectpage = $listofpages['list'][$keyselected];
614 if ($objectpage->pageurl) {
615 dol_syslog("Replace string into page ".$objectpage->pageurl);
616
617 if (GETPOST('optioncontent', 'aZ09')) {
618 $objectpage->content = str_replace($searchkey, $replacestring, $objectpage->content);
619 }
620 if (GETPOST('optionmeta', 'aZ09')) {
621 $objectpage->title = str_replace($searchkey, $replacestring, $objectpage->title);
622 $objectpage->description = str_replace($searchkey, $replacestring, $objectpage->description);
623 $objectpage->keywords = str_replace($searchkey, $replacestring, $objectpage->keywords);
624 }
625
626 $filealias = $pathofwebsite.'/'.$objectpage->pageurl.'.php';
627 $filetpl = $pathofwebsite.'/page'.$objectpage->id.'.tpl.php';
628
629 // Save page alias
630 $result = dolSavePageAlias($filealias, $object, $objectpage);
631 if (!$result) {
632 setEventMessages('Failed to write file '.basename($filealias), null, 'errors');
633 }
634
635 // Save page of content
636 $result = dolSavePageContent($filetpl, $object, $objectpage, 1);
637 if ($result) {
638 $nbreplacement++;
639 //var_dump($objectpage->content);exit;
640 $objectpage->update($user);
641 } else {
642 $error++;
643 setEventMessages('Failed to write file '.$filetpl, null, 'errors');
644 $action = 'createcontainer';
645 break;
646 }
647 }
648 }
649
650 if ($nbreplacement > 0) {
651 setEventMessages($langs->trans("ReplacementDoneInXPages", $nbreplacement), null, 'mesgs');
652 }
653
654 $containertype = GETPOST('optioncontainertype', 'aZ09') != '-1' ? GETPOST('optioncontainertype', 'aZ09') : '';
655 $langcode = GETPOST('optionlanguage', 'aZ09');
656 $otherfilters = array();
657 if (GETPOSTINT('optioncategory') > 0) {
658 $otherfilters['category'] = GETPOSTINT('optioncategory');
659 }
660
661 // Now we reload list
662 $listofpages = getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters);
663 }
664}
665
666
667// Add directory
668/*
669if ($action == 'adddir' && $permtouploadfile)
670{
671 $ecmdir->ref = 'NOTUSEDYET';
672 $ecmdir->label = GETPOST("label");
673 $ecmdir->description = GETPOST("desc");
674
675 //$id = $ecmdir->create($user);
676 if ($id > 0)
677 {
678 header("Location: ".$_SERVER["PHP_SELF"]);
679 exit;
680 }
681 else
682 {
683 setEventMessages('Error '.$langs->trans($ecmdir->error), null, 'errors');
684 $action = "createcontainer";
685 }
686
687 clearstatcache();
688}
689*/
690
691// Add a website
692if ($action == 'addsite' && $usercanedit) {
693 $db->begin();
694
695 if (GETPOST('virtualhost', 'alpha') && !preg_match('/^http/', GETPOST('virtualhost', 'alpha'))) {
696 $error++;
697 setEventMessages($langs->trans('ErrorURLMustStartWithHttp', $langs->transnoentitiesnoconv("VirtualHost")), null, 'errors');
698 }
699
700 if (!$error && !GETPOST('WEBSITE_REF', 'alpha')) {
701 $error++;
702 $langs->load("errors");
703 setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities("WebsiteName")), null, 'errors');
704 }
705 if (!$error && !preg_match('/^[a-z0-9_\-\.]+$/i', GETPOST('WEBSITE_REF', 'alpha'))) {
706 $error++;
707 $langs->load("errors");
708 setEventMessages($langs->transnoentities("ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities("Ref")), null, 'errors');
709 }
710
711 if (!$error) {
712 $arrayotherlang = explode(',', GETPOST('WEBSITE_OTHERLANG', 'alphanohtml'));
713 foreach ($arrayotherlang as $key => $val) {
714 // It possible we have empty val here if postparam WEBSITE_OTHERLANG is empty or set like this : 'en,,sv' or 'en,sv,'
715 if (empty(trim($val))) {
716 continue;
717 }
718 $arrayotherlang[$key] = substr(trim($val), 0, 2); // Kept short language code only
719 }
720
721 $tmpobject = new Website($db);
722 $tmpobject->ref = GETPOST('WEBSITE_REF', 'alpha');
723 $tmpobject->description = GETPOST('WEBSITE_DESCRIPTION', 'alphanohtml');
724 $tmpobject->lang = GETPOST('WEBSITE_LANG', 'aZ09');
725 $tmpobject->otherlang = implode(',', $arrayotherlang);
726 $tmpobject->virtualhost = GETPOST('virtualhost', 'alpha');
727
728 $result = $tmpobject->create($user);
729 if ($result == 0) {
730 $error++;
731 setEventMessages($langs->trans("ErrorLabelAlreadyExists"), null, 'errors');
732 } elseif ($result < 0) {
733 $error++;
734 setEventMessages($tmpobject->error, $tmpobject->errors, 'errors');
735 }
736 }
737
738 if (!$error) {
739 $db->commit();
740 setEventMessages($langs->trans("SiteAdded", $object->ref), null, 'mesgs');
741 $action = '';
742
743 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$tmpobject->ref);
744 exit;
745 } else {
746 $db->rollback();
747 $action = 'createsite';
748 }
749
750 if (!$error) {
751 $action = 'preview';
752 $id = $object->id;
753 }
754}
755
756'@phan-var-force int $error';
757
758// Add page/container
759if ($action == 'addcontainer' && $usercanedit) {
760 dol_mkdir($pathofwebsite);
761
762 $db->begin();
763
764 $objectpage->fk_website = $object->id;
765
766 if (GETPOSTISSET('fetchexternalurl')) { // Fetch from external url
767 $urltograb = GETPOST('externalurl', 'alpha');
768 $grabimages = GETPOST('grabimages', 'alpha');
769 $grabimagesinto = GETPOST('grabimagesinto', 'alpha');
770
771 include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
772 // The include seems to break typing on variables
773
774 if (empty($urltograb)) {
775 $error++;
776 $langs->load("errors");
777 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("URL")), null, 'errors');
778 $action = 'createcontainer';
779 } elseif (!preg_match('/^http/', $urltograb)) {
780 $error++;
781 $langs->load("errors");
782 setEventMessages('Error URL must start with http:// or https://', null, 'errors');
783 $action = 'createcontainer';
784 }
785
786 if (!$error) {
787 // Clean url to grab, so url can be
788 // http://www.example.com/ or http://www.example.com/dir1/ or http://www.example.com/dir1/aaa
789 $urltograbwithoutdomainandparam = preg_replace('/^https?:\/\/[^\/]+\/?/i', '', $urltograb);
790 //$urltograbwithoutdomainandparam = preg_replace('/^file:\/\/[^\/]+\/?/i', '', $urltograb);
791 $urltograbwithoutdomainandparam = preg_replace('/\?.*$/', '', $urltograbwithoutdomainandparam);
792 if (empty($urltograbwithoutdomainandparam) && !preg_match('/\/$/', $urltograb)) {
793 $urltograb .= '/';
794 }
795 $pageurl = dol_sanitizeFileName(preg_replace('/[\/\.]/', '-', preg_replace('/\/+$/', '', $urltograbwithoutdomainandparam)));
796
797 $urltograbdirwithoutslash = dirname($urltograb.'.');
798 $urltograbdirrootwithoutslash = getRootURLFromURL($urltograbdirwithoutslash);
799 // Example, now $urltograbdirwithoutslash is https://www.dolimed.com/screenshots
800 // and $urltograbdirrootwithoutslash is https://www.dolimed.com
801 }
802
803 // Check pageurl is not already used
804 if ($pageurl) {
805 $tmpwebsitepage = new WebsitePage($db);
806 $result = $tmpwebsitepage->fetch(0, $object->id, $pageurl);
807 if ($result > 0) {
808 setEventMessages($langs->trans("AliasPageAlreadyExists", $pageurl), null, 'errors');
809 $error++;
810 $action = 'createcontainer';
811 }
812 }
813
814 if (!$error) {
815 $tmp = getURLContent($urltograb, 'GET', '', 1, array(), array('http', 'https'), 0);
816
817 // Test charset of result and convert it into UTF-8 if not in this encoding charset
818 if (!empty($tmp['content_type']) && preg_match('/ISO-8859-1/', $tmp['content_type'])) {
819 if (function_exists('mb_check_encoding')) {
820 if (mb_check_encoding($tmp['content'], 'ISO-8859-1')) {
821 // This is a ISO-8829-1 encoding string
822 $tmp['content'] = mb_convert_encoding($tmp['content'], 'ISO-8859-1', 'UTF-8');
823 } else {
824 $error++;
825 setEventMessages('Error getting '.$urltograb.': content seems non valid ISO-8859-1', null, 'errors');
826 $action = 'createcontainer';
827 }
828 } else {
829 $error++;
830 setEventMessages('Error getting '.$urltograb.': content seems ISO-8859-1 but functions to convert into UTF-8 are not available in your PHP', null, 'errors');
831 $action = 'createcontainer';
832 }
833 }
834 if (empty($tmp['content_type']) || (!empty($tmp['content_type']) && preg_match('/UTF-8/', $tmp['content_type']))) {
835 if (function_exists('mb_check_encoding')) {
836 if (mb_check_encoding($tmp['content'], 'UTF-8')) {
837 // This is a UTF8 or ASCII compatible string
838 } else {
839 $error++;
840 setEventMessages('Error getting '.$urltograb.': content seems not a valid UTF-8', null, 'errors');
841 $action = 'createcontainer';
842 }
843 }
844 }
845
846 if ($tmp['curl_error_no']) {
847 $error++;
848 setEventMessages('Error getting '.$urltograb.': '.$tmp['curl_error_msg'], null, 'errors');
849 $action = 'createcontainer';
850 } elseif ($tmp['http_code'] != '200') {
851 $error++;
852 setEventMessages('Error getting '.$urltograb.': '.$tmp['http_code'], null, 'errors');
853 $action = 'createcontainer';
854 } else {
855 // Remove comments
856 $tmp['content'] = removeHtmlComment($tmp['content']);
857
858 // Check there is no PHP content into the imported file (must be only HTML + JS)
859 $phpcontent = dolKeepOnlyPhpCode($tmp['content']);
860 if ($phpcontent) {
861 $error++;
862 setEventMessages('Error getting '.$urltograb.': file that include PHP content is not allowed', null, 'errors');
863 $action = 'createcontainer';
864 }
865 }
866
867 if (!$error) {
868 $regs = array();
869
870 preg_match('/<head>(.*)<\/head>/ims', $tmp['content'], $regs);
871 $head = $regs[1];
872
873 $objectpage->type_container = 'page';
874 $objectpage->pageurl = $pageurl;
875 if (empty($objectpage->pageurl)) {
876 $tmpdomain = getDomainFromURL($urltograb);
877 $objectpage->pageurl = $tmpdomain.'-home';
878 }
879
880 $objectpage->aliasalt = '';
881
882 if (preg_match('/^(\d+)\-/', basename($urltograb), $regs)) {
883 $objectpage->aliasalt = $regs[1];
884 }
885
886 $regtmp = array();
887 if (preg_match('/<title>(.*)<\/title>/ims', $head, $regtmp)) {
888 $objectpage->title = $regtmp[1];
889 }
890 if (preg_match('/<meta name="title"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
891 if (empty($objectpage->title)) {
892 $objectpage->title = $regtmp[1]; // If title not found into <title>, we get it from <meta title>
893 }
894 }
895 if (preg_match('/<meta name="description"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
896 $objectpage->description = $regtmp[1];
897 }
898 if (preg_match('/<meta name="keywords"[^"]+content="([^"]+)"/ims', $head, $regtmp)) {
899 $objectpage->keywords = $regtmp[1];
900 }
901 if (preg_match('/<html\s+lang="([^"]+)"/ims', $tmp['content'], $regtmp)) {
902 $tmplang = explode('-', $regtmp[1]);
903 $objectpage->lang = $tmplang[0].($tmplang[1] ? '_'.strtoupper($tmplang[1]) : '');
904 }
905
906 $tmp['content'] = preg_replace('/\s*<meta name="generator"[^"]+content="([^"]+)"\s*\/?>/ims', '', $tmp['content']);
907
908 $objectpage->content = $tmp['content'];
909 $objectpage->content = preg_replace('/^.*<body(\s[^>]*)*>/ims', '', $objectpage->content);
910 $objectpage->content = preg_replace('/<\/body(\s[^>]*)*>.*$/ims', '', $objectpage->content);
911
912 // TODO Replace 'action="$urltograbdirwithoutslash' into action="/"
913 // TODO Replace 'action="$urltograbdirwithoutslash..."' into action="..."
914 // TODO Replace 'a href="$urltograbdirwithoutslash' into a href="/"
915 // TODO Replace 'a href="$urltograbdirwithoutslash..."' into a href="..."
916
917 // Now loop to fetch all css files. Include them inline into header of page
918 $objectpage->htmlheader = $tmp['content'];
919 $objectpage->htmlheader = preg_replace('/^.*<head(\s[^>]*)*>/ims', '', $objectpage->htmlheader);
920 $objectpage->htmlheader = preg_replace('/<\/head(\s[^>]*)*>.*$/ims', '', $objectpage->htmlheader);
921 $objectpage->htmlheader = preg_replace('/<base(\s[^>]*)*>\n*/ims', '', $objectpage->htmlheader);
922 $objectpage->htmlheader = preg_replace('/<meta http-equiv="content-type"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
923 $objectpage->htmlheader = preg_replace('/<meta name="robots"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
924 $objectpage->htmlheader = preg_replace('/<meta name="title"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
925 $objectpage->htmlheader = preg_replace('/<meta name="description"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
926 $objectpage->htmlheader = preg_replace('/<meta name="keywords"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
927 $objectpage->htmlheader = preg_replace('/<meta name="generator"([^>]*)*>\n*/ims', '', $objectpage->htmlheader);
928 //$objectpage->htmlheader = preg_replace('/<meta name="verify-v1[^>]*>\n*/ims', '', $objectpage->htmlheader);
929 //$objectpage->htmlheader = preg_replace('/<meta name="msvalidate.01[^>]*>\n*/ims', '', $objectpage->htmlheader);
930 $objectpage->htmlheader = preg_replace('/<title>[^<]*<\/title>\n*/ims', '', $objectpage->htmlheader);
931 $objectpage->htmlheader = preg_replace('/<link[^>]*rel="shortcut[^>]*>\n/ims', '', $objectpage->htmlheader);
932 $objectpage->htmlheader = preg_replace('/<link[^>]*rel="alternate[^>]*>\n/ims', '', $objectpage->htmlheader);
933 $objectpage->htmlheader = preg_replace('/<link[^>]*rel="canonical[^>]*>\n/ims', '', $objectpage->htmlheader);
934
935 // Now loop to fetch JS
936 $tmp = $objectpage->htmlheader;
937
938 // We grab files found into <script> tags
939 preg_match_all('/<script([^\.>]+)src=["\']([^"\'>]+)["\']([^>]*)><\/script>/i', $objectpage->htmlheader, $regs);
940 $errorforsubresource = 0;
941 foreach ($regs[0] as $key => $val) {
942 dol_syslog("We will grab the script resource found into script tag ".$regs[2][$key]);
943
944 $linkwithoutdomain = $regs[2][$key];
945 if (preg_match('/^\//', $regs[2][$key])) {
946 $urltograbbis = $urltograbdirrootwithoutslash.$regs[2][$key]; // We use dirroot
947 } else {
948 $urltograbbis = $urltograbdirwithoutslash.'/'.$regs[2][$key]; // We use dir of grabbed file
949 }
950
951 //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key];
952 if (preg_match('/^http/', $regs[2][$key])) {
953 $urltograbbis = $regs[2][$key];
954 $linkwithoutdomain = preg_replace('/^https?:\/\/[^\/]+\//i', '', $regs[2][$key]);
955 //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain;
956 }
957
958 //print $domaintograb.' - '.$domaintograbbis.' - '.$urltograbdirwithoutslash.' - ';
959 //print $linkwithoutdomain.' - '.$urltograbbis."<br>\n";
960
961 // Test if this is an external URL of grabbed web site. If yes, we do not load resource
962 $domaintograb = getDomainFromURL($urltograbdirwithoutslash);
963 $domaintograbbis = getDomainFromURL($urltograbbis);
964 if ($domaintograb != $domaintograbbis) {
965 continue;
966 }
967
968 /*
969 $tmpgeturl = getURLContent($urltograbbis, 'GET', '', 1, array(), array('http', 'https'), 0);
970 if ($tmpgeturl['curl_error_no'])
971 {
972 $error++;
973 setEventMessages('Error getting script url '.$urltograbbis.': '.$tmpgeturl['curl_error_msg'], null, 'errors');
974 $errorforsubresource++;
975 $action='createcontainer';
976 }
977 elseif ($tmpgeturl['http_code'] != '200')
978 {
979 $error++;
980 setEventMessages('Error getting script url '.$urltograbbis.': '.$tmpgeturl['http_code'], null, 'errors');
981 $errorforsubresource++;
982 $action='createcontainer';
983 }
984 else
985 {
986 dol_mkdir(dirname($filetosave));
987
988 $fp = fopen($filetosave, "w");
989 fputs($fp, $tmpgeturl['content']);
990 fclose($fp);
991 dolChmod($file);
992 }
993 */
994
995 //$filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain;
996 $tmp = preg_replace('/'.preg_quote($regs[0][$key], '/').'/i', '', $tmp);
997 }
998 $objectpage->htmlheader = trim($tmp)."\n";
999
1000
1001 // Now we grab CSS found into <link> tags
1002 $pagecsscontent = "\n".'<style>'."\n";
1003
1004 preg_match_all('/<link([^\.>]+)href=["\']([^"\'>]+\.css[^"\'>]*)["\']([^>]*)>/i', $objectpage->htmlheader, $regs);
1005 $errorforsubresource = 0;
1006 foreach ($regs[0] as $key => $val) {
1007 dol_syslog("We will grab the css resources found into link tag ".$regs[2][$key]);
1008
1009 $linkwithoutdomain = $regs[2][$key];
1010 if (preg_match('/^\//', $regs[2][$key])) {
1011 $urltograbbis = $urltograbdirrootwithoutslash.$regs[2][$key]; // We use dirroot
1012 } else {
1013 $urltograbbis = $urltograbdirwithoutslash.'/'.$regs[2][$key]; // We use dir of grabbed file
1014 }
1015
1016 //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $regs[2][$key])?'':'/').$regs[2][$key];
1017 if (preg_match('/^http/', $regs[2][$key])) {
1018 $urltograbbis = $regs[2][$key];
1019 $linkwithoutdomain = preg_replace('/^https?:\/\/[^\/]+\//i', '', $regs[2][$key]);
1020 //$filetosave = $conf->medias->multidir_output[$conf->entity].'/css/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain;
1021 }
1022
1023 //print $domaintograb.' - '.$domaintograbbis.' - '.$urltograbdirwithoutslash.' - ';
1024 //print $linkwithoutdomain.' - '.$urltograbbis."<br>\n";
1025
1026 // Test if this is an external URL of grabbed web site. If yes, we do not load resource
1027 $domaintograb = getDomainFromURL($urltograbdirwithoutslash);
1028 $domaintograbbis = getDomainFromURL($urltograbbis);
1029 if ($domaintograb != $domaintograbbis) {
1030 continue;
1031 }
1032
1033 $tmpgeturl = getURLContent($urltograbbis, 'GET', '', 1, array(), array('http', 'https'), 0);
1034 if ($tmpgeturl['curl_error_no']) {
1035 $errorforsubresource++;
1036 setEventMessages('Error getting link tag url '.$urltograbbis.': '.$tmpgeturl['curl_error_msg'], null, 'errors');
1037 dol_syslog('Error getting '.$urltograbbis.': '.$tmpgeturl['curl_error_msg']);
1038 $action = 'createcontainer';
1039 } elseif ($tmpgeturl['http_code'] != '200') {
1040 $errorforsubresource++;
1041 setEventMessages('Error getting link tag url '.$urltograbbis.': '.$tmpgeturl['http_code'], null, 'errors');
1042 dol_syslog('Error getting '.$urltograbbis.': '.$tmpgeturl['curl_error_msg']);
1043 $action = 'createcontainer';
1044 } else {
1045 // Clean some comment
1046 //$tmpgeturl['content'] = dol_string_is_good_iso($tmpgeturl['content'], 1);
1047 //$tmpgeturl['content'] = mb_convert_encoding($tmpgeturl['content'], 'UTF-8', 'UTF-8');
1048 //$tmpgeturl['content'] = remove_bs($tmpgeturl['content']);
1049 //$tmpgeturl['content'] = str_replace('$screen-md-max', 'auto', $tmpgeturl['content']);
1050
1051 //var_dump($tmpgeturl['content']);exit;
1052 $tmpgeturl['content'] = preg_replace('/\/\*\s+CSS content[a-z\s]*\s+\*\//', '', $tmpgeturl['content']);
1053
1054 //dol_mkdir(dirname($filetosave));
1055
1056 //$fp = fopen($filetosave, "w");
1057 //fputs($fp, $tmpgeturl['content']);
1058 //fclose($fp);
1059 //dolChmod($file);
1060
1061 // $filename = 'image/'.$object->ref.'/'.$objectpage->pageurl.(preg_match('/^\//', $linkwithoutdomain)?'':'/').$linkwithoutdomain;
1062 $pagecsscontent .= '/* Content of file '.$urltograbbis.' */'."\n";
1063
1064 getAllImages($object, $objectpage, $urltograbbis, $tmpgeturl['content'], $action, 1, $grabimages, $grabimagesinto);
1065
1066 // We try to convert the CSS we got by adding a prefix .bodywebsite with lessc to avoid conflict with CSS of Dolibarr.
1067 include_once DOL_DOCUMENT_ROOT.'/core/class/lessc.class.php';
1068 $lesscobj = new Lessc();
1069 try {
1070 $contentforlessc = ".bodywebsite {\n".$tmpgeturl['content']."\n}\n";
1071 //print '<pre>'.$contentforlessc.'</pre>';
1072 $contentforlessc = $lesscobj->compile($contentforlessc);
1073 //var_dump($contentforlessc); exit;
1074
1075 $pagecsscontent .= $contentforlessc."\n";
1076 //$pagecsscontent.=$tmpgeturl['content']."\n";
1077 } catch (exception $e) {
1078 //echo "failed to compile lessc";
1079 dol_syslog("Failed to compile the CSS from URL ".$urltograbbis." with lessc: ".$e->getMessage(), LOG_WARNING);
1080 $pagecsscontent .= $tmpgeturl['content']."\n";
1081 }
1082
1083 $objectpage->htmlheader = preg_replace('/'.preg_quote($regs[0][$key], '/').'\n*/ims', '', $objectpage->htmlheader);
1084 }
1085 }
1086
1087 $pagecsscontent .= '</style>';
1088 //var_dump($pagecsscontent);
1089
1090 //print dol_escape_htmltag($tmp);exit;
1091 $objectpage->htmlheader .= trim($pagecsscontent)."\n";
1092
1093
1094 // Now we have to fetch all images into page
1095 $tmp = $objectpage->content;
1096
1097 getAllImages($object, $objectpage, $urltograb, $tmp, $action, 1, $grabimages, $grabimagesinto);
1098
1099 // Normalize links href to Dolibarr internal naming
1100 $tmp = preg_replace('/a href="\/([^\/"]+)\/([^\/"]+)"/', 'a href="/\1-\2.php"', $tmp);
1101 $tmp = preg_replace('/a href="\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)"/', 'a href="/\1-\2-\3.php"', $tmp);
1102 $tmp = preg_replace('/a href="\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)\/([^\/"]+)"/', 'a href="/\1-\2-\3-\4.php"', $tmp);
1103
1104 //print dol_escape_htmltag($tmp);exit;
1105 $objectpage->content = $tmp;
1106
1107 $objectpage->grabbed_from = $urltograb;
1108 }
1109 }
1110 } else {
1111 $newaliasnames = '';
1112 if (!$error && GETPOST('WEBSITE_ALIASALT', 'alpha')) {
1113 $arrayofaliastotest = explode(',', str_replace(array('<', '>'), '', GETPOST('WEBSITE_ALIASALT', 'alpha')));
1114 $websitepagetemp = new WebsitePage($db);
1115 foreach ($arrayofaliastotest as $aliastotest) {
1116 $aliastotest = trim(preg_replace('/\.php$/i', '', $aliastotest));
1117
1118 // Disallow alias name pageX (already used to save the page with id)
1119 if (preg_match('/^page\d+/i', $aliastotest)) {
1120 $error++;
1121 $langs->load("errors");
1122 setEventMessages("Alias name 'pageX' is not allowed", null, 'errors');
1123 $action = 'createcontainer';
1124 break;
1125 } else {
1126 $result = $websitepagetemp->fetch(0, $object->id, $aliastotest);
1127 if ($result < 0) {
1128 $error++;
1129 $langs->load("errors");
1130 setEventMessages($websitepagetemp->error, $websitepagetemp->errors, 'errors');
1131 $action = 'createcontainer';
1132 break;
1133 }
1134 if ($result > 0) {
1135 $error++;
1136 $langs->load("errors");
1137 setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl), null, 'errors');
1138 $action = 'createcontainer';
1139 break;
1140 }
1141 $newaliasnames .= ($newaliasnames ? ', ' : '').$aliastotest;
1142 }
1143 }
1144 }
1145
1146 $objectpage->title = str_replace(array('<', '>'), '', GETPOST('WEBSITE_TITLE', 'alphanohtml'));
1147 $objectpage->type_container = GETPOST('WEBSITE_TYPE_CONTAINER', 'aZ09');
1148 $objectpage->pageurl = GETPOST('WEBSITE_PAGENAME', 'alpha');
1149 $objectpage->aliasalt = $newaliasnames;
1150 $objectpage->description = str_replace(array('<', '>'), '', GETPOST('WEBSITE_DESCRIPTION', 'alphanohtml'));
1151 $objectpage->lang = GETPOST('WEBSITE_LANG', 'aZ09');
1152 $objectpage->otherlang = GETPOST('WEBSITE_OTHERLANG', 'aZ09comma');
1153 $objectpage->image = GETPOST('WEBSITE_IMAGE', 'alpha');
1154 $objectpage->keywords = str_replace(array('<', '>'), '', GETPOST('WEBSITE_KEYWORDS', 'alphanohtml'));
1155 $objectpage->allowed_in_frames = GETPOST('WEBSITE_ALLOWED_IN_FRAMES', 'aZ09');
1156 $objectpage->htmlheader = GETPOST('htmlheader', 'none');
1157 $objectpage->author_alias = GETPOST('WEBSITE_AUTHORALIAS', 'alphanohtml');
1158 $objectpage->object_type = GETPOST('WEBSITE_OBJECTCLASS');
1159 $objectpage->fk_object = GETPOST('WEBSITE_OBJECTID');
1160 $substitutionarray = array();
1161 $substitutionarray['__WEBSITE_CREATED_BY__'] = $user->getFullName($langs);
1162
1163 // Define id of the page the new page is translation of
1164 /*
1165 if ($objectpage->lang == $object->lang) {
1166 // If
1167 $pageidfortranslation = (GETPOSTINT('pageidfortranslation') > 0 ? GETPOSTINT('pageidfortranslation') : 0);
1168 if ($pageidfortranslation > 0) {
1169 // We must update the page $pageidfortranslation to set fk_page = $object->id.
1170 // But what if page $pageidfortranslation is already linked to another ?
1171 }
1172 } else {
1173 */
1174 $pageidfortranslation = (GETPOSTINT('pageidfortranslation') > 0 ? GETPOSTINT('pageidfortranslation') : 0);
1175 if ($pageidfortranslation > 0) {
1176 // Check if the page we are translation of is already a translation of a source page. if yes, we will use source id instead
1177 $objectpagetmp = new WebsitePage($db);
1178 $objectpagetmp->fetch($pageidfortranslation);
1179 if ($objectpagetmp->fk_page > 0) {
1180 $pageidfortranslation = $objectpagetmp->fk_page;
1181 }
1182 }
1183 $objectpage->fk_page = $pageidfortranslation;
1184 //}
1185
1186 $content = '';
1187 if (GETPOSTISSET('content')) {
1188 //$content = GETPOST('content', 'restricthtmlallowunvalid'); // @TODO Use a restricthtmlallowunvalidwithphp
1189 $content = GETPOST('content', 'none'); // @TODO Use a restricthtmlallowunvalidwithphp
1190
1191 $objectpage->content = make_substitutions($content, $substitutionarray);
1192 } else {
1193 /*$sample = GETPOST('sample', 'alpha');
1194 if (empty($sample)) {
1195 $sample = 'empty';
1196 }
1197
1198 $pathtosample = DOL_DOCUMENT_ROOT.'/website/samples/page-sample-'.dol_sanitizeFileName(strtolower($sample)).'.html';
1199 */
1200 // Init content with content into page-sample-...
1201 //$objectpage->content = make_substitutions(@file_get_contents($pathtosample), $substitutionarray);
1202 }
1203 }
1204
1205 if (!$error) {
1206 if (empty($objectpage->pageurl)) {
1207 $langs->load("errors");
1208 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WEBSITE_PAGENAME")), null, 'errors');
1209 $error++;
1210 $action = 'createcontainer';
1211 } elseif (!preg_match('/^[a-z0-9\-\_]+$/i', $objectpage->pageurl)) {
1212 $langs->load("errors");
1213 setEventMessages($langs->transnoentities("ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities('WEBSITE_PAGENAME')), null, 'errors');
1214 $error++;
1215 $action = 'createcontainer';
1216 }
1217 if (empty($objectpage->title)) {
1218 $langs->load("errors");
1219 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WEBSITE_TITLE")), null, 'errors');
1220 $error++;
1221 $action = 'createcontainer';
1222 }
1223 if ($objectpage->fk_page > 0 && empty($objectpage->lang)) {
1224 $langs->load("errors");
1225 setEventMessages($langs->trans("ErrorLanguageRequiredIfPageIsTranslationOfAnother"), null, 'errors');
1226 $error++;
1227 $action = 'createcontainer';
1228 }
1229 if ($objectpage->fk_page > 0 && !empty($objectpage->lang)) {
1230 if ($objectpage->lang == $website->lang) {
1231 $langs->load("errors");
1232 setEventMessages($langs->trans("ErrorLanguageMustNotBeSourceLanguageIfPageIsTranslationOfAnother"), null, 'errors');
1233 $error++;
1234 $action = 'createcontainer';
1235 }
1236 }
1237 }
1238
1239 $pageid = 0;
1240 if (!$error) {
1241 $pageid = $objectpage->create($user);
1242 if ($pageid <= 0) {
1243 $error++;
1244 setEventMessages($objectpage->error, $objectpage->errors, 'errors');
1245 $action = 'createcontainer';
1246 }
1247 }
1248
1249 if (!$error) {
1250 // Website categories association
1251 $categoriesarray = GETPOST('categories', 'array');
1252 $result = $objectpage->setCategories($categoriesarray);
1253 if ($result < 0) {
1254 $error++;
1255 setEventMessages($object->error, $object->errors, 'errors');
1256 }
1257 }
1258
1259 if (!$error) {
1260 // If there is no home page yet, this new page will be set as the home page
1261 if (empty($object->fk_default_home)) {
1262 $object->fk_default_home = $pageid;
1263 $res = $object->update($user);
1264 if ($res <= 0) {
1265 $error++;
1266 setEventMessages($object->error, $object->errors, 'errors');
1267 } else {
1268 $filetpl = $pathofwebsite.'/page'.$pageid.'.tpl.php';
1269
1270 // Generate the index.php page (to be the home page) and the wrapper.php file
1271 $result = dolSaveIndexPage($pathofwebsite, $fileindex, $filetpl, $filewrapper, $object);
1272
1273 if ($result <= 0) {
1274 setEventMessages('Failed to write file '.$fileindex, null, 'errors');
1275 }
1276 }
1277 }
1278 }
1279
1280 if (!$error) {
1281 if ($pageid > 0) {
1282 $filealias = $pathofwebsite.'/'.$objectpage->pageurl.'.php';
1283 $filetpl = $pathofwebsite.'/page'.$objectpage->id.'.tpl.php';
1284
1285 // Save page alias
1286 $result = dolSavePageAlias($filealias, $object, $objectpage);
1287 if (!$result) {
1288 setEventMessages('Failed to write file '.basename($filealias), null, 'errors');
1289 }
1290
1291 // Save page of content
1292 $result = dolSavePageContent($filetpl, $object, $objectpage, 1);
1293 if ($result) {
1294 setEventMessages($langs->trans("Saved"), null, 'mesgs');
1295 } else {
1296 setEventMessages('Failed to write file '.$filetpl, null, 'errors');
1297 $action = 'createcontainer';
1298 }
1299 }
1300 }
1301
1302 if (!$error) {
1303 $db->commit();
1304 setEventMessages($langs->trans("PageAdded", $objectpage->pageurl), null, 'mesgs');
1305 $action = '';
1306 } else {
1307 $db->rollback();
1308 }
1309
1310 if (!$error) {
1311 $pageid = $objectpage->id;
1312
1313 // To generate the CSS, robot and htmlheader file.
1314
1315 // Check symlink to medias and restore it if ko
1316 $pathtomedias = DOL_DATA_ROOT.'/medias';
1317 $pathtomediasinwebsite = $pathofwebsite.'/medias';
1318 if (!is_link(dol_osencode($pathtomediasinwebsite))) {
1319 dol_syslog("Create symlink for ".$pathtomedias." into name ".$pathtomediasinwebsite);
1320 dol_mkdir(dirname($pathtomediasinwebsite)); // To be sure dir for website exists
1321 $result = symlink($pathtomedias, $pathtomediasinwebsite);
1322 }
1323
1324 // Now generate the master.inc.php page if it does not exists yet
1325 if (!dol_is_file($filemaster)) {
1326 $result = dolSaveMasterFile($filemaster);
1327 if (!$result) {
1328 $error++;
1329 setEventMessages('Failed to write file '.$filemaster, null, 'errors');
1330 }
1331 }
1332
1333 if (!dol_is_file($filehtmlheader)) {
1334 $htmlheadercontent = "<html>\n";
1335 $htmlheadercontent .= $htmlheadercontentdefault;
1336 $htmlheadercontent .= "</html>";
1337 $result = dolSaveHtmlHeader($filehtmlheader, $htmlheadercontent);
1338 }
1339
1340 if (!dol_is_file($filecss)) {
1341 $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;}";
1342 $result = dolSaveCssFile($filecss, $csscontent);
1343 }
1344
1345 if (!dol_is_file($filejs)) {
1346 $jscontent = "/* JS content (all pages) */\n";
1347 $result = dolSaveJsFile($filejs, $jscontent);
1348 }
1349
1350 if (!dol_is_file($filerobot)) {
1351 $robotcontent = "# Robot file. Generated with Dolibarr\nUser-agent: *\nAllow: /public/\nDisallow: /administrator/";
1352 $result = dolSaveRobotFile($filerobot, $robotcontent);
1353 }
1354
1355 if (!dol_is_file($filehtaccess)) {
1356 $htaccesscontent = "# Order allow,deny\n# Deny from all";
1357 $result = dolSaveHtaccessFile($filehtaccess, $htaccesscontent);
1358 }
1359
1360 if (!dol_is_file($filemanifestjson)) {
1361 $manifestjsoncontent = "";
1362 $result = dolSaveManifestJson($filemanifestjson, $manifestjsoncontent);
1363 }
1364
1365 if (!dol_is_file($filereadme)) {
1366 $readmecontent = "Website generated by Dolibarr ERP CRM";
1367 $result = dolSaveReadme($filereadme, $readmecontent);
1368 }
1369
1370 if (!dol_is_file($filelicense)) {
1371 $licensecontent = "MIT License";
1372 $result = dolSaveLicense($filelicense, $licensecontent);
1373 }
1374
1375 $action = 'preview';
1376 }
1377}
1378
1379// Delete site
1380if ($action == 'confirm_deletesite' && $confirm == 'yes' && $permissiontodelete) {
1381 $error = 0;
1382
1383 $db->begin();
1384
1385 $res = $object->fetch(GETPOSTINT('id'));
1386 $website = $object;
1387
1388 if ($res > 0) {
1389 $res = $object->delete($user);
1390 if ($res <= 0) {
1391 $error++;
1392 setEventMessages($object->error, $object->errors, 'errors');
1393 }
1394 }
1395 if (!$error) {
1396 if (GETPOST('delete_also_js', 'alpha') == 'on') {
1397 $pathofwebsitejs = DOL_DATA_ROOT.'/medias/js/'.$object->ref;
1398
1399 dol_delete_dir_recursive($pathofwebsitejs);
1400 }
1401 if (GETPOST('delete_also_medias', 'alpha') == 'on') {
1402 $pathofwebsitemedias = DOL_DATA_ROOT.'/medias/image/'.$object->ref;
1403
1404 dol_delete_dir_recursive($pathofwebsitemedias);
1405 }
1406 }
1407
1408 if (!$error) {
1409 $db->commit();
1410 setEventMessages($langs->trans("SiteDeleted", $object->ref), null, 'mesgs');
1411
1412 header("Location: ".$_SERVER["PHP_SELF"].'?id='.$object->id);
1413 exit;
1414 } else {
1415 $db->rollback();
1416 setEventMessages($object->error, $object->errors, 'errors');
1417 }
1418}
1419
1420// Delete page (from website page menu)
1421if (GETPOSTISSET('pageid') && $action == 'delete' && $permissiontodelete && !GETPOST('file_manager')) {
1422 $error = 0;
1423
1424 $db->begin();
1425
1426 $res = $object->fetch(0, $websitekey);
1427 $website = $object;
1428
1429 $res = $objectpage->fetch($pageid, $object->id);
1430
1431 if ($res > 0) {
1432 $res = $objectpage->delete($user);
1433 if ($res <= 0) {
1434 $error++;
1435 setEventMessages($objectpage->error, $objectpage->errors, 'errors');
1436 }
1437 }
1438
1439 if (!$error) {
1440 $db->commit();
1441 setEventMessages($langs->trans("PageDeleted", $objectpage->pageurl, $websitekey), null, 'mesgs');
1442
1443 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey);
1444 exit;
1445 } else {
1446 $db->rollback();
1447 dol_print_error($db);
1448 }
1449}
1450// Delete page (from menu search)
1451if (!GETPOSTISSET('pageid')) {
1452 $objectclass = 'WebsitePage';
1453
1454 // Add part of code from actions_massactions.inc.php
1455 // Delete record from mass action (massaction = 'delete' for direct delete, action/confirm='delete'/'yes' with a confirmation step before)
1456 if (!$error && ($massaction == 'delete' || ($action == 'delete' && $confirm == 'yes')) && $permissiontodelete) {
1457 $db->begin();
1458
1459 $objecttmp = new $objectclass($db);
1460 $nbok = 0;
1461 foreach ($toselect as $toselectid) {
1462 $result = $objecttmp->fetch($toselectid);
1463 if ($result > 0) {
1464 $result = $objecttmp->delete($user);
1465
1466 if ($result <= 0) {
1467 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
1468 $error++;
1469 break;
1470 } else {
1471 $nbok++;
1472 }
1473 } else {
1474 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
1475 $error++;
1476 break;
1477 }
1478 }
1479
1480 if (!$error) {
1481 if ($nbok > 1) {
1482 setEventMessages($langs->trans("RecordsDeleted", $nbok), null, 'mesgs');
1483 } else {
1484 setEventMessages($langs->trans("RecordDeleted", $nbok), null, 'mesgs');
1485 }
1486 $db->commit();
1487 } else {
1488 $db->rollback();
1489 }
1490 //var_dump($listofobjectthirdparties);exit;
1491 }
1492
1493 if ($action == 'delete') {
1494 $mode = 'replacesite';
1495 $action = 'replacesite';
1496
1497 $containertype = GETPOST('optioncontainertype', 'aZ09') != '-1' ? GETPOST('optioncontainertype', 'aZ09') : '';
1498 $langcode = GETPOST('optionlanguage', 'aZ09');
1499 $otherfilters = array();
1500 if (GETPOSTINT('optioncategory') > 0) {
1501 $otherfilters['category'] = GETPOSTINT('optioncategory');
1502 }
1503
1504 $listofpages = getPagesFromSearchCriterias($containertype, $algo, $searchkey, 1000, $sortfield, $sortorder, $langcode, $otherfilters);
1505 }
1506}
1507
1508// Update css site properties. Re-generates also the wrapper.
1509if ($action == 'updatecss' && $usercanedit) {
1510 // If we tried to reload another site/page, we stay on editcss mode.
1511 if (GETPOST('refreshsite') || GETPOST('refreshsite_x') || GETPOST('refreshsite.x') || GETPOST('refreshpage') || GETPOST('refreshpage_x') || GETPOST('refreshpage.x')) {
1512 $action = 'editcss';
1513 } else {
1514 $res = $object->fetch(0, $websitekey);
1515 $website = $object;
1516
1517 if (GETPOSTISSET('virtualhost')) {
1518 $tmpvirtualhost = preg_replace('/\/$/', '', GETPOST('virtualhost', 'alpha'));
1519 if ($tmpvirtualhost && !preg_match('/^http/', $tmpvirtualhost)) {
1520 $error++;
1521 setEventMessages($langs->trans('ErrorURLMustStartWithHttp', $langs->transnoentitiesnoconv("VirtualHost")), null, 'errors');
1522 $action = 'editcss';
1523 }
1524
1525 if (!$error) {
1526 $arrayotherlang = explode(',', GETPOST('WEBSITE_OTHERLANG', 'alphanohtml'));
1527 foreach ($arrayotherlang as $key => $val) {
1528 // It possible we have empty val here if postparam WEBSITE_OTHERLANG is empty or set like this : 'en,,sv' or 'en,sv,'
1529 if (empty(trim($val))) {
1530 continue;
1531 }
1532 $arrayotherlang[$key] = substr(trim($val), 0, 2); // Kept short language code only
1533 }
1534
1535 $object->virtualhost = $tmpvirtualhost;
1536 $object->lang = GETPOST('WEBSITE_LANG', 'aZ09');
1537 $object->otherlang = implode(',', $arrayotherlang);
1538 $object->use_manifest = GETPOSTINT('use_manifest');
1539
1540 $result = $object->update($user);
1541 if ($result < 0) {
1542 $error++;
1543 setEventMessages($object->error, $object->errors, 'errors');
1544 $action = 'editcss';
1545 }
1546 }
1547 }
1548
1549 if (!$error) {
1550 if (($_FILES['addedfile']["name"] != '')) {
1551 $uploadfolder = $conf->website->dir_output.'/'.$websitekey;
1552 if ($_FILES['addedfile']['type'] != 'image/png') {
1553 $error++;
1554 setEventMessages($langs->trans('ErrorFaviconType'), array(), 'errors');
1555 }
1556 $filetoread = realpath(dol_osencode($_FILES['addedfile']['tmp_name']));
1557 $filesize = getimagesize($filetoread);
1558 if ($filesize[0] != $filesize[1]) {
1559 $error++;
1560 setEventMessages($langs->trans('ErrorFaviconMustBeASquaredImage'), array(), 'errors');
1561 }
1562 if (! $error && ($filesize[0] != 16 && $filesize[0] != 32 && $filesize[0] != 64)) {
1563 $error++;
1564 setEventMessages($langs->trans('ErrorFaviconSize'), array(), 'errors');
1565 }
1566 if (!$error) {
1567 dol_add_file_process($uploadfolder, 1, 0, 'addedfile', 'favicon.png');
1568 }
1569 }
1570 if ($error) {
1571 if (!GETPOSTISSET('updateandstay')) { // If we click on "Save And Stay", we don not make the redirect
1572 $action = 'preview';
1573 if ($backtopage) {
1574 $backtopage = preg_replace('/searchstring=[^&]*/', '', $backtopage); // Clean backtopage url
1575 header("Location: ".$backtopage);
1576 exit;
1577 }
1578 } else {
1579 $action = 'editcss';
1580 }
1581 }
1582 }
1583
1584 if (!$error) {
1585 // Save master.inc.php file
1586 dol_syslog("Save master file ".$filemaster);
1587
1588 dol_mkdir($pathofwebsite);
1589
1590 // Now generate the master.inc.php page
1591 $result = dolSaveMasterFile($filemaster);
1592 if (!$result) {
1593 $error++;
1594 setEventMessages('Failed to write file '.$filemaster, null, 'errors');
1595 }
1596
1597
1598 $dataposted = trim(GETPOST('WEBSITE_HTML_HEADER', 'none'));
1599 $dataposted = preg_replace(array('/<html>\n*/ims', '/<\/html>\n*/ims'), array('', ''), $dataposted);
1600 $dataposted = str_replace('<?=', '<?php', $dataposted);
1601
1602 // Html header file
1603 $phpfullcodestringold = '';
1604 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1605
1606 // Security analysis
1607 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1608
1609 if (!$errorphpcheck) {
1610 $htmlheadercontent = '';
1611
1612 /* We disable php code since htmlheader is never executed as an include but only read by fgets_content.
1613 $htmlheadercontent.= "<?php // BEGIN PHP\n";
1614 $htmlheadercontent.= '$websitekey=basename(__DIR__);'."\n";
1615 $htmlheadercontent.= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once './master.inc.php'; } // Load env if not already loaded"."\n";
1616 $htmlheadercontent.= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1617 $htmlheadercontent.= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1618 $htmlheadercontent.= "ob_start();\n";
1619 // $htmlheadercontent.= "header('Content-type: text/html');\n"; // Not required. htmlheader.html is never call as a standalone page
1620 $htmlheadercontent.= "// END PHP ?>\n";*/
1621
1622 $htmlheadercontent .= $dataposted."\n";
1623
1624 /*$htmlheadercontent.= "\n".'<?php // BEGIN PHP'."\n";
1625 $htmlheadercontent.= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp);'."\n";
1626 $htmlheadercontent.= "// END PHP"."\n";*/
1627
1628 $result = dolSaveHtmlHeader($filehtmlheader, $htmlheadercontent);
1629 if (!$result) {
1630 $error++;
1631 setEventMessages('Failed to write file '.$filehtmlheader, null, 'errors');
1632 }
1633 } else {
1634 $error++;
1635 }
1636
1637 $dataposted = trim(GETPOST('WEBSITE_CSS_INLINE', 'none'));
1638 $dataposted = str_replace('<?=', '<?php', $dataposted);
1639
1640 // Css file
1641 $phpfullcodestringold = '';
1642 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1643
1644 // Security analysis
1645 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1646
1647 if (!$errorphpcheck) {
1648 $csscontent = '';
1649
1650 $csscontent .= "<?php // BEGIN PHP\n";
1651 $csscontent .= '$websitekey=basename(__DIR__);'."\n";
1652 $csscontent .= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n"; // For the css, we need to set path of master using the dirname of css file.
1653 $csscontent .= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1654 $csscontent .= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1655 $csscontent .= "ob_start();\n";
1656 $csscontent .= "if (! headers_sent()) { /* because file is included inline when in edit mode and we don't want warning */ \n";
1657 $csscontent .= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1658 $csscontent .= "header('Content-type: text/css');\n";
1659 $csscontent .= "}\n";
1660 $csscontent .= "// END PHP ?>\n";
1661
1662 $csscontent .= $dataposted."\n";
1663
1664 $csscontent .= '<?php // BEGIN PHP'."\n";
1665 $csscontent .= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "css");'."\n";
1666 $csscontent .= "// END PHP\n";
1667
1668 dol_syslog("Save css content into ".$filecss);
1669
1670 $result = dolSaveCssFile($filecss, $csscontent);
1671 if (!$result) {
1672 $error++;
1673 setEventMessages('Failed to write file '.$filecss, null, 'errors');
1674 }
1675 } else {
1676 $error++;
1677 }
1678
1679
1680 $dataposted = trim(GETPOST('WEBSITE_JS_INLINE', 'none'));
1681 $dataposted = str_replace('<?=', '<?php', $dataposted);
1682
1683 // Js file
1684 $phpfullcodestringold = '';
1685 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1686
1687 // Security analysis
1688 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1689
1690 if (!$errorphpcheck) {
1691 $jscontent = '';
1692
1693 $jscontent .= "<?php // BEGIN PHP\n";
1694 $jscontent .= '$websitekey=basename(__DIR__);'."\n";
1695 $jscontent .= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n"; // For the css, we need to set path of master using the dirname of css file.
1696 $jscontent .= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1697 $jscontent .= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1698 $jscontent .= "ob_start();\n";
1699 $jscontent .= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1700 $jscontent .= "header('Content-type: application/javascript');\n";
1701 $jscontent .= "// END PHP ?>\n";
1702
1703 $jscontent .= $dataposted."\n";
1704
1705 $jscontent .= '<?php // BEGIN PHP'."\n";
1706 $jscontent .= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "js");'."\n";
1707 $jscontent .= "// END PHP\n";
1708
1709 $result = dolSaveJsFile($filejs, $jscontent);
1710 if (!$result) {
1711 $error++;
1712 setEventMessages('Failed to write file '.$filejs, null, 'errors');
1713 }
1714 } else {
1715 $error++;
1716 }
1717
1718 $dataposted = trim(GETPOST('WEBSITE_ROBOT', 'nohtml'));
1719 $dataposted = str_replace('<?=', '<?php', $dataposted);
1720
1721 // Robot file
1722 $phpfullcodestringold = '';
1723 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1724
1725 // Security analysis
1726 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1727
1728 if (!$errorphpcheck) {
1729 $robotcontent = '';
1730
1731 /*$robotcontent.= "<?php // BEGIN PHP\n";
1732 $robotcontent.= '$websitekey=basename(__DIR__);'."\n";
1733 $robotcontent.= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once './master.inc.php'; } // Load env if not already loaded"."\n";
1734 $robotcontent.= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1735 $robotcontent.= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1736 $robotcontent.= "ob_start();\n";
1737 $robotcontent.= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1738 $robotcontent.= "header('Content-type: text/css');\n";
1739 $robotcontent.= "// END PHP ?>\n";*/
1740
1741 $robotcontent .= $dataposted."\n";
1742
1743 /*$robotcontent.= "\n".'<?php // BEGIN PHP'."\n";
1744 $robotcontent.= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "robot");'."\n";
1745 $robotcontent.= "// END PHP ?>"."\n";*/
1746
1747 $result = dolSaveRobotFile($filerobot, $robotcontent);
1748 if (!$result) {
1749 $error++;
1750 setEventMessages('Failed to write file '.$filerobot, null, 'errors');
1751 }
1752 } else {
1753 $error++;
1754 }
1755
1756 $dataposted = trim(GETPOST('WEBSITE_HTACCESS', 'nohtml'));
1757 $dataposted = str_replace('<?=', '<?php', $dataposted);
1758
1759 // Htaccess file
1760 $phpfullcodestringold = '';
1761 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1762
1763 // Security analysis
1764 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1765
1766 if (!$errorphpcheck) {
1767 $htaccesscontent = '';
1768 $htaccesscontent .= $dataposted."\n";
1769
1770 $result = dolSaveHtaccessFile($filehtaccess, $htaccesscontent);
1771 if (!$result) {
1772 $error++;
1773 setEventMessages('Failed to write file '.$filehtaccess, null, 'errors');
1774 }
1775 } else {
1776 $error++;
1777 }
1778
1779
1780 $dataposted = trim(GETPOST('WEBSITE_MANIFEST_JSON', 'none'));
1781 $dataposted = str_replace('<?=', '<?php', $dataposted);
1782
1783 // Manifest.json file
1784 $phpfullcodestringold = '';
1785 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1786
1787 // Security analysis
1788 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1789
1790 if (!$errorphpcheck) {
1791 $manifestjsoncontent = '';
1792
1793 $manifestjsoncontent .= "<?php // BEGIN PHP\n";
1794 $manifestjsoncontent .= '$websitekey=basename(__DIR__);'."\n";
1795 $manifestjsoncontent .= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded\n"; // For the css, we need to set path of master using the dirname of css file.
1796 $manifestjsoncontent .= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1797 $manifestjsoncontent .= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1798 $manifestjsoncontent .= "ob_start();\n";
1799 $manifestjsoncontent .= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1800 $manifestjsoncontent .= "header('Content-type: application/manifest+json');\n";
1801 $manifestjsoncontent .= "// END PHP ?>\n";
1802
1803 $manifestjsoncontent .= $dataposted."\n";
1804
1805 $manifestjsoncontent .= '<?php // BEGIN PHP'."\n";
1806 $manifestjsoncontent .= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "manifest");'."\n";
1807 $manifestjsoncontent .= "// END PHP\n";
1808
1809 $result = dolSaveManifestJson($filemanifestjson, $manifestjsoncontent);
1810 if (!$result) {
1811 $error++;
1812 setEventMessages('Failed to write file '.$filemanifestjson, null, 'errors');
1813 }
1814 } else {
1815 $error++;
1816 }
1817
1818
1819 $dataposted = trim(GETPOST('WEBSITE_README', 'nohtml'));
1820 $dataposted = str_replace('<?=', '<?php', $dataposted);
1821
1822 // README.md file
1823 $phpfullcodestringold = '';
1824 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1825
1826 // Security analysis
1827 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1828
1829 if (!$errorphpcheck) {
1830 $readmecontent = '';
1831
1832 /*$readmecontent.= "<?php // BEGIN PHP\n";
1833 $readmecontent.= '$websitekey=basename(__DIR__);'."\n";
1834 $readmecontent.= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded"."\n"; // For the css, we need to set path of master using the dirname of css file.
1835 $readmecontent.= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1836 $readmecontent.= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1837 $readmecontent.= "ob_start();\n";
1838 $readmecontent.= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1839 $readmecontent.= "header('Content-type: application/manifest+json');\n";
1840 $readmecontent.= "// END PHP ?>\n";*/
1841
1842 $readmecontent .= $dataposted."\n";
1843
1844 /*$readmecontent.= '<?php // BEGIN PHP'."\n";
1845 $readmecontent.= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "manifest");'."\n";
1846 $readmecontent.= "// END PHP ?>"."\n";*/
1847
1848 $result = dolSaveReadme($filereadme, $readmecontent);
1849 if (!$result) {
1850 $error++;
1851 setEventMessages('Failed to write file '.$filereadme, null, 'errors');
1852 }
1853 } else {
1854 $error++;
1855 }
1856
1857
1858 $dataposted = trim(GETPOST('WEBSITE_LICENSE', 'nohtml'));
1859 $dataposted = str_replace('<?=', '<?php', $dataposted);
1860
1861 // LICENSE file
1862 $phpfullcodestringold = '';
1863 $phpfullcodestring = dolKeepOnlyPhpCode($dataposted);
1864
1865 // Security analysis
1866 $errorphpcheck = checkPHPCode($phpfullcodestringold, $phpfullcodestring); // Contains the setEventMessages
1867
1868 if (!$errorphpcheck) {
1869 $licensecontent = '';
1870
1871 /*$readmecontent.= "<?php // BEGIN PHP\n";
1872 $readmecontent.= '$websitekey=basename(__DIR__);'."\n";
1873 $readmecontent.= "if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) { require_once __DIR__.'/master.inc.php'; } // Load env if not already loaded"."\n"; // For the css, we need to set path of master using the dirname of css file.
1874 $readmecontent.= "require_once DOL_DOCUMENT_ROOT.'/core/lib/website.lib.php';\n";
1875 $readmecontent.= "require_once DOL_DOCUMENT_ROOT.'/core/website.inc.php';\n";
1876 $readmecontent.= "ob_start();\n";
1877 $readmecontent.= "header('Cache-Control: max-age=3600, public, must-revalidate');\n";
1878 $readmecontent.= "header('Content-type: application/manifest+json');\n";
1879 $readmecontent.= "// END PHP ?>\n";*/
1880
1881 $licensecontent .= $dataposted."\n";
1882
1883 /*$readmecontent.= '<?php // BEGIN PHP'."\n";
1884 $readmecontent.= '$tmp = ob_get_contents(); ob_end_clean(); dolWebsiteOutput($tmp, "manifest");'."\n";
1885 $readmecontent.= "// END PHP ?>"."\n";*/
1886
1887 $result = dolSaveLicense($filelicense, $licensecontent);
1888 if (!$result) {
1889 $error++;
1890 setEventMessages('Failed to write file '.$filelicense, null, 'errors');
1891 }
1892 } else {
1893 $error++;
1894 }
1895
1896 // Save wrapper.php
1897 $result = dolSaveIndexPage($pathofwebsite, '', '', $filewrapper, $object);
1898
1899
1900 // Message if no error
1901 if (!$error) {
1902 setEventMessages($langs->trans("Saved"), null, 'mesgs');
1903 }
1904
1905 if (!GETPOSTISSET('updateandstay')) { // If we click on "Save And Stay", we don not make the redirect
1906 $action = 'preview';
1907 if ($backtopage) {
1908 $backtopage = preg_replace('/searchstring=[^&]*/', '', $backtopage); // Clean backtopage url
1909 header("Location: ".$backtopage);
1910 exit;
1911 }
1912 } else {
1913 $action = 'editcss';
1914 }
1915 }
1916 }
1917}
1918
1919// Update page
1920if ($action == 'setashome' && $usercanedit) {
1921 $db->begin();
1922 $object->fetch(0, $websitekey);
1923 $website = $object;
1924
1925 $object->fk_default_home = $pageid;
1926 $res = $object->update($user);
1927 if (! ($res > 0)) {
1928 $error++;
1929 setEventMessages($object->error, $object->errors, 'errors');
1930 }
1931
1932 if (!$error) {
1933 $db->commit();
1934
1935 $filetpl = $pathofwebsite.'/page'.$pageid.'.tpl.php';
1936
1937 // Generate the index.php page to be the home page
1938 $result = dolSaveIndexPage($pathofwebsite, $fileindex, $filetpl, $filewrapper, $object);
1939
1940 if ($result) {
1941 setEventMessages($langs->trans("Saved"), null, 'mesgs');
1942 } else {
1943 setEventMessages('Failed to write file '.$fileindex, null, 'errors');
1944 }
1945
1946 $action = 'preview';
1947 } else {
1948 $db->rollback();
1949 }
1950}
1951
1952// Update page properties (meta)
1953if ($action == 'updatemeta' && $usercanedit) {
1954 $db->begin();
1955
1956 $result = $object->fetch(0, $websitekey);
1957 $website = $object;
1958
1959 $objectpage->fk_website = $object->id;
1960
1961 // Check parameters
1962 if (!preg_match('/^[a-z0-9\-\_]+$/i', GETPOST('WEBSITE_PAGENAME', 'alpha'))) {
1963 $error++;
1964 $langs->load("errors");
1965 setEventMessages($langs->transnoentities("ErrorFieldCanNotContainSpecialCharacters", $langs->transnoentities('WEBSITE_PAGENAME')), null, 'errors');
1966 $action = 'editmeta';
1967 }
1968
1969 $res = $objectpage->fetch($pageid, $object->id);
1970 if ($res <= 0) {
1971 $error++;
1972 setEventMessages('Page not found '.$objectpage->error, $objectpage->errors, 'errors');
1973 }
1974
1975 // Check alias not exists
1976 if (!$error && GETPOST('WEBSITE_PAGENAME', 'alpha')) {
1977 $websitepagetemp = new WebsitePage($db);
1978 $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id, GETPOST('WEBSITE_PAGENAME', 'alpha'));
1979 if ($result < 0) {
1980 $error++;
1981 $langs->load("errors");
1982 setEventMessages($websitepagetemp->error, $websitepagetemp->errors, 'errors');
1983 $action = 'editmeta';
1984 }
1985 if ($result > 0) {
1986 $error++;
1987 $langs->load("errors");
1988 setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl), null, 'errors');
1989 $action = 'editmeta';
1990 }
1991 }
1992
1993 $newaliasnames = '';
1994 if (!$error && GETPOST('WEBSITE_ALIASALT', 'alpha')) {
1995 $arrayofaliastotest = explode(',', str_replace(array('<', '>'), '', GETPOST('WEBSITE_ALIASALT', 'alpha')));
1996
1997 $websitepagetemp = new WebsitePage($db);
1998 foreach ($arrayofaliastotest as $aliastotest) {
1999 $aliastotest = trim(preg_replace('/\.php$/i', '', $aliastotest));
2000
2001 // Disallow alias name pageX (already used to save the page with id)
2002 if (preg_match('/^page\d+/i', $aliastotest)) {
2003 $error++;
2004 $langs->load("errors");
2005 setEventMessages("Alias name 'pageX' is not allowed", null, 'errors');
2006 $action = 'editmeta';
2007 break;
2008 } else {
2009 $result = $websitepagetemp->fetch(-1 * $objectpage->id, $object->id, $aliastotest);
2010 if ($result < 0) {
2011 $error++;
2012 $langs->load("errors");
2013 setEventMessages($websitepagetemp->error, $websitepagetemp->errors, 'errors');
2014 $action = 'editmeta';
2015 break;
2016 }
2017 if ($result > 0) {
2018 $error++;
2019 $langs->load("errors");
2020 setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists", $websitepagetemp->pageurl), null, 'errors');
2021 $action = 'editmeta';
2022 break;
2023 }
2024 $newaliasnames .= ($newaliasnames ? ', ' : '').$aliastotest;
2025 }
2026 }
2027 }
2028
2029 if (!$error) {
2030 $objectpage->old_object = clone $objectpage;
2031
2032 $objectpage->title = str_replace(array('<', '>'), '', GETPOST('WEBSITE_TITLE', 'alphanohtml'));
2033 $objectpage->type_container = GETPOST('WEBSITE_TYPE_CONTAINER', 'aZ09');
2034 $objectpage->pageurl = GETPOST('WEBSITE_PAGENAME', 'alpha');
2035 $objectpage->aliasalt = $newaliasnames;
2036 $objectpage->lang = GETPOST('WEBSITE_LANG', 'aZ09');
2037 $objectpage->otherlang = GETPOST('WEBSITE_OTHERLANG', 'aZ09comma');
2038 $objectpage->description = str_replace(array('<', '>'), '', GETPOST('WEBSITE_DESCRIPTION', 'alphanohtml'));
2039 $objectpage->image = GETPOST('WEBSITE_IMAGE', 'alpha');
2040 $objectpage->keywords = str_replace(array('<', '>'), '', GETPOST('WEBSITE_KEYWORDS', 'alphanohtml'));
2041 $objectpage->allowed_in_frames = GETPOST('WEBSITE_ALLOWED_IN_FRAMES', 'aZ09');
2042 $objectpage->htmlheader = trim(GETPOST('htmlheader', 'none'));
2043 $objectpage->fk_page = (GETPOSTINT('pageidfortranslation') > 0 ? GETPOSTINT('pageidfortranslation') : 0);
2044 $objectpage->author_alias = trim(GETPOST('WEBSITE_AUTHORALIAS', 'alphanohtml'));
2045 $objectpage->object_type = GETPOST('WEBSITE_OBJECTCLASS', 'alpha');
2046 $objectpage->fk_object = GETPOST('WEBSITE_OBJECTID', 'aZ09');
2047
2048 $newdatecreation = dol_mktime(GETPOSTINT('datecreationhour'), GETPOSTINT('datecreationmin'), GETPOSTINT('datecreationsec'), GETPOSTINT('datecreationmonth'), GETPOSTINT('datecreationday'), GETPOSTINT('datecreationyear'));
2049 if ($newdatecreation) {
2050 $objectpage->date_creation = $newdatecreation;
2051 }
2052
2053 $res = $objectpage->update($user);
2054 if (!($res > 0)) {
2055 $langs->load("errors");
2056 if ($db->lasterrno == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
2057 $error++;
2058 $langs->load("errors");
2059 setEventMessages($langs->trans("ErrorAPageWithThisNameOrAliasAlreadyExists"), null, 'errors');
2060 $action = 'editmeta';
2061 } else {
2062 $error++;
2063 $langs->load("errors");
2064 setEventMessages($objectpage->error, $objectpage->errors, 'errors');
2065 $action = 'editmeta';
2066 }
2067 }
2068 }
2069
2070 if (!$error) {
2071 // Website categories association
2072 $categoriesarray = GETPOST('categories', 'array');
2073 $result = $objectpage->setCategories($categoriesarray);
2074 if ($result < 0) {
2075 $error++;
2076 setEventMessages($object->error, $object->errors, 'errors');
2077 }
2078 }
2079
2080 if (!$error) {
2081 $db->commit();
2082 } else {
2083 $db->rollback();
2084 }
2085
2086 if (!$error) {
2087 $filemaster = $pathofwebsite.'/master.inc.php';
2088 $fileoldalias = $pathofwebsite.'/'.$objectpage->old_object->pageurl.'.php';
2089 $filealias = $pathofwebsite.'/'.$objectpage->pageurl.'.php';
2090
2091 dol_mkdir($pathofwebsite);
2092
2093 // Now generate the master.inc.php page
2094 $result = dolSaveMasterFile($filemaster);
2095 if (!$result) {
2096 setEventMessages('Failed to write file '.$filemaster, null, 'errors');
2097 }
2098
2099 // Now delete the alias.php page
2100 if (!empty($fileoldalias)) {
2101 dol_syslog("We delete old alias page name=".$fileoldalias." to build a new alias page=".$filealias);
2102 dol_delete_file($fileoldalias);
2103
2104 // Delete also pages into language subdirectories
2105 if (empty($objectpage->lang) || !in_array($objectpage->lang, explode(',', $object->otherlang))) {
2106 $dirname = dirname($fileoldalias);
2107 $filename = basename($fileoldalias);
2108 $sublangs = explode(',', $object->otherlang);
2109 foreach ($sublangs as $sublang) {
2110 // Under certain conditions $sublang can be an empty string
2111 // ($object->otherlang with empty string or with string like this 'en,,sv')
2112 // if is the case we try to re-delete the main alias file. Avoid it.
2113 if (empty(trim($sublang))) {
2114 continue;
2115 }
2116 $fileoldaliassub = $dirname.'/'.$sublang.'/'.$filename;
2117 dol_delete_file($fileoldaliassub);
2118 }
2119 }
2120 }
2121 // Now delete the alternative alias.php pages
2122 if (!empty($objectpage->old_object->aliasalt)) {
2123 $tmpaltaliases = explode(',', $objectpage->old_object->aliasalt);
2124 if (is_array($tmpaltaliases)) {
2125 foreach ($tmpaltaliases as $tmpaliasalt) {
2126 dol_syslog("We delete old alt alias pages name=".trim($tmpaliasalt));
2127 dol_delete_file($pathofwebsite.'/'.trim($tmpaliasalt).'.php');
2128
2129 // Delete also pages into language subdirectories
2130 if (empty($objectpage->lang) || !in_array($objectpage->lang, explode(',', $object->otherlang))) {
2131 $dirname = dirname($pathofwebsite.'/'.trim($tmpaliasalt).'.php');
2132 $filename = basename($pathofwebsite.'/'.trim($tmpaliasalt).'.php');
2133 $sublangs = explode(',', $object->otherlang);
2134 foreach ($sublangs as $sublang) {
2135 // Under certain conditions $ sublang can be an empty string
2136 // ($object->otherlang with empty string or with string like this 'en,,sv')
2137 // if is the case we try to re-delete the main alias file. Avoid it.
2138 if (empty(trim($sublang))) {
2139 continue;
2140 }
2141 $fileoldaliassub = $dirname.'/'.$sublang.'/'.$filename;
2142 dol_delete_file($fileoldaliassub);
2143 }
2144 }
2145 }
2146 }
2147 }
2148
2149 // Save page main alias
2150 $result = dolSavePageAlias($filealias, $object, $objectpage);
2151 if (!$result) {
2152 setEventMessages('Failed to write file '.$filealias, null, 'errors');
2153 }
2154 // Save alt aliases
2155 if (!empty($objectpage->aliasalt)) {
2156 $tmpaltaliases = explode(',', $objectpage->aliasalt);
2157 if (is_array($tmpaltaliases)) {
2158 foreach ($tmpaltaliases as $tmpaliasalt) {
2159 if (trim($tmpaliasalt)) {
2160 $filealias = $pathofwebsite.'/'.trim($tmpaliasalt).'.php';
2161 $result = dolSavePageAlias($filealias, $object, $objectpage);
2162 if (!$result) {
2163 setEventMessages('Failed to write file '.basename($filealias), null, 'errors');
2164 }
2165 }
2166 }
2167 }
2168 }
2169
2170
2171 // Save page of content
2172 $result = dolSavePageContent($filetpl, $object, $objectpage, 1);
2173 if ($result) {
2174 setEventMessages($langs->trans("Saved"), null, 'mesgs');
2175
2176 if (!GETPOSTISSET('updateandstay')) { // If we click on "Save And Stay", we do not make the redirect
2177 //header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey.'&pageid='.$pageid);
2178 //exit;
2179 $action = 'preview';
2180 } else {
2181 $action = 'editmeta';
2182 }
2183 } else {
2184 setEventMessages('Failed to write file '.$filetpl, null, 'errors');
2185 //header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey.'&pageid='.$pageid);
2186 //exit;
2187 $action = 'preview';
2188 }
2189 }
2190}
2191
2192// Update page
2193if ($usercanedit && (($action == 'updatesource' || $action == 'updatecontent' || $action == 'confirm_createfromclone' || $action == 'confirm_createpagefromclone')
2194 || ($action == 'preview' && (GETPOST('refreshsite') || GETPOST('refreshpage') || GETPOST('preview'))))) {
2195 $object->fetch(0, $websitekey);
2196 $website = $object;
2197
2198 if ($action == 'confirm_createfromclone') {
2199 $db->begin();
2200
2201 $objectnew = new Website($db);
2202 $result = $objectnew->createFromClone($user, GETPOSTINT('id'), GETPOST('siteref'), (GETPOSTINT('newlang') ? GETPOSTINT('newlang') : ''));
2203
2204 if ($result < 0) {
2205 $error++;
2206 setEventMessages($objectnew->error, $objectnew->errors, 'errors');
2207 $action = 'preview';
2208
2209 $db->rollback();
2210 } else {
2211 setEventMessages("ObjectClonedSuccessfuly", null, 'mesgs');
2212 $object = $objectnew;
2213 $id = $object->id;
2214 $pageid = $object->fk_default_home;
2215 $websitekey = GETPOST('siteref', 'aZ09');
2216
2217 $db->commit();
2218 }
2219 }
2220
2221 if ($action == 'confirm_createpagefromclone') {
2222 $istranslation = (GETPOST('is_a_translation', 'aZ09') == 'on' ? 1 : 0);
2223 // Protection if it is a translation page
2224 if ($istranslation) {
2225 if (GETPOST('newlang', 'aZ09') == $objectpage->lang || !GETPOST('newlang', 'aZ09')) {
2226 $error++;
2227 setEventMessages($langs->trans("LanguageMustNotBeSameThanClonedPage"), null, 'errors');
2228 $action = 'preview';
2229 }
2230 if (GETPOSTINT('newwebsite') != $object->id) {
2231 $error++;
2232 setEventMessages($langs->trans("WebsiteMustBeSameThanClonedPageIfTranslation"), null, 'errors');
2233 $action = 'preview';
2234 }
2235 }
2236
2237 if (!$error) {
2238 $db->begin();
2239
2240 $newwebsiteid = GETPOSTINT('newwebsite');
2241 $pathofwebsitenew = $pathofwebsite;
2242
2243 $tmpwebsite = new Website($db);
2244 if ($newwebsiteid > 0 && $newwebsiteid != $object->id) {
2245 $tmpwebsite->fetch($newwebsiteid);
2246 $pathofwebsitenew = $dolibarr_main_data_root.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$tmpwebsite->ref;
2247 } else {
2248 $tmpwebsite = $object;
2249 }
2250
2251 $objectpage = new WebsitePage($db);
2252 $resultpage = $objectpage->createFromClone($user, $pageid, GETPOST('newpageurl', 'aZ09'), (GETPOST('newlang', 'aZ09') ? GETPOST('newlang', 'aZ09') : ''), $istranslation, $newwebsiteid, GETPOST('newtitle', 'alphanohtml'), $tmpwebsite);
2253 if ($resultpage < 0) {
2254 $error++;
2255 setEventMessages($objectpage->error, $objectpage->errors, 'errors');
2256 $action = 'createpagefromclone';
2257
2258 $db->rollback();
2259 } else {
2260 $filetpl = $pathofwebsitenew.'/page'.$resultpage->id.'.tpl.php';
2261 $fileindex = $pathofwebsitenew.'/index.php';
2262 $filewrapper = $pathofwebsitenew.'/wrapper.php';
2263
2264 //var_dump($pathofwebsitenew);
2265 //var_dump($filetpl);
2266 //exit;
2267
2268 dolSavePageContent($filetpl, $tmpwebsite, $resultpage, 1);
2269
2270 // Switch on the new page if web site of new page/container is same
2271 if (empty($newwebsiteid) || $newwebsiteid == $object->id) {
2272 $pageid = $resultpage->id;
2273 }
2274
2275 $db->commit();
2276 }
2277 }
2278 }
2279
2280 $res = 0;
2281
2282 if (!$error) {
2283 // Check symlink to medias and restore it if ko
2284 $pathtomedias = DOL_DATA_ROOT.'/medias';
2285 $pathtomediasinwebsite = $pathofwebsite.'/medias';
2286 if (!is_link(dol_osencode($pathtomediasinwebsite))) {
2287 dol_syslog("Create symlink for ".$pathtomedias." into name ".$pathtomediasinwebsite);
2288 dol_mkdir(dirname($pathtomediasinwebsite)); // To be sure dir for website exists
2289 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2290 }
2291
2292 /*if (GETPOST('savevirtualhost') && $object->virtualhost != GETPOST('previewsite'))
2293 {
2294 $object->virtualhost = GETPOST('previewsite', 'alpha');
2295 $object->update($user);
2296 }*/
2297
2298 $objectpage->fk_website = $object->id;
2299
2300 if ($pageid > 0) {
2301 $res = $objectpage->fetch($pageid);
2302 } else {
2303 $res = 0;
2304 if ($object->fk_default_home > 0) {
2305 $res = $objectpage->fetch($object->fk_default_home);
2306 }
2307 if (!($res > 0)) {
2308 $res = $objectpage->fetch(0, $object->id);
2309 }
2310 }
2311 }
2312
2313 if (!$error && $res > 0) {
2314 if ($action == 'updatesource' || $action == 'updatecontent') {
2315 $db->begin();
2316
2317 $phpfullcodestringold = dolKeepOnlyPhpCode($objectpage->content);
2318
2319 $objectpage->content = GETPOST('PAGE_CONTENT', 'none'); // any HTML content allowed
2320
2321 $phpfullcodestring = dolKeepOnlyPhpCode($objectpage->content);
2322
2323 // Security analysis (check PHP content and check permission website->writephp if php content is modified)
2324 $error = checkPHPCode($phpfullcodestringold, $phpfullcodestring);
2325
2326 if ($error) {
2327 if ($action == 'updatesource') {
2328 $action = 'editsource';
2329 }
2330 if ($action == 'updatecontent') {
2331 $action = 'editcontent';
2332 }
2333 }
2334
2335 // Clean data. We remove all the head section.
2336 $objectpage->content = preg_replace('/<head>.*<\/head>/ims', '', $objectpage->content);
2337 /* $objectpage->content = preg_replace('/<base\s+href=[\'"][^\'"]+[\'"]\s/?>/s', '', $objectpage->content); */
2338
2339
2340 $res = $objectpage->update($user);
2341 if ($res < 0) {
2342 $error++;
2343 setEventMessages($objectpage->error, $objectpage->errors, 'errors');
2344 if ($action == 'updatesource') {
2345 $action = 'editsource';
2346 }
2347 if ($action == 'updatecontent') {
2348 $action = 'editcontent';
2349 }
2350 }
2351
2352 if (!$error) {
2353 $db->commit();
2354
2355 $filemaster = $pathofwebsite.'/master.inc.php';
2356 //$fileoldalias=$pathofwebsite.'/'.$objectpage->old_object->pageurl.'.php';
2357 $filealias = $pathofwebsite.'/'.$objectpage->pageurl.'.php';
2358
2359 dol_mkdir($pathofwebsite);
2360
2361 // Now generate the master.inc.php page
2362 $result = dolSaveMasterFile($filemaster);
2363
2364 if (!$result) {
2365 setEventMessages('Failed to write the master file file '.$filemaster, null, 'errors');
2366 }
2367
2368 // Now delete the old alias.php page if we removed one
2369 /*if (!empty($fileoldalias))
2370 {
2371 dol_syslog("We regenerate alias page new name=".$filealias.", old name=".$fileoldalias);
2372 dol_delete_file($fileoldalias);
2373
2374 // Delete also pages into language subdirectories
2375 if (empty($objectpage->lang) || !in_array($objectpage->lang, explode(',', $object->otherlang))) {
2376 $dirname = dirname($fileoldalias);
2377 $filename = basename($fileoldalias);
2378 $sublangs = explode(',', $object->otherlang);
2379 foreach ($sublangs as $sublang) {
2380 $fileoldaliassub = $dirname.'/'.$sublang.'/'.$filename;
2381 dol_delete_file($fileoldaliassub);
2382 }
2383 }
2384 }*/
2385
2386 // Save page alias
2387 $result = dolSavePageAlias($filealias, $object, $objectpage);
2388 if (!$result) {
2389 setEventMessages('Failed to write the alias file '.basename($filealias), null, 'errors');
2390 }
2391
2392 // Save page content
2393 $result = dolSavePageContent($filetpl, $object, $objectpage, 1);
2394 if ($result) {
2395 setEventMessages($langs->trans("Saved"), null, 'mesgs');
2396
2397 if (!GETPOSTISSET('updateandstay')) { // If we click on "Save And Stay", we do not make the redirect
2398 if ($backtopage) {
2399 header("Location: ".$backtopage);
2400 exit;
2401 } else {
2402 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey.'&pageid='.$pageid);
2403 exit;
2404 }
2405 } else {
2406 if ($action == 'updatesource') {
2407 $action = 'editsource';
2408 }
2409 if ($action == 'updatecontent') {
2410 $action = 'editcontent';
2411 }
2412 }
2413 } else {
2414 setEventMessages('Failed to write file '.$filetpl, null, 'errors');
2415 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey.'&pageid='.$pageid);
2416 exit;
2417 }
2418 } else {
2419 $db->rollback();
2420 }
2421 } else {
2422 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$websitekey.'&pageid='.$pageid);
2423 exit;
2424 }
2425 } else {
2426 if (!$error) {
2427 if (empty($websitekey) || $websitekey == '-1') {
2428 setEventMessages($langs->trans("NoWebSiteCreateOneFirst"), null, 'warnings');
2429 } else {
2430 setEventMessages($langs->trans("NoPageYet"), null, 'warnings');
2431 setEventMessages($langs->trans("YouCanCreatePageOrImportTemplate"), null, 'warnings');
2432 }
2433 }
2434 }
2435}
2436
2437if ($action == 'deletelang' && $usercanedit) {
2438 $sql = "UPDATE ".MAIN_DB_PREFIX."website_page SET fk_page = NULL";
2439 $sql .= " WHERE rowid = ".GETPOSTINT('deletelangforid');
2440 //$sql .= " AND fk_page = ".((int) $objectpage->id);
2441
2442 $resql = $db->query($sql);
2443 if (!$resql) {
2444 setEventMessages($db->lasterror(), null, 'errors');
2445 } else {
2446 $objectpage->fk_page = null;
2447 }
2448
2449 $action = 'editmeta';
2450}
2451
2452
2453// Export site
2454if ($action == 'exportsite' && $user->hasRight('website', 'export')) {
2455 $fileofzip = $object->exportWebSite();
2456
2457 if ($fileofzip) {
2458 $file_name = basename($fileofzip);
2459 header("Content-Type: application/zip");
2460 header("Content-Disposition: attachment; filename=".$file_name);
2461 header("Content-Length: ".filesize($fileofzip));
2462
2463 readfile($fileofzip);
2464 exit;
2465 } else {
2466 setEventMessages($object->error, $object->errors, 'errors');
2467 $action = 'preview';
2468 }
2469}
2470
2471// Overwrite site
2472if ($action == 'overwritesite' && $user->hasRight('website', 'export')) {
2473 if (getDolGlobalString('WEBSITE_ALLOW_OVERWRITE_GIT_SOURCE')) {
2474 $fileofzip = $object->exportWebSite();
2475 $pathToExport = GETPOST('export_path');
2476 if ($fileofzip) {
2477 $object->overwriteTemplate($fileofzip, $pathToExport);
2478 } else {
2479 setEventMessages($object->error, $object->errors, 'errors');
2480 }
2481 }
2482}
2483// Regenerate site
2484if ($action == 'regeneratesite' && $usercanedit) {
2485 // Check symlink to medias and restore it if ko. Recreate also dir of website if not found.
2486 $pathtomedias = DOL_DATA_ROOT.'/medias';
2487 $pathtomediasinwebsite = $pathofwebsite.'/medias';
2488 if (!is_link(dol_osencode($pathtomediasinwebsite))) {
2489 dol_syslog("Create symlink for ".$pathtomedias." into name ".$pathtomediasinwebsite);
2490 dol_mkdir(dirname($pathtomediasinwebsite)); // To be sure that the directory for website exists
2491 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2492 if (!$result) {
2493 $langs->load("errors");
2494 setEventMessages($langs->trans("ErrorFailedToCreateSymLinkToMedias", $pathtomediasinwebsite, $pathtomedias), null, 'errors');
2495 $action = 'preview';
2496 }
2497 }
2498
2499 $result = $object->rebuildWebSiteFiles();
2500 if ($result > 0) {
2501 setEventMessages($langs->trans("PagesRegenerated", $result), null, 'mesgs');
2502 $action = 'preview';
2503 } else {
2504 setEventMessages($object->error, $object->errors, 'errors');
2505 $action = 'preview';
2506 }
2507}
2508
2509// Import site
2510if ($action == 'importsiteconfirm' && $usercanedit) {
2511 $dolibarrdataroot = preg_replace('/([\\/]+)$/i', '', DOL_DATA_ROOT);
2512 $allowimportsite = true;
2513 if (dol_is_file($dolibarrdataroot.'/installmodules.lock')) {
2514 $allowimportsite = false;
2515 }
2516
2517 if ($allowimportsite) {
2518 if (empty($_FILES) && !GETPOSTISSET('templateuserfile')) {
2519 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors');
2520 $action = 'importsite';
2521 } else {
2522 if (!empty($_FILES) || GETPOSTISSET('templateuserfile')) {
2523 // Check symlink to medias and restore it if ko. Recreate also dir of website if not found.
2524 $pathtomedias = DOL_DATA_ROOT.'/medias';
2525 $pathtomediasinwebsite = $pathofwebsite.'/medias';
2526 if (!is_link(dol_osencode($pathtomediasinwebsite))) {
2527 dol_syslog("Create symlink for ".$pathtomedias." into name ".$pathtomediasinwebsite);
2528 dol_mkdir(dirname($pathtomediasinwebsite)); // To be sure dir for website exists
2529 $result = symlink($pathtomedias, $pathtomediasinwebsite);
2530 if (!$result) {
2531 $langs->load("errors");
2532 setEventMessages($langs->trans("ErrorFailedToCreateSymLinkToMedias", $pathtomediasinwebsite, $pathtomedias), null, 'errors');
2533 $action = 'importsite';
2534 }
2535 }
2536
2537 $fileofzip = '';
2538 if (GETPOSTISSET('templateuserfile')) {
2539 // Case we selected one template
2540 $fileofzip = DOL_DATA_ROOT.'/doctemplates/websites/'.GETPOST('templateuserfile', 'alpha'); // $fileofzip will be sanitized later into the importWebSite()
2541 } elseif (!empty($_FILES) && is_array($_FILES['userfile'])) {
2542 // Case we upload a new template
2543 if (is_array($_FILES['userfile']['tmp_name'])) {
2544 $userfiles = $_FILES['userfile']['tmp_name'];
2545 } else {
2546 $userfiles = array($_FILES['userfile']['tmp_name']);
2547 }
2548
2549 // Check if $_FILES is ok
2550 foreach ($userfiles as $key => $userfile) {
2551 if (empty($_FILES['userfile']['tmp_name'][$key])) {
2552 $error++;
2553 if ($_FILES['userfile']['error'][$key] == 1 || $_FILES['userfile']['error'][$key] == 2) {
2554 setEventMessages($langs->trans('ErrorFileSizeTooLarge'), null, 'errors');
2555 $action = 'importsite';
2556 } else {
2557 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("File")), null, 'errors');
2558 $action = 'importsite';
2559 }
2560 }
2561 }
2562
2563 if (!$error) {
2564 //$upload_dir = $conf->website->dir_temp;
2565 $upload_dir = DOL_DATA_ROOT.'/doctemplates/websites/';
2566 $result = dol_add_file_process($upload_dir, 1, -1, 'userfile', '');
2567 }
2568
2569 // Get name of file (take last one if several name provided)
2570 /*
2571 $fileofzip = $upload_dir.'/unknown';
2572 foreach ($_FILES as $key => $ifile) {
2573 foreach ($ifile['name'] as $key2 => $ifile2) {
2574 $fileofzip = $upload_dir.'/'.$ifile2;
2575 }
2576 }
2577 */
2578
2579 $action = 'importsite';
2580 }
2581
2582 if (!$error && GETPOSTISSET('templateuserfile')) {
2583 $templatewithoutzip = preg_replace('/\.zip$/i', '', GETPOST('templateuserfile'));
2584 $object->setTemplateName($templatewithoutzip);
2585
2586 $result = $object->importWebSite($fileofzip);
2587
2588 if ($result < 0) {
2589 setEventMessages($object->error, $object->errors, 'errors');
2590 $action = 'importsite';
2591 } else {
2592 // Force mode dynamic on
2593 dolibarr_set_const($db, 'WEBSITE_SUBCONTAINERSINLINE', 1, 'chaine', 0, '', $conf->entity);
2594
2595 header("Location: ".$_SERVER["PHP_SELF"].'?website='.$object->ref);
2596 exit();
2597 }
2598 }
2599 }
2600 }
2601 } else {
2602 if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
2603 // Show clean corporate message
2604 $message = $langs->trans('InstallModuleFromWebHasBeenDisabledContactUs');
2605 } else {
2606 // Show technical generic message
2607 $message = $langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock');
2608 }
2609 setEventMessages($message, null, 'errors');
2610 }
2611}
2612
2613$domainname = '0.0.0.0:8080';
2614$tempdir = $conf->website->dir_output.'/'.$websitekey.'/';
2615
2616// Generate web site sitemaps
2617if ($action == 'generatesitemaps' && $usercanedit) {
2618 // Define $domainname
2619 if ($website->virtualhost) {
2620 $domainname = $website->virtualhost;
2621 }
2622 if (! preg_match('/^http/i', $domainname)) {
2623 $domainname = 'https://'.$domainname;
2624 }
2625
2626 $domtree = new DOMDocument('1.0', 'UTF-8');
2627
2628 $root = $domtree->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset');
2629 $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xhtml', 'http://www.w3.org/1999/xhtml');
2630
2631 $domtree->formatOutput = true;
2632
2633 $addrsswrapper = 0;
2634 $xmlname = 'sitemap.xml';
2635
2636 $sql = "SELECT wp.rowid, wp.type_container , wp.pageurl, wp.lang, wp.fk_page, wp.tms as tms,";
2637 $sql .= " w.virtualhost, w.fk_default_home";
2638 $sql .= " FROM ".MAIN_DB_PREFIX."website_page as wp, ".MAIN_DB_PREFIX."website as w";
2639 $sql .= " WHERE wp.type_container IN ('page', 'blogpost')";
2640 $sql .= " AND wp.fk_website = w.rowid";
2641 $sql .= " AND wp.status = ".WebsitePage::STATUS_VALIDATED;
2642 $sql .= " AND wp.pageurl NOT IN ('404', '500', '501', '503')";
2643 $sql .= " AND w.ref = '".dol_escape_json($websitekey)."'";
2644 $sql .= " ORDER BY wp.tms DESC, wp.rowid DESC";
2645 $resql = $db->query($sql);
2646 if ($resql) {
2647 $num_rows = $db->num_rows($resql);
2648 if ($num_rows > 0) {
2649 $i = 0;
2650 while ($i < $num_rows) {
2651 $objp = $db->fetch_object($resql);
2652 $url = $domtree->createElement('url');
2653
2654 $shortlangcode = '';
2655 if ($objp->lang) {
2656 $shortlangcode = substr($objp->lang, 0, 2); // en_US or en-US -> en
2657 }
2658 if (empty($shortlangcode)) {
2659 $shortlangcode = substr($object->lang, 0, 2); // Use short lang code of website
2660 }
2661
2662 // Is it a blog post for the RSS wrapper ?
2663 if ($objp->type_container == 'blogpost') {
2664 $addrsswrapper = 1;
2665 }
2666
2667 // Forge $pageurl, adding language prefix if it is an alternative language
2668 $pageurl = $objp->pageurl.'.php';
2669 if ($objp->fk_default_home == $objp->rowid) {
2670 $pageurl = '';
2671 } else {
2672 if ($shortlangcode != substr($object->lang, 0, 2)) {
2673 $pageurl = $shortlangcode.'/'.$pageurl;
2674 }
2675 }
2676
2677 //$pathofpage = $dolibarr_main_url_root.'/'.$pageurl.'.php';
2678
2679 // URL of sitemaps must end with trailing slash if page is ''
2680 $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl);
2681 $lastmod = $domtree->createElement('lastmod', dol_print_date($db->jdate($objp->tms), 'dayrfc', 'gmt'));
2682 $priority = $domtree->createElement('priority', '1');
2683
2684 $url->appendChild($loc);
2685 $url->appendChild($lastmod);
2686 // Add suggested frequency for refresh
2687 if (getDolGlobalString('WEBSITE_SITEMAPS_ADD_WEEKLY_FREQ')) {
2688 $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values
2689 $url->appendChild($changefreq);
2690 }
2691 // Add higher priority for home page
2692 if ($objp->fk_default_home == $objp->rowid) {
2693 $url->appendChild($priority);
2694 }
2695
2696 // Now add alternate language entries
2697 if ($object->isMultiLang()) {
2698 $alternatefound = 0;
2699
2700 // Add page "translation of"
2701 $translationof = $objp->fk_page;
2702 if ($translationof) {
2703 $tmppage = new WebsitePage($db);
2704 $tmppage->fetch($translationof);
2705 if ($tmppage->id > 0) {
2706 $tmpshortlangcode = '';
2707 if ($tmppage->lang) {
2708 $tmpshortlangcode = preg_replace('/[_-].*$/', '', $tmppage->lang); // en_US or en-US -> en
2709 }
2710 if (empty($tmpshortlangcode)) {
2711 $tmpshortlangcode = preg_replace('/[_-].*$/', '', $object->lang); // en_US or en-US -> en
2712 }
2713 if ($tmpshortlangcode != $shortlangcode) {
2714 $xhtmllink = $domtree->createElement('xhtml:link', '');
2715 $xhtmllink->setAttribute("rel", "alternate");
2716 $xhtmllink->setAttribute("hreflang", $tmpshortlangcode);
2717 $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $tmppage->id ? '/' : (($tmpshortlangcode != substr($object->lang, 0, 2)) ? '/'.$tmpshortlangcode : '').'/'.$tmppage->pageurl.'.php'));
2718 $url->appendChild($xhtmllink);
2719
2720 $alternatefound++;
2721 }
2722 }
2723 }
2724
2725 // Add "has translation pages"
2726 $sql = 'SELECT rowid as id, lang, pageurl from '.MAIN_DB_PREFIX.'website_page';
2727 $sql .= " WHERE status = ".((int) WebsitePage::STATUS_VALIDATED).' AND fk_page IN ('.$db->sanitize($objp->rowid.($translationof ? ", ".$translationof : "")).")";
2728 $resqlhastrans = $db->query($sql);
2729 if ($resqlhastrans) {
2730 $num_rows_hastrans = $db->num_rows($resqlhastrans);
2731 if ($num_rows_hastrans > 0) {
2732 while ($objhastrans = $db->fetch_object($resqlhastrans)) {
2733 $tmpshortlangcode = '';
2734 if ($objhastrans->lang) {
2735 $tmpshortlangcode = preg_replace('/[_-].*$/', '', $objhastrans->lang); // en_US or en-US -> en
2736 }
2737 if ($tmpshortlangcode != $shortlangcode) {
2738 $xhtmllink = $domtree->createElement('xhtml:link', '');
2739 $xhtmllink->setAttribute("rel", "alternate");
2740 $xhtmllink->setAttribute("hreflang", $tmpshortlangcode);
2741 $xhtmllink->setAttribute("href", $domainname.($objp->fk_default_home == $objhastrans->id ? '/' : (($tmpshortlangcode != substr($object->lang, 0, 2) ? '/'.$tmpshortlangcode : '')).'/'.$objhastrans->pageurl.'.php'));
2742 $url->appendChild($xhtmllink);
2743
2744 $alternatefound++;
2745 }
2746 }
2747 }
2748 } else {
2749 dol_print_error($db);
2750 }
2751
2752 if ($alternatefound) {
2753 // Add myself
2754 $xhtmllink = $domtree->createElement('xhtml:link', '');
2755 $xhtmllink->setAttribute("rel", "alternate");
2756 $xhtmllink->setAttribute("hreflang", $shortlangcode);
2757 $xhtmllink->setAttribute("href", $domainname.'/'.$pageurl);
2758 $url->appendChild($xhtmllink);
2759 }
2760 }
2761
2762 // Now add sitempas extension for news
2763 // TODO When adding and when not ?
2764 /*<news:news>
2765 <news:publication>
2766 <news:name>The Example Times</news:name>
2767 <news:language>en</news:language>
2768 </news:publication>
2769 <news:publication_date>2008-12-23</news:publication_date>
2770 <news:title>Companies A, B in Merger Talks</news:title>
2771 </news:news>
2772 */
2773
2774 $root->appendChild($url);
2775 $i++;
2776 }
2777
2778 // Adding a RSS feed into a sitemap should not be required. The RSS contains pages that are already included into
2779 // the sitemap and RSS feeds are not shown into index.
2780 if ($addrsswrapper && getDolGlobalInt('WEBSITE_ADD_RSS_FEED_INTO_SITEMAP')) {
2781 $url = $domtree->createElement('url');
2782
2783 $pageurl = 'wrapper.php?rss=1';
2784
2785 // URL of sitemaps must end with trailing slash if page is ''
2786 $loc = $domtree->createElement('loc', $domainname.'/'.$pageurl);
2787 $lastmod = $domtree->createElement('lastmod', dol_print_date($db->jdate(dol_now()), 'dayrfc', 'gmt'));
2788
2789 $url->appendChild($loc);
2790 $url->appendChild($lastmod);
2791 // Add suggested frequency for refresh
2792 if (getDolGlobalString('WEBSITE_SITEMAPS_ADD_WEEKLY_FREQ')) {
2793 $changefreq = $domtree->createElement('changefreq', 'weekly'); // TODO Manage other values
2794 $url->appendChild($changefreq);
2795 }
2796
2797 $root->appendChild($url);
2798 }
2799
2800 $domtree->appendChild($root);
2801
2802 if ($domtree->save($tempdir.$xmlname)) {
2803 dolChmod($tempdir.$xmlname);
2804 setEventMessages($langs->trans("SitemapGenerated", $xmlname), null, 'mesgs');
2805 } else {
2806 setEventMessages($object->error, $object->errors, 'errors');
2807 }
2808 }
2809 } else {
2810 dol_print_error($db);
2811 }
2812
2813 // Add the entry Sitemap: into the robot.txt file.
2814 $robotcontent = @file_get_contents($filerobot);
2815 $result = preg_replace('/<?php \/\/ BEGIN PHP[^?]END PHP ?>\n/ims', '', $robotcontent);
2816 if ($result) {
2817 $robotcontent = $result;
2818 }
2819 $robotsitemap = "Sitemap: ".$domainname."/".$xmlname;
2820 $result = strpos($robotcontent, 'Sitemap: ');
2821 if ($result) {
2822 $result = preg_replace('/Sitemap:.*/', $robotsitemap, $robotcontent);
2823 $robotcontent = $result ? $result : $robotcontent;
2824 } else {
2825 $robotcontent .= $robotsitemap."\n";
2826 }
2827 $result = dolSaveRobotFile($filerobot, $robotcontent);
2828 if (!$result) {
2829 $error++;
2830 setEventMessages('Failed to write file '.$filerobot, null, 'errors');
2831 }
2832 $action = 'preview';
2833}
2834
2835
2836/*
2837 * View
2838 */
2839
2840$form = new Form($db);
2841$formadmin = new FormAdmin($db);
2842$formwebsite = new FormWebsite($db);
2843$formother = new FormOther($db);
2844$formconfirm = "";
2845
2846// Confirm generation of website sitemaps
2847if ($action == 'confirmgeneratesitemaps') {
2848 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?website='.urlencode($website->ref), $langs->trans('ConfirmSitemapsCreation'), $langs->trans('ConfirmGenerateSitemaps', $object->ref), 'generatesitemaps', '', "yes", 1);
2849 $action = 'preview';
2850}
2851$helpurl = 'EN:Module_Website|FR:Module_Website_FR|ES:M&oacute;dulo_Website';
2852
2853$arrayofjs = array(
2854 '/includes/ace/src/ace.js',
2855 '/includes/ace/src/ext-statusbar.js',
2856 '/includes/ace/src/ext-language_tools.js',
2857 //'/includes/ace/src/ext-chromevox.js'
2858 //'/includes/jquery/plugins/jqueryscoped/jquery.scoped.js',
2859);
2860$arrayofcss = array();
2861
2862$moreheadcss = '';
2863$moreheadjs = '';
2864
2865$arrayofjs[] = 'includes/jquery/plugins/blockUI/jquery.blockUI.js';
2866$arrayofjs[] = 'core/js/blockUI.js'; // Used by ecm/tpl/enabledfiletreeajax.tpl.php
2867if (!getDolGlobalString('MAIN_ECM_DISABLE_JS')) {
2868 $arrayofjs[] = "includes/jquery/plugins/jqueryFileTree/jqueryFileTree.js";
2869}
2870
2871$moreheadjs .= '<script type="text/javascript">'."\n";
2872$moreheadjs .= 'var indicatorBlockUI = \''.DOL_URL_ROOT."/theme/".$conf->theme."/img/working.gif".'\';'."\n";
2873$moreheadjs .= '</script>'."\n";
2874
2875llxHeader($moreheadcss.$moreheadjs, $langs->trans("Website").(empty($website->ref) ? '' : ' - '.$website->ref), $helpurl, '', 0, 0, $arrayofjs, $arrayofcss, '', '', '<!-- Begin div class="fiche" -->'."\n".'<div class="fichebutwithotherclass">');
2876
2877print "\n";
2878print '<!-- Open form for all page -->'."\n";
2879print '<form action="'.$_SERVER["PHP_SELF"].($action == 'file_manager' ? '?uploadform=1' : '').'" method="POST" enctype="multipart/form-data" class="websiteformtoolbar">';
2880print '<input type="hidden" name="token" value="'.newToken().'">';
2881print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
2882print '<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.'">';
2883
2884if ($action == 'createsite') {
2885 print '<input type="hidden" name="action" value="addsite">';
2886}
2887if ($action == 'createcontainer') {
2888 print '<input type="hidden" name="action" value="addcontainer">';
2889}
2890if ($action == 'editcss') {
2891 print '<input type="hidden" name="action" value="updatecss">';
2892}
2893if ($action == 'editmenu') {
2894 print '<input type="hidden" name="action" value="updatemenu">';
2895}
2896if ($action == 'setashome') {
2897 print '<input type="hidden" name="action" value="updateashome">';
2898}
2899if ($action == 'editmeta') {
2900 print '<input type="hidden" name="action" value="updatemeta">';
2901}
2902if ($action == 'editsource') {
2903 print '<input type="hidden" name="action" value="updatesource">';
2904}
2905if ($action == 'editcontent') {
2906 print '<input type="hidden" name="action" value="updatecontent">';
2907}
2908if ($action == 'edit') {
2909 print '<input type="hidden" name="action" value="update">';
2910}
2911if ($action == 'importsite') {
2912 print '<input type="hidden" name="action" value="importsiteconfirm">';
2913}
2914if ($action == 'file_manager') {
2915 print '<input type="hidden" name="action" value="file_manager">';
2916}
2917if ($mode) {
2918 print '<input type="hidden" name="mode" value="'.$mode.'">';
2919}
2920
2921print '<div>';
2922
2923// Add a margin under toolbar ?
2924$style = '';
2925if ($action != 'preview' && $action != 'editcontent' && $action != 'editsource' && !GETPOST('createpagefromclone', 'alphanohtml')) {
2926 $style = ' margin-bottom: 5px;';
2927}
2928
2929
2930if (!GETPOST('hide_websitemenu')) {
2931 $disabled = '';
2932 if (!$user->hasRight('website', 'write')) {
2933 $disabled = ' disabled="disabled"';
2934 }
2935 $disabledexport = '';
2936 if (!$user->hasRight('website', 'export')) {
2937 $disabledexport = ' disabled="disabled"';
2938 }
2939
2940 if ($websitekey) {
2941 $virtualurl = '';
2942 $dataroot = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/'.$websitekey;
2943 if (!empty($object->virtualhost)) {
2944 $virtualurl = $object->virtualhost;
2945 }
2946 }
2947
2948 $array = array();
2949 if ($object->id > 0) {
2950 $array = $objectpage->fetchAll($object->id, 'ASC,ASC', 'type_container,pageurl');
2951 $object->lines = $array;
2952 }
2953 if (!is_array($array) && $array < 0) {
2954 dol_print_error(null, $objectpage->error, $objectpage->errors);
2955 }
2956 $atleastonepage = (is_array($array) && count($array) > 0);
2957
2958 $websitepage = new WebsitePage($db);
2959 if ($pageid > 0) {
2960 $websitepage->fetch($pageid);
2961 }
2962
2963
2964 //var_dump($objectpage);exit;
2965 print '<div class="centpercent websitebar'.(GETPOST('dol_openinpopup', 'aZ09') ? ' hiddenforpopup' : '').'">';
2966
2967 //
2968 // Toolbar for websites
2969 //
2970
2971 print '<!-- Toolbar for website -->';
2972 if ($action != 'file_manager') {
2973 print '<div class="websiteselection hideonsmartphoneimp minwidth75 tdoverflowmax100 inline-block">';
2974 print $langs->trans("Website").': ';
2975 print '</div>';
2976
2977 // Button Add new website
2978 $urltocreatenewwebsite = $_SERVER["PHP_SELF"].'?action=createsite';
2979 print '<span class="websiteselection paddingrightonly">';
2980 print '<a href="'.$urltocreatenewwebsite.'" class=""'.$disabled.' title="'.dol_escape_htmltag($langs->trans("AddWebsite")).'"><span class="fa fa-plus-circle valignmiddle btnTitle-icon"><span></a>';
2981 print '</span>';
2982
2983 // List of website
2984 print '<span class="websiteselection nopaddingrightimp">';
2985
2986 $out = '';
2987 $out .= '<select name="website" class="minwidth100 width200 maxwidth150onsmartphone" id="website">';
2988 if (empty($listofwebsites)) {
2989 $out .= '<option value="-1">&nbsp;</option>';
2990 }
2991
2992 // Loop on each sites
2993 $i = 0;
2994 foreach ($listofwebsites as $key => $valwebsite) {
2995 if (empty($websitekey)) {
2996 if ($action != 'createsite') {
2997 $websitekey = $valwebsite->ref;
2998 }
2999 }
3000
3001 $out .= '<option value="'.$valwebsite->ref.'"';
3002 if ($websitekey == $valwebsite->ref) {
3003 $out .= ' selected'; // To preselect a value
3004 }
3005 //$outoption = $valwebsite->getLibStatut(3).' '.$valwebsite->ref.' ';
3006 $outoption = (($valwebsite->status == $valwebsite::STATUS_DRAFT) ? '<span class="opacitymedium">' : '').$valwebsite->ref.(($valwebsite->status == $valwebsite::STATUS_DRAFT) ? '</span>' : '');
3007 $out .= ' data-html="'.dol_escape_htmltag($outoption).'"';
3008 $out .= '>';
3009 $out .= $valwebsite->ref;
3010 $out .= '</option>';
3011 $i++;
3012 }
3013 $out .= '</select>';
3014 $out .= ajax_combobox('website');
3015
3016 if (!empty($conf->use_javascript_ajax)) {
3017 $out .= '<script type="text/javascript">';
3018 $out .= 'jQuery(document).ready(function () {';
3019 $out .= ' jQuery("#website").change(function () {';
3020 $out .= ' console.log("We select "+jQuery("#website option:selected").val());';
3021 $out .= ' if (jQuery("#website option:selected").val() == \'-2\') {';
3022 $out .= ' window.location.href = "'.dol_escape_js($urltocreatenewwebsite).'";';
3023 $out .= ' } else {';
3024 $out .= ' window.location.href = "'.$_SERVER["PHP_SELF"].'?website="+jQuery("#website option:selected").val();';
3025 $out .= ' }';
3026 $out .= ' });';
3027 $out .= '});';
3028 $out .= '</script>';
3029 }
3030 print $out;
3031
3032 print '</span>';
3033
3034 // Switch offline/onine
3035 if (!empty($conf->use_javascript_ajax)) {
3036 print '<span class="websiteselection">';
3037 // Do not use ajax, we need a refresh of full page when we change status of a website
3038 //print '<div class="inline-block marginrightonly">';
3039 //print ajax_object_onoff($object, 'status', 'status', 'Online', 'Offline', array(), 'valignmiddle inline-block', 'statuswebsite');
3040 //print '</div>';
3041 if ($website->status == $website::STATUS_DRAFT) {
3042 $text_off = 'Offline';
3043 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>';
3044 } else {
3045 $text_off = 'Online';
3046 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>';
3047 }
3048 print '</span>';
3049 }
3050
3051 // Refresh / Reload web site (for non javascript browsers)
3052 if (empty($conf->use_javascript_ajax)) {
3053 print '<span class="websiteselection">';
3054 print '<input type="image" class="valignmiddle" src="'.img_picto('', 'refresh', '', 0, 1).'" name="refreshsite" value="'.$langs->trans("Load").'">';
3055 print '</span>';
3056 }
3057
3058
3059 print '<span class="websiteselection">';
3060
3061 if ($websitekey && $websitekey != '-1' && ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite')) {
3062 // Edit website properties
3063 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>';
3064
3065 // Import web site
3066 $importlabel = $langs->trans("ImportSite");
3067 $exportlabel = $langs->trans("ExportSite");
3068 if (!empty($conf->dol_optimize_smallscreen)) {
3069 $importlabel = $langs->trans("Import");
3070 $exportlabel = $langs->trans("Export");
3071 }
3072
3073 if ($atleastonepage) {
3074 print '<input type="submit" class="button bordertransp" disabled="disabled" value="'.dol_escape_htmltag($importlabel).'" name="importsite">';
3075 } else {
3076 print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($importlabel).'" name="importsite">';
3077 }
3078
3079 // // Export web site
3080 $extraCssClass = getDolGlobalString('WEBSITE_ALLOW_OVERWRITE_GIT_SOURCE') ? 'hideobject' : '';
3081 print '<input type="submit" class="button bordertransp ' . $extraCssClass . '" ' . $disabledexport . ' value="' . dol_escape_htmltag($exportlabel) . '" name="exportsite">';
3082
3083 if (getDolGlobalString('WEBSITE_ALLOW_OVERWRITE_GIT_SOURCE')) {
3084 // Overwrite template in sources
3085 $overwriteGitUrl = $_SERVER["PHP_SELF"] . '?action=overwritesite&website=' . urlencode($website->ref);
3086 print dolButtonToOpenExportDialog('exportpopup', $langs->trans('ExportOptions'), $langs->trans('ExportSite'), 'exportsite', $overwriteGitUrl, $website);
3087 //print '<a href="'.$_SERVER["PHP_SELF"].'?action=overwritesite&website='.urlencode($website->ref).'" class="button bordertransp hideobject" title="'.dol_escape_htmltag($langs->trans("ExportIntoGIT").". Directory ".getDolGlobalString('WEBSITE_ALLOW_OVERWRITE_GIT_SOURCE')).'">'.dol_escape_htmltag($langs->trans("ExportIntoGIT")).'</a>';
3088 }
3089
3090 // Clone web site
3091 print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("CloneSite")).'" name="createfromclone">';
3092
3093 // Delete website
3094 if (!$permissiontodelete) {
3095 $disabled = ' disabled="disabled"';
3096 $title = $langs->trans("NotEnoughPermissions");
3097 $url = '#';
3098 } else {
3099 if ($website->status == $website::STATUS_VALIDATED) {
3100 $disabled = ' disabled="disabled"';
3101 $title = $langs->trans("WebsiteMustBeDisabled", $langs->transnoentitiesnoconv($website->LibStatut(0, 0)));
3102 $url = '#';
3103 } else {
3104 $disabled = '';
3105 $title = $langs->trans("Delete");
3106 $url = $_SERVER["PHP_SELF"].'?action=deletesite&token='.newToken().'&website='.urlencode($website->ref);
3107 }
3108 }
3109 print '<a href="'.$url.'" class="button buttonDelete bordertransp'.($disabled ? ' disabled' : '').'"'.$disabled.' title="'.dol_escape_htmltag($title).'">'.img_picto('', 'delete', 'class=""').'<span class="hideonsmartphone paddingleft">'.$langs->trans("Delete").'</span></a>';
3110
3111 // Regenerate all pages
3112 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>';
3113
3114 // Generate site map
3115 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>';
3116
3117 // Find / replace tool
3118 print '<a href="'.$_SERVER["PHP_SELF"].'?action=replacesite&token='.newToken().'&website='.urlencode($website->ref).'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("ReplaceWebsiteContent")).'"><span class="fa fa-search"></span></a>';
3119 }
3120
3121 print '</span>';
3122
3123 if ($websitekey && $websitekey != '-1' && ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite')) {
3124 print '<span class="websiteselection">';
3125
3126 print dolButtonToOpenUrlInDialogPopup('file_manager', $langs->transnoentitiesnoconv("MediaFiles"), '<span class="fa fa-image"></span>', '/website/index.php?action=file_manager&website='.urlencode($website->ref).'&section_dir='.urlencode('image/'.$website->ref.'/'), $disabled);
3127
3128 if (isModEnabled('category')) {
3129 //print '<a href="'.DOL_URL_ROOT.'/categories/index.php?leftmenu=website&dol_hide_leftmenu=1&nosearch=1&type=website_page&website='.$website->ref.'" class="button bordertransp"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("Categories")).'"><span class="fa fa-tags"></span></a>';
3130 print dolButtonToOpenUrlInDialogPopup('categories', $langs->transnoentitiesnoconv("Categories"), '<span class="fa fa-tags"></span>', '/categories/index.php?leftmenu=website&nosearch=1&type='.urlencode(Categorie::TYPE_WEBSITE_PAGE).'&website='.urlencode($website->ref), $disabled);
3131 }
3132
3133 print '</span>';
3134 }
3135 } else {
3136 print '<input type="hidden" name="website" id="website" value="'.$websitekey.'">';
3137 }
3138
3139
3140 print '<span class="websitetools">';
3141
3142 if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite') {
3143 $urlext = $virtualurl;
3144 $urlint = $urlwithroot.'/public/website/index.php?website='.$websitekey;
3145
3146 print '<span class="websiteinputurl valignmiddle" id="websiteinputurl">';
3147 $linktotestonwebserver = '<a href="'.($virtualurl ? $virtualurl : '#').'" class="valignmiddle">';
3148 $linktotestonwebserver .= '<span class="hideonsmartphone paddingrightonly">'.$langs->trans("TestDeployOnWeb", $virtualurl).'</span>'.img_picto('', 'globe');
3149 $linktotestonwebserver .= '</a>';
3150
3151 $htmltext = '';
3152 if (empty($object->fk_default_home)) {
3153 $htmltext .= '<br><span class="error">'.$langs->trans("YouMustDefineTheHomePage").'</span><br><br>';
3154 } elseif (empty($virtualurl)) {
3155 //$htmltext .= '<br><span class="error">'.$langs->trans("VirtualHostUrlNotDefined").'</span><br><br>';
3156 } else {
3157 $htmltext .= '<br><center>'.$langs->trans("GoTo").' <a href="'.$virtualurl.'" target="_website">'.$virtualurl.'</a></center><br>';
3158 }
3159 if (getDolGlobalString('WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER')) {
3160 $htmltext .= '<!-- Message defined translate key set into WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER -->';
3161 $htmltext .= '<br>'.$langs->trans(getDolGlobalString('WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER'));
3162 } else {
3163 $htmltext .= $langs->trans("ToDeployYourWebsiteOnLiveYouHave3Solutions").'<br><br>';
3164 $htmltext .= '<div class="titre inline-block">1</div> - '.$langs->trans("SetHereVirtualHost", $dataroot);
3165 $htmltext .= '<br>';
3166 $htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("ReadPerm"), DOL_DOCUMENT_ROOT);
3167 $htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("WritePerm"), '{s1}');
3168 $htmltext = str_replace('{s1}', DOL_DATA_ROOT.'/website<br>'.DOL_DATA_ROOT.'/medias', $htmltext);
3169
3170 $examplewithapache = "<VirtualHost *:80>\n";
3171 $examplewithapache .= '#php_admin_value open_basedir /tmp/:'.DOL_DOCUMENT_ROOT.':'.DOL_DATA_ROOT.':/dev/urandom'."\n";
3172 $examplewithapache .= "\n";
3173 $examplewithapache .= 'DocumentRoot "'.DOL_DOCUMENT_ROOT.'"'."\n";
3174 $examplewithapache .= "\n";
3175 $examplewithapache .= '<Directory "'.DOL_DOCUMENT_ROOT.'">'."\n";
3176 $examplewithapache .= 'AllowOverride FileInfo Options
3177 Options -Indexes -MultiViews -FollowSymLinks -ExecCGI
3178 Require all granted
3179 </Directory>'."\n".'
3180 <Directory "'.DOL_DATA_ROOT.'/website">
3181 AllowOverride FileInfo Options
3182 Options -Indexes -MultiViews +FollowSymLinks -ExecCGI
3183 Require all granted
3184 </Directory>'."\n".'
3185 <Directory "'.DOL_DATA_ROOT.'/medias">
3186 AllowOverride FileInfo Options
3187 Options -Indexes -MultiViews -FollowSymLinks -ExecCGI
3188 Require all granted
3189 </Directory>'."\n";
3190
3191 $examplewithapache .= "\n";
3192 $examplewithapache .= "#ErrorLog /var/log/apache2/".$websitekey."_error_log\n";
3193 $examplewithapache .= "#TransferLog /var/log/apache2/".$websitekey."_access_log\n";
3194
3195 $examplewithapache .= "</VirtualHost>\n";
3196
3197 $htmltext .= '<br>'.$langs->trans("ExampleToUseInApacheVirtualHostConfig").':<br>';
3198 $htmltext .= '<div class="quatrevingtpercent exampleapachesetup wordbreak" spellcheck="false">'.dol_nl2br(dol_escape_htmltag($examplewithapache, 1, 1)).'</div>';
3199
3200 $htmltext .= '<br>';
3201 $htmltext .= '<div class="titre inline-block">2</div> - '.$langs->trans("YouCanAlsoTestWithPHPS");
3202 $htmltext .= '<br><div class="urllink"><input type="text" id="cliphpserver" spellcheck="false" class="quatrevingtpercent" value="php -S 0.0.0.0:8080 -t '.$dataroot.'"></div>';
3203 $htmltext .= ajax_autoselect("cliphpserver");
3204 $htmltext .= '<br>';
3205 $htmltext .= '<div class="titre inline-block">3</div> - '.$langs->trans("YouCanAlsoDeployToAnotherWHP");
3206 }
3207 print $form->textwithpicto($linktotestonwebserver, $htmltext, 1, 'none', 'valignmiddle', 0, 3, 'helpvirtualhost');
3208 print '</span>';
3209 }
3210
3211 if (in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesiteconfirm')) || in_array($mode, array('replacesite'))) {
3212 if ($action == 'editcss') {
3213 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3214 // accesskey is for Mac: CTRL + key for all browsers
3215 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3216 if ($conf->browser->name == 'chrome') {
3217 $stringforfirstkey .= ' ALT +';
3218 } elseif ($conf->browser->name == 'firefox') {
3219 $stringforfirstkey .= ' ALT + SHIFT +';
3220 } else {
3221 $stringforfirstkey .= ' CTL +';
3222 }
3223
3224 print '<input type="submit" accesskey="s" title="'.dol_escape_htmltag($stringforfirstkey.' s').'" id="savefileandstay" class="button buttonforacesave hideonsmartphone small" value="'.dol_escape_htmltag($langs->trans("SaveAndStay")).'" name="updateandstay">';
3225 }
3226 if (preg_match('/^create/', $action) && $action != 'file_manager' && $action != 'replacesite' && $action != 'replacesiteconfirm') {
3227 print '<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
3228 }
3229 if (preg_match('/^edit/', $action) && $action != 'file_manager' && $action != 'replacesite' && $action != 'replacesiteconfirm') {
3230 print '<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
3231 }
3232 if ($action != 'preview') {
3233 print '<input type="submit" class="button button-cancel small" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" name="cancel">';
3234 }
3235 }
3236
3237 print '</span>';
3238
3239 //
3240 // Toolbar for pages
3241 //
3242
3243 if ($websitekey && $websitekey != '-1' && (!in_array($action, array('editcss', 'editmenu', 'importsite', 'file_manager', 'replacesite', 'replacesiteconfirm'))) && (!in_array($mode, array('replacesite'))) && !$file_manager) {
3244 print '</div>'; // Close current websitebar to open a new one
3245
3246 print '<!-- Toolbar for websitepage -->';
3247 print '<div class="centpercent websitebar"'.($style ? ' style="'.$style.'"' : '').'>';
3248
3249 print '<div class="websiteselection hideonsmartphoneimp minwidth75 tdoverflowmax100 inline-block">';
3250 print $langs->trans("PageContainer").': ';
3251 print '</div>';
3252
3253 // Button Add new web page
3254 print '<span class="websiteselection paddingrightonly">';
3255 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>';
3256 print '</span>';
3257
3258
3259 $out = '';
3260
3261 $s = $formwebsite->selectContainer($website, 'pageid', $pageid, 0, $action, 'minwidth100 maxwidth200onsmartphone');
3262
3263 $out .= '<span class="websiteselection nopaddingrightimp">';
3264 $out .= $s;
3265 $out .= '</span>';
3266
3267 $urltocreatenewpage = $_SERVER["PHP_SELF"].'?action=createcontainer&token='.newToken().'&website='.urlencode($website->ref);
3268
3269 if (!empty($conf->use_javascript_ajax)) {
3270 $out .= '<script type="text/javascript">';
3271 $out .= 'jQuery(document).ready(function () {';
3272 $out .= ' jQuery("#pageid").change(function () {';
3273 $out .= ' console.log("We select "+jQuery("#pageid option:selected").val());';
3274 $out .= ' if (jQuery("#pageid option:selected").val() == \'-2\') {';
3275 $out .= ' window.location.href = "'.$urltocreatenewpage.'";';
3276 $out .= ' } else {';
3277 $out .= ' window.location.href = "'.$_SERVER["PHP_SELF"].'?website='.urlencode($website->ref).'&pageid="+jQuery("#pageid option:selected").val();';
3278 $out .= ' }';
3279 $out .= ' });';
3280 $out .= '});';
3281 $out .= '</script>';
3282 }
3283
3284 print $out;
3285
3286 // Button to switch status
3287 if (!empty($conf->use_javascript_ajax)) {
3288 print '<span class="websiteselection">';
3289 //print '<div class="inline-block marginrightonly">';
3290 if ($object->status == $object::STATUS_DRAFT) { // website is off, we do not allow to change status of page
3291 $text_off = 'SetWebsiteOnlineBefore';
3292 if ($websitepage->status == $websitepage::STATUS_DRAFT) { // page is off
3293 print '<span class="valignmiddle disabled opacitymedium">'.img_picto($langs->trans($text_off), 'switch_off').'</span>';
3294 } else {
3295 print '<span class="valignmiddle disabled opacitymedium">'.img_picto($langs->trans($text_off), 'switch_on').'</span>';
3296 }
3297 } else {
3298 print ajax_object_onoff($websitepage, 'status', 'status', 'Online', 'Offline', array(), 'valignmiddle inline-block'.(empty($websitepage->id) ? ' opacitymedium disabled' : ''), 'statuswebsitepage', 1, 'pageid='.$websitepage->id);
3299 }
3300 //print '</div>';
3301 print '</span>';
3302 }
3303
3304 print '<span class="websiteselection">';
3305
3306 print '<input type="image" class="valignmiddle buttonwebsite" src="'.img_picto('', 'refresh', '', 0, 1).'" name="refreshpage" value="'.$langs->trans("Load").'"'.(($action != 'editsource') ? '' : ' disabled="disabled"').'>';
3307
3308 // Print nav arrows
3309 $pagepreviousid = 0;
3310 $pagenextid = 0;
3311 if ($pageid) {
3312 $sql = "SELECT MAX(rowid) as pagepreviousid FROM ".MAIN_DB_PREFIX."website_page WHERE rowid < ".((int) $pageid)." AND fk_website = ".((int) $object->id);
3313 $resql = $db->query($sql);
3314 if ($resql) {
3315 $obj = $db->fetch_object($resql);
3316 if ($obj) {
3317 $pagepreviousid = $obj->pagepreviousid;
3318 }
3319 } else {
3320 dol_print_error($db);
3321 }
3322 $sql = "SELECT MIN(rowid) as pagenextid FROM ".MAIN_DB_PREFIX."website_page WHERE rowid > ".((int) $pageid)." AND fk_website = ".((int) $object->id);
3323 $resql = $db->query($sql);
3324 if ($resql) {
3325 $obj = $db->fetch_object($resql);
3326 if ($obj) {
3327 $pagenextid = $obj->pagenextid;
3328 }
3329 } else {
3330 dol_print_error($db);
3331 }
3332 }
3333
3334 if ($pagepreviousid) {
3335 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>';
3336 } else {
3337 print '<span class="valignmiddle opacitymedium">'.img_previous($langs->trans("PreviousContainer")).'</span>';
3338 }
3339 if ($pagenextid) {
3340 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>';
3341 } else {
3342 print '<span class="valignmiddle opacitymedium">'.img_next($langs->trans("NextContainer")).'</span>';
3343 }
3344
3345 print '</span>';
3346
3347 if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite') {
3348 $disabled = '';
3349 if (!$user->hasRight('website', 'write')) {
3350 $disabled = ' disabled="disabled"';
3351 }
3352
3353 // Confirmation delete site
3354 if ($action == 'deletesite') {
3355 // Create an array for form
3356 $formquestion = array(
3357 array('type' => 'checkbox', 'name' => 'delete_also_js', 'label' => $langs->trans("DeleteAlsoJs"), 'value' => 0),
3358 array('type' => 'checkbox', 'name' => 'delete_also_medias', 'label' => $langs->trans("DeleteAlsoMedias"), 'value' => 0),
3359 //array('type' => 'other','name' => 'newlang','label' => $langs->trans("Language"), 'value' => $formadmin->select_language(GETPOST('newlang', 'aZ09')?GETPOST('newlang', 'aZ09'):$langs->defaultlang, 'newlang', 0, null, '', 0, 0, 'minwidth200')),
3360 //array('type' => 'other','name' => 'newwebsite','label' => $langs->trans("WebSite"), 'value' => $formwebsite->selectWebsite($object->id, 'newwebsite', 0))
3361 );
3362
3363 if ($atleastonepage) {
3364 $langs->load("errors");
3365 $formquestion[] = array('type' => 'onecolumn', 'value' => '<div class="warning">'.$langs->trans("WarningPagesWillBeDeleted").'</div>');
3366 }
3367
3368 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteWebsite'), '', 'confirm_deletesite', $formquestion, 0, 1, 210 + ($atleastonepage ? 70 : 0), 580);
3369
3370 print $formconfirm;
3371 }
3372
3373 // Confirmation to clone
3374 if ($action == 'createfromclone') {
3375 // Create an array for form
3376 $formquestion = array(
3377 array('type' => 'text', 'name' => 'siteref', 'label' => $langs->trans("WebSite"), 'value' => 'copy_of_'.$object->ref)
3378 );
3379
3380 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('CloneSite'), '', 'confirm_createfromclone', $formquestion, 0, 1, 200);
3381
3382 print $formconfirm;
3383 }
3384
3385 if ($pageid > 0 && $atleastonepage) { // pageid can be set without pages, if homepage of site is set and all pages were removed
3386 // Confirmation to clone
3387 if ($action == 'createpagefromclone') {
3388 // Create an array for form
3389 $preselectedlanguage = GETPOST('newlang', 'aZ09') ? GETPOST('newlang', 'aZ09') : ''; // Dy default, we do not force any language on pages
3390 $onlylang = array();
3391 if ($website->otherlang) {
3392 if (!empty($website->lang)) {
3393 $onlylang[$website->lang] = $website->lang.' ('.$langs->trans("Default").')';
3394 }
3395 foreach (explode(',', $website->otherlang) as $langkey) {
3396 if (empty(trim($langkey))) {
3397 continue;
3398 }
3399 $onlylang[$langkey] = $langkey;
3400 }
3401 $textifempty = $langs->trans("Default");
3402 } else {
3403 $onlylang['none'] = 'none';
3404 $textifempty = $langs->trans("Default");
3405 }
3406 $formquestion = array(
3407 array('type' => 'hidden', 'name' => 'sourcepageurl', 'value' => $objectpage->pageurl),
3408 array('type' => 'other', 'tdclass' => 'fieldrequired', 'name' => 'newwebsite', 'label' => $langs->trans("WebSite"), 'value' => $formwebsite->selectWebsite($object->id, 'newwebsite', 0)),
3409 array('type' => 'text', 'tdclass' => 'maxwidth200 fieldrequired', 'moreattr' => 'autofocus="autofocus"', 'name' => 'newtitle', 'label' => $langs->trans("WEBSITE_TITLE"), 'value' => $langs->trans("CopyOf").' '.$objectpage->title),
3410 array('type' => 'text', 'tdclass' => 'maxwidth200', 'name' => 'newpageurl', 'label' => $langs->trans("WEBSITE_PAGENAME"), 'value' => '')
3411 );
3412 if (count($onlylang) > 1) {
3413 $formquestion[] = array('type' => 'checkbox', 'tdclass' => 'maxwidth200', 'name' => 'is_a_translation', 'label' => $langs->trans("PageIsANewTranslation"), 'value' => 0, 'morecss' => 'margintoponly');
3414 }
3415
3416 $value = $formadmin->select_language($preselectedlanguage, 'newlang', 0, null, $textifempty, 0, 0, 'minwidth200', 1, 0, 0, $onlylang, 1);
3417 $formquestion[] = array('type' => 'other', 'name' => 'newlang', 'label' => $form->textwithpicto($langs->trans("Language"), $langs->trans("DefineListOfAltLanguagesInWebsiteProperties")), 'value' => $value);
3418
3419 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?website='.$object->ref.'&pageid='.$pageid, $langs->trans('ClonePage'), '', 'confirm_createpagefromclone', $formquestion, 0, 1, 300, 550);
3420
3421 print $formconfirm;
3422 }
3423
3424 print '<span class="websiteselection">';
3425
3426 // Edit web page properties
3427 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>';
3428
3429 // Edit HTML content
3430 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>';
3431
3432 // Edit CKEditor
3433 if (getDolGlobalInt('WEBSITE_ALLOW_CKEDITOR')) {
3434 print '<a href="'.$_SERVER["PHP_SELF"].'?website='.$object->ref.'&pageid='.$pageid.'&action=editcontent&token='.newToken().'" class="button bordertransp"'.$disabled.'>'.dol_escape_htmltag("CKEditor").'</a>';
3435 } else {
3436 print '<!-- Add option WEBSITE_ALLOW_CKEDITOR to allow ckeditor -->';
3437 }
3438
3439 print '</span>';
3440
3441
3442 // Switch include dynamic content / edit inline
3443 print '<!-- button EditInLine and ShowSubcontainers -->'."\n";
3444 print '<div class="websiteselectionsection inline-block">';
3445
3446 print '<div class="inline-block marginrightonly">'; // Button includes dynamic content
3447 print $langs->trans("ShowSubcontainers");
3448 if (!getDolGlobalString('WEBSITE_SUBCONTAINERSINLINE')) {
3449 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>';
3450 } else {
3451 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>';
3452 }
3453 print '</div>';
3454
3455 print '<div class="inline-block marginrightonly">'; // Button edit inline
3456
3457 print '<span id="switchckeditorinline">'."\n";
3458 // Enable CKEditor inline with js on section and div with conteneditable=true
3459 print '<!-- Code to enabled edit inline ckeditor -->'."\n";
3460 print '<script type="text/javascript">
3461 $(document).ready(function() {
3462 var isEditingEnabled = '.(getDolGlobalString("WEBSITE_EDITINLINE") ? 'true' : 'false').';
3463 if (isEditingEnabled)
3464 {
3465 switchEditorOnline(true);
3466 }
3467
3468 $( "#switchckeditorinline" ).click(function() {
3469 switchEditorOnline();
3470 });
3471
3472 function switchEditorOnline(forceenable)
3473 {
3474 if (! isEditingEnabled || forceenable)
3475 {
3476 console.log("Enable inline edit for some html tags with contenteditable=true attribute");
3477
3478 jQuery(\'section[contenteditable="true"],div[contenteditable="true"],header[contenteditable="true"],main[contenteditable="true"],footer[contenteditable="true"]\').each(function(idx){
3479 var idtouse = $(this).attr(\'id\');
3480 console.log("Enable inline edit for "+idtouse);
3481 if (idtouse !== undefined) {
3482 var inlineditor = CKEDITOR.inline(idtouse, {
3483 // Allow some non-standard markup that we used in the introduction.
3484 // + a[target];div{float,display} ?
3485 extraAllowedContent: \'span(*);cite(*);q(*);dl(*);dt(*);dd(*);ul(*);li(*);header(*);main(*);footer(*);button(*);h1(*);h2(*);h3(*);\',
3486 //extraPlugins: \'sourcedialog\',
3487 removePlugins: \'flash,stylescombo,exportpdf,scayt,wsc,pagebreak,iframe,smiley\',
3488 // Show toolbar on startup (optional).
3489 // startupFocus: true
3490 });
3491
3492 // Custom bar tool
3493 // Note the Source tool does not work on inline
3494 inlineditor.config.toolbar = [
3495 [\'Templates\',\'NewPage\'],
3496 [\'Save\'],
3497 [\'Maximize\',\'Preview\'],
3498 [\'PasteText\'],
3499 [\'Undo\',\'Redo\',\'-\',\'Find\',\'Replace\',\'-\',\'SelectAll\',\'RemoveFormat\'],
3500 [\'CreateDiv\',\'ShowBlocks\'],
3501 [\'Form\', \'Checkbox\', \'Radio\', \'TextField\', \'Textarea\', \'Select\', \'Button\', \'ImageButton\', \'HiddenField\'],
3502 [\'Bold\',\'Italic\',\'Underline\',\'Strike\',\'Superscript\'],
3503 [\'NumberedList\',\'BulletedList\',\'-\',\'Outdent\',\'Indent\',\'Blockquote\'],
3504 [\'JustifyLeft\',\'JustifyCenter\',\'JustifyRight\',\'JustifyBlock\'],
3505 [\'Link\',\'Unlink\'],
3506 [\'Image\',\'Table\',\'HorizontalRule\'],
3507 [\'Styles\',\'Format\',\'Font\',\'FontSize\'],
3508 [\'TextColor\',\'BGColor\']
3509 ];
3510
3511 // Start editor
3512 //inlineditor.on(\'instanceReady\', function () {
3513 // ...
3514 //});
3515
3516 CKEDITOR.instances[idtouse].on(\'change\', function() {
3517 $(this.element.$).addClass(\'modified\');
3518 })
3519 } else {
3520 console.warn("A html section has the contenteditable=true attribute but has no id attribute");
3521 }
3522 })
3523
3524 isEditingEnabled = true;
3525
3526 // Trigger the function when clicking outside the elements with contenteditable=true attribute
3527 $(document).on(\'click\', function(e) {
3528 var target = $(e.target);
3529 // Check if the click is outside the elements with contenteditable=true attribute
3530 if (!target.closest(\'[contenteditable="true"]\').length) {
3531 // Repeat through the elements with contenteditable="true" attribute
3532 $(\'[contenteditable="true"]\').each(function() {
3533 var idToUse = $(this).attr(\'id\');
3534 var elementType = $(this).prop("tagName").toLowerCase(); // Get the tag name (div, section, footer...)
3535 var instance = CKEDITOR.instances[idToUse];
3536 // Check if the element has been modified
3537 if ($(this).hasClass(\'modified\')) {
3538 var content = instance.getData();
3539 content = "\\n" + content;
3540
3541 // Retrieving the content and ID of the element
3542 var elementId = $(this).attr(\'id\');
3543
3544 // Sending data via AJAX
3545 $.ajax({
3546 type: \'POST\',
3547 url: \'' . DOL_URL_ROOT . '/core/ajax/editinline.php\',
3548 data: {
3549 website_ref: \''.$website->ref.'\',
3550 page_id: \'' . $websitepage->id . '\',
3551 content: content,
3552 element_id: elementId,
3553 element_type: elementType,
3554 action: \'updatedElementContent\',
3555 token: \'' . newToken() . '\'
3556 },
3557 success: function(response) {
3558 console.log(response);
3559 }
3560 });
3561
3562 $(this).removeClass(\'modified\');
3563 }
3564 });
3565 }
3566 });
3567
3568 } else {
3569 console.log("Disable inline edit");
3570 for(name in CKEDITOR.instances) {
3571 CKEDITOR.instances[name].destroy(true);
3572 }
3573 isEditingEnabled = false;
3574 }
3575 }
3576 });
3577 </script>';
3578 print $langs->trans("EditInLine");
3579 print '</span>';
3580
3581 //$disableeditinline = $websitepage->grabbed_from;
3582 $disableeditinline = 0;
3583 if ($disableeditinline) {
3584 //print '<input type="submit" class="button bordertransp" disabled="disabled" title="'.dol_escape_htmltag($langs->trans("OnlyEditionOfSourceForGrabbedContent")).'" value="'.dol_escape_htmltag($langs->trans("EditWithEditor")).'" name="editcontent">';
3585 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>';
3586 } else {
3587 //print '<input type="submit" class="button nobordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("EditWithEditor")).'" name="editcontent">';
3588 if (!getDolGlobalString('WEBSITE_EDITINLINE')) {
3589 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>';
3590 } else {
3591 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>';
3592 }
3593 }
3594
3595 print '</div>';
3596
3597 print '</div>';
3598
3599 // Set page as homepage
3600 print '<span class="websiteselection">';
3601 if ($object->fk_default_home > 0 && $pageid == $object->fk_default_home) {
3602 //$disabled=' disabled="disabled"';
3603 //print '<span class="button bordertransp disabled"'.$disabled.' title="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'"><span class="fas fa-home"></span></span>';
3604 //print '<input type="submit" class="button bordertransp" disabled="disabled" value="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'" name="setashome">';
3605 print '<a href="#" class="button bordertransp disabled" disabled="disabled" title="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'"><span class="fas fa-home valignmiddle btnTitle-icon"></span></a>';
3606 } else {
3607 //$disabled='';
3608 //print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'" name="setashome">';
3609 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="fas fa-home valignmiddle btnTitle-icon"></span></a>';
3610 }
3611 print '<input type="submit" class="button bordertransp"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("ClonePage")).'" name="createpagefromclone">';
3612
3613 // Delete
3614 if ($websitepage->status != $websitepage::STATUS_DRAFT) {
3615 $disabled = ' disabled="disabled"';
3616 $title = $langs->trans("WebpageMustBeDisabled", $langs->transnoentitiesnoconv($websitepage->LibStatut(0, 0)));
3617 $url = '#';
3618 } else {
3619 $disabled = '';
3620 $title = '';
3621 $url = $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&pageid='.((int) $websitepage->id).'&website='.urlencode($website->ref); // action=delete for webpage, deletesite for website
3622 }
3623 print '<a href="'.$url.'" class="button buttonDelete bordertransp'.($disabled ? ' disabled' : '').'"'.$disabled.' title="'.dol_escape_htmltag($title).'">'.img_picto('', 'delete', 'class=""').'<span class="hideonsmartphone paddingleft">'.$langs->trans("Delete").'</span></a>';
3624 print '</span>';
3625 }
3626 }
3627
3628 //print '</span>'; // end website selection
3629
3630 print '<span class="websitetools">';
3631
3632 if (($pageid > 0 && $atleastonepage) && ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone' || $action == 'deletesite')) {
3633 $realpage = $urlwithroot.'/public/website/index.php?website='.$websitekey.'&pageref='.$websitepage->pageurl;
3634 $pagealias = $websitepage->pageurl;
3635
3636 $htmltext = $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage, $dataroot);
3637 $htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("ReadPerm"), '{s1}');
3638 $htmltext = str_replace('{s1}', $dataroot.'<br>'.DOL_DATA_ROOT.'/medias<br>'.DOL_DOCUMENT_ROOT, $htmltext);
3639 //$htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("WritePerm"), '{s1}');
3640 //$htmltext = str_replace('{s1}', DOL_DATA_ROOT.'/medias', $htmltext);
3641
3642 print '<div class="websiteinputurl inline-block paddingright">';
3643 print '<a class="websitebuttonsitepreview inline-block" id="previewpage" href="'.$realpage.'&nocache='.dol_now().'" class="button" target="tab'.$websitekey.'" alt="'.dol_escape_htmltag($htmltext).'">';
3644 print $form->textwithpicto('', $htmltext, 1, 'preview');
3645 print '</a>'; // View page in new Tab
3646 print '</div>';
3647
3648 /*print '<div class="websiteinputurl inline-block" id="websiteinputpage">';
3649 print '<input type="text" id="previewpageurl" class="minwidth200imp" name="previewsite" value="'.$pagealias.'" disabled="disabled">';
3650 $htmltext = $langs->trans("PageNameAliasHelp", $langs->transnoentitiesnoconv("EditPageMeta"));
3651 print $form->textwithpicto('', $htmltext, 1, 'help', '', 0, 2, 'helppagealias');
3652 print '</div>';*/
3653
3654 /*
3655 $urlext = $virtualurl.'/'.$pagealias.'.php';
3656 $urlint = $urlwithroot.'/public/website/index.php?website='.$websitekey;
3657
3658 $htmltext = $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $virtualurl ? $urlext : '<span class="error">'.$langs->trans("VirtualHostUrlNotDefined").'</span>');
3659
3660 print '<a class="websitebuttonsitepreview'.($virtualurl ? '' : ' websitebuttonsitepreviewdisabled cursornotallowed').'" id="previewpageext" href="'.$urlext.'" target="tab'.$websitekey.'ext" alt="'.dol_escape_htmltag($htmltext).'">';
3661 print $form->textwithpicto('', $htmltext, 1, 'preview_ext');
3662 print '</a>';
3663 */
3664 //print '<input type="submit" class="button" name="previewpage" target="tab'.$websitekey.'"value="'.$langs->trans("ViewPageInNewTab").'">';
3665
3666 // TODO Add js to save alias like we save virtual host name and use dynamic virtual host for url of id=previewpageext
3667 }
3668 if (!in_array($mode, array('replacesite')) && !in_array($action, array('editcss', 'editmenu', 'file_manager', 'replacesiteconfirm', 'createsite', 'createcontainer', 'createfromclone', 'createpagefromclone', 'deletesite'))) {
3669 if ($action == 'editsource' || $action == 'editmeta') {
3670 // accesskey is for Windows or Linux: ALT + key for chrome, ALT + SHIFT + KEY for firefox
3671 // accesskey is for Mac: CTRL + key for all browsers
3672 $stringforfirstkey = $langs->trans("KeyboardShortcut");
3673 if ($conf->browser->name == 'chrome') {
3674 $stringforfirstkey .= ' ALT +';
3675 } elseif ($conf->browser->name == 'firefox') {
3676 $stringforfirstkey .= ' ALT + SHIFT +';
3677 } else {
3678 $stringforfirstkey .= ' CTL +';
3679 }
3680
3681 print '<input type="submit" accesskey="s" title="'.dol_escape_htmltag($stringforfirstkey.' s').'" id="savefileandstay" class="button buttonforacesave hideonsmartphone small" value="'.dol_escape_htmltag($langs->trans("SaveAndStay")).'" name="updateandstay">';
3682 }
3683 if (preg_match('/^create/', $action)) {
3684 print '<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
3685 }
3686 if (preg_match('/^edit/', $action)) {
3687 print '<input type="submit" id="savefile" class="button buttonforacesave button-save small" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
3688 }
3689 if ($action != 'preview') {
3690 print '<input type="submit" class="button button-cancel small" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" name="cancel">';
3691 }
3692 }
3693
3694 print '</span>'; // end websitetools
3695
3696 print '<span class="websitehelp">';
3697 if ($action == 'editsource' || $action == 'editcontent' || GETPOST('editsource', 'alpha') || GETPOST('editcontent', 'alpha')) {
3698 $url = 'https://wiki.dolibarr.org/index.php/Module_Website';
3699
3700 $htmltext = '<small>';
3701 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource", $url);
3702 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource1", $url);
3703 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource2", $url);
3704 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource3", $url);
3705 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSourceMore", $url);
3706 $htmltext .= '<br>';
3707 $htmltext .= '</small>';
3708 if ($conf->browser->layout == 'phone') {
3709 print $form->textwithpicto('', $htmltext, 1, 'help', 'inline-block', 1, 2, 'tooltipsubstitution');
3710 } else {
3711 //img_help(($tooltiptrigger != '' ? 2 : 1), $alt)
3712 print $form->textwithpicto($langs->trans("SyntaxHelp").' '.img_help(2, $langs->trans("SyntaxHelp")), $htmltext, 1, 'none', 'inline-block', 1, 2, 'tooltipsubstitution');
3713 }
3714 }
3715 print '</span>'; // end websitehelp
3716
3717
3718 if ($action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone') {
3719 // Adding jquery code to change on the fly url of preview ext
3720 if (!empty($conf->use_javascript_ajax)) {
3721 print '<script type="text/javascript">
3722 jQuery(document).ready(function() {
3723 jQuery("#websiteinputurl").keyup(function() {
3724 console.log("Website external url modified "+jQuery("#previewsiteurl").val());
3725 if (jQuery("#previewsiteurl").val() != "" && jQuery("#previewsiteurl").val().startsWith("http"))
3726 {
3727 jQuery("a.websitebuttonsitepreviewdisabled img").css({ opacity: 1 });
3728 }
3729 else jQuery("a.websitebuttonsitepreviewdisabled img").css({ opacity: 0.2 });
3730 ';
3731 print '
3732 });
3733 jQuery("#previewsiteext,#previewpageext").click(function() {
3734
3735 newurl=jQuery("#previewsiteurl").val();
3736 if (! newurl.startsWith("http"))
3737 {
3738 alert(\''.dol_escape_js($langs->trans("ErrorURLMustStartWithHttp")).'\');
3739 return false;
3740 }
3741
3742 newpage=jQuery("#previewsiteurl").val() + "/" + jQuery("#previewpageurl").val() + ".php";
3743 console.log("Open url "+newurl);
3744 /* Save url */
3745 jQuery.ajax({
3746 method: "POST",
3747 url: "'.DOL_URL_ROOT.'/core/ajax/saveinplace.php",
3748 data: {
3749 field: \'editval_virtualhost\',
3750 element: \'website\',
3751 table_element: \'website\',
3752 fk_element: '.((int) $object->id).',
3753 value: newurl,
3754 },
3755 context: document.body
3756 });
3757
3758 jQuery("#previewsiteext").attr("href",newurl);
3759 jQuery("#previewpageext").attr("href",newpage);
3760 });
3761 });
3762 </script>';
3763 }
3764 }
3765 }
3766
3767 print '</div>'; // end current websitebar
3768}
3769
3770
3771$head = array();
3772
3773
3774/*
3775 * Edit Site HTML header and CSS
3776 */
3777
3778if ($action == 'editcss') {
3779 print '<div class="fiche">';
3780
3781 print '<br>';
3782
3783 if (!GETPOSTISSET('WEBSITE_CSS_INLINE')) {
3784 $csscontent = @file_get_contents($filecss);
3785 // Clean the php css file to remove php code and get only css part
3786 $csscontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $csscontent);
3787 } else {
3788 $csscontent = GETPOST('WEBSITE_CSS_INLINE', 'none');
3789 }
3790 if (!trim($csscontent)) {
3791 $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;}";
3792 }
3793
3794 if (!GETPOSTISSET('WEBSITE_JS_INLINE')) {
3795 $jscontent = @file_get_contents($filejs);
3796 // Clean the php js file to remove php code and get only js part
3797 $jscontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $jscontent);
3798 } else {
3799 $jscontent = GETPOST('WEBSITE_JS_INLINE', 'none');
3800 }
3801 if (!trim($jscontent)) {
3802 $jscontent = '/* JS content (all pages) */'."\n";
3803 }
3804
3805 if (!GETPOSTISSET('WEBSITE_HTML_HEADER')) {
3806 $htmlheadercontent = @file_get_contents($filehtmlheader);
3807 // Clean the php htmlheader file to remove php code and get only html part
3808 $htmlheadercontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $htmlheadercontent);
3809 } else {
3810 $htmlheadercontent = GETPOST('WEBSITE_HTML_HEADER', 'none');
3811 }
3812 if (!trim($htmlheadercontent)) {
3813 $htmlheadercontent = "<html>\n";
3814 $htmlheadercontent .= $htmlheadercontentdefault;
3815 $htmlheadercontent .= "</html>";
3816 } else {
3817 $htmlheadercontent = preg_replace('/^\s*<html>/ims', '', $htmlheadercontent);
3818 $htmlheadercontent = preg_replace('/<\/html>\s*$/ims', '', $htmlheadercontent);
3819 $htmlheadercontent = '<html>'."\n".trim($htmlheadercontent)."\n".'</html>';
3820 }
3821
3822 if (!GETPOSTISSET('WEBSITE_ROBOT')) {
3823 $robotcontent = @file_get_contents($filerobot);
3824 // Clean the php htmlheader file to remove php code and get only html part
3825 $robotcontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $robotcontent);
3826 } else {
3827 $robotcontent = GETPOST('WEBSITE_ROBOT', 'nohtml');
3828 }
3829 if (!trim($robotcontent)) {
3830 $robotcontent .= "# Robot file. Generated with ".DOL_APPLICATION_TITLE."\n";
3831 $robotcontent .= "User-agent: *\n";
3832 $robotcontent .= "Allow: /public/\n";
3833 $robotcontent .= "Disallow: /administrator/\n";
3834 }
3835
3836 if (!GETPOSTISSET('WEBSITE_HTACCESS')) {
3837 $htaccesscontent = @file_get_contents($filehtaccess);
3838 // Clean the php htaccesscontent file to remove php code and get only html part
3839 $htaccesscontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $htaccesscontent);
3840 } else {
3841 $htaccesscontent = GETPOST('WEBSITE_HTACCESS', 'nohtml'); // We must use 'nohtml' and not 'alphanohtml' because we must accept "
3842 }
3843 if (!trim($htaccesscontent)) {
3844 $htaccesscontent .= "# Order allow,deny\n";
3845 $htaccesscontent .= "# Deny from all\n";
3846 }
3847
3848 if (!GETPOSTISSET('WEBSITE_MANIFEST_JSON')) {
3849 $manifestjsoncontent = @file_get_contents($filemanifestjson);
3850 // Clean the manifestjson file to remove php code and get only html part
3851 $manifestjsoncontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $manifestjsoncontent);
3852 } else {
3853 $manifestjsoncontent = GETPOST('WEBSITE_MANIFEST_JSON', 'restricthtml');
3854 }
3855 if (!trim($manifestjsoncontent)) {
3856 //$manifestjsoncontent.="";
3857 }
3858
3859 if (!GETPOSTISSET('WEBSITE_README')) {
3860 $readmecontent = @file_get_contents($filereadme);
3861 // Clean the readme file to remove php code and get only html part
3862 $readmecontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $readmecontent);
3863 } else {
3864 $readmecontent = GETPOST('WEBSITE_README', 'none');
3865 }
3866 if (!trim($readmecontent)) {
3867 //$readmecontent.="";
3868 }
3869
3870 if (!GETPOSTISSET('WEBSITE_LICENSE')) {
3871 $licensecontent = @file_get_contents($filelicense);
3872 // Clean the readme file to remove php code and get only html part
3873 $licensecontent = preg_replace('/<\?php \/\/ BEGIN PHP[^\?]*END PHP( \?>)?\n*/ims', '', $licensecontent);
3874 } else {
3875 $licensecontent = GETPOST('WEBSITE_LICENSE', 'none');
3876 }
3877 if (!trim($licensecontent)) {
3878 //$readmecontent.="";
3879 }
3880
3881 print dol_get_fiche_head();
3882
3883 print '<!-- Edit Website properties -->'."\n";
3884 print '<table class="border centpercent">';
3885
3886 // Website
3887 print '<tr><td class="titlefieldcreate fieldrequired">';
3888 print $langs->trans('WebSite');
3889 print '</td><td>';
3890 print $websitekey;
3891 print '</td></tr>';
3892
3893 // Status of web site
3894 if ($action != 'createcontainer') {
3895 if (empty($conf->use_javascript_ajax)) {
3896 print '<!-- Status of web site page -->'."\n";
3897 print '<tr><td class="fieldrequired">';
3898 print $langs->trans('Status');
3899 print '</td><td>';
3900 print $form->selectyesno('status', $object->status);
3901 print '</td></tr>';
3902 }
3903 }
3904
3905 // Main language
3906 print '<tr><td class="tdtop fieldrequired">';
3907 $htmltext = '';
3908 print $form->textwithpicto($langs->trans('MainLanguage'), $htmltext, 1, 'help', '', 0, 2, 'WEBSITE_LANG');
3909 print '</td><td>';
3910 print img_picto('', 'language', 'class="picotfixedwidth"');
3911 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);
3912 print '</td>';
3913 print '</tr>';
3914
3915 // Other languages
3916 print '<tr><td class="tdtop">';
3917 $htmltext = $langs->trans("Example").': fr,de,sv,it,pt';
3918 print $form->textwithpicto($langs->trans('OtherLanguages'), $htmltext, 1, 'help', '', 0, 2);
3919 print '</td><td>';
3920 print img_picto('', 'language', 'class="picotfixedwidth"');
3921 print '<input type="text" class="flat" value="'.(GETPOSTISSET('WEBSITE_OTHERLANG') ? GETPOST('WEBSITE_OTHERLANG', 'alpha') : $object->otherlang).'" name="WEBSITE_OTHERLANG">';
3922 print '</td>';
3923 print '</tr>';
3924
3925 // VirtualHost
3926 print '<tr><td class="tdtop">';
3927
3928 $htmltext = $langs->trans("VirtualhostDesc");
3929 print $form->textwithpicto($langs->trans('Virtualhost'), $htmltext, 1, 'help', '', 0, 2, 'virtualhosttooltip');
3930 print '</td><td>';
3931 print '<input type="text" class="flat minwidth300" value="'.(GETPOSTISSET('virtualhost') ? GETPOST('virtualhost', 'alpha') : $virtualurl).'" name="virtualhost">';
3932 print '</td>';
3933 print '</tr>';
3934
3935 // Favicon
3936 print '<tr><td>';
3937 print $form->textwithpicto($langs->trans('ImportFavicon'), $langs->trans('FaviconTooltip'));
3938 print '</td><td>';
3939 $maxfilesizearray = getMaxFileSizeArray();
3940 $maxmin = $maxfilesizearray['maxmin'];
3941 if ($maxmin > 0) {
3942 print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
3943 }
3944 print '<input type="file" class="flat minwidth300" name="addedfile" id="addedfile"/>';
3945
3946 $uploadfolder = $conf->website->dir_output.'/'.$websitekey;
3947 if (dol_is_file($uploadfolder.'/favicon.png')) {
3948 print '<div class="inline-block valignmiddle marginrightonly">';
3949 print '<img style="max-height: 80px" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=website&file='.$websitekey.'/favicon.png">';
3950 print '</div>';
3951 }
3952 print '</tr></td>';
3953
3954 // CSS file
3955 print '<tr><td class="tdtop">';
3956 $htmlhelp = $langs->trans("CSSContentTooltipHelp");
3957 print $form->textwithpicto($langs->trans('WEBSITE_CSS_INLINE'), $htmlhelp, 1, 'help', '', 0, 2, 'csstooltip');
3958 print '</td><td>';
3959
3960 $poscursor = array('x' => GETPOST('WEBSITE_CSS_INLINE_x'), 'y' => GETPOST('WEBSITE_CSS_INLINE_y'));
3961 $doleditor = new DolEditor('WEBSITE_CSS_INLINE', $csscontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
3962 print $doleditor->Create(1, '', true, 'CSS', 'css');
3963
3964 print '</td></tr>';
3965
3966 // JS file
3967 print '<tr><td class="tdtop">';
3968 $textwithhelp = $langs->trans('WEBSITE_JS_INLINE');
3969 $htmlhelp2 = $langs->trans("LinkAndScriptsHereAreNotLoadedInEditor").'<br>';
3970 print $form->textwithpicto($textwithhelp, $htmlhelp2, 1, 'warning', '', 0, 2, 'htmljstooltip2');
3971
3972 print '</td><td>';
3973
3974 $poscursor = array('x' => GETPOST('WEBSITE_JS_INLINE_x'), 'y' => GETPOST('WEBSITE_JS_INLINE_y'));
3975 $doleditor = new DolEditor('WEBSITE_JS_INLINE', $jscontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
3976 print $doleditor->Create(1, '', true, 'JS', 'javascript');
3977
3978 print '</td></tr>';
3979
3980 // Common HTML header
3981 print '<tr><td class="tdtop">';
3982 print $langs->trans('WEBSITE_HTML_HEADER');
3983 $htmlhelp = $langs->trans("Example").' :<br>';
3984 $htmlhelp .= dol_nl2br(dol_htmlentities($htmlheadercontentdefault)); // do not use dol_htmlentitiesbr here, $htmlheadercontentdefault is HTML with content like <link> and <script> that we want to be html encode as they must be show as doc content not executable instruction.
3985 $textwithhelp = $form->textwithpicto('', $htmlhelp, 1, 'help', '', 0, 2, 'htmlheadertooltip');
3986 $htmlhelp2 = $langs->trans("LinkAndScriptsHereAreNotLoadedInEditor").'<br>';
3987 print $form->textwithpicto($textwithhelp, $htmlhelp2, 1, 'warning', '', 0, 2, 'htmlheadertooltip2');
3988 print '</td><td>';
3989
3990 $poscursor = array('x' => GETPOST('WEBSITE_HTML_HEADER_x'), 'y' => GETPOST('WEBSITE_HTML_HEADER_y'));
3991 $doleditor = new DolEditor('WEBSITE_HTML_HEADER', $htmlheadercontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
3992 print $doleditor->Create(1, '', true, 'HTML Header', 'html');
3993
3994 print '</td></tr>';
3995
3996 // Robot file
3997 print '<tr><td class="tdtop">';
3998 print $langs->trans('WEBSITE_ROBOT');
3999 print '</td><td>';
4000
4001 $poscursor = array('x' => GETPOST('WEBSITE_ROBOT_x'), 'y' => GETPOST('WEBSITE_ROBOT_y'));
4002 $doleditor = new DolEditor('WEBSITE_ROBOT', $robotcontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
4003 print $doleditor->Create(1, '', true, 'Robot file', 'text');
4004
4005 print '</td></tr>';
4006
4007 // .htaccess
4008 print '<tr><td class="tdtop">';
4009 print $langs->trans('WEBSITE_HTACCESS');
4010 print '</td><td>';
4011
4012 $poscursor = array('x' => GETPOST('WEBSITE_HTACCESS_x'), 'y' => GETPOST('WEBSITE_HTACCESS_y'));
4013 $doleditor = new DolEditor('WEBSITE_HTACCESS', $htaccesscontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
4014 print $doleditor->Create(1, '', true, $langs->trans("File").' .htaccess', 'text');
4015
4016 print '</td></tr>';
4017
4018 // Manifest.json
4019 print '<tr><td class="tdtop">';
4020 $htmlhelp = $langs->trans("Example").' :<br>';
4021 $htmlhelp .= '<small>'.dol_htmlentitiesbr($manifestjsoncontentdefault).'</small>';
4022 print $form->textwithpicto($langs->trans('WEBSITE_MANIFEST_JSON'), $htmlhelp, 1, 'help', '', 0, 2, 'manifestjsontooltip');
4023 print '</td><td>';
4024 print $langs->trans("UseManifest").': '.$form->selectyesno('use_manifest', $website->use_manifest, 1).'<br>';
4025
4026 $poscursor = array('x' => GETPOST('WEBSITE_MANIFEST_JSON_x'), 'y' => GETPOST('WEBSITE_MANIFEST_JSON_y'));
4027 $doleditor = new DolEditor('WEBSITE_MANIFEST_JSON', $manifestjsoncontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
4028 print $doleditor->Create(1, '', true, $langs->trans("File").' manifest.json', 'text');
4029 print '</td></tr>';
4030
4031 // README.md
4032 print '<tr><td class="tdtop">';
4033 $htmlhelp = $langs->trans("EnterHereReadmeInformation");
4034 print $form->textwithpicto($langs->trans("File").' README.md', $htmlhelp, 1, 'help', '', 0, 2, 'readmetooltip');
4035 print '</td><td>';
4036
4037 $poscursor = array('x' => GETPOST('WEBSITE_README_x'), 'y' => GETPOST('WEBSITE_README_y'));
4038 $doleditor = new DolEditor('WEBSITE_README', $readmecontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
4039 print $doleditor->Create(1, '', true, $langs->trans("File").' README.md', 'text');
4040
4041 print '</td></tr>';
4042
4043 // LICENSE
4044 print '<tr><td class="tdtop">';
4045 $htmlhelp = $langs->trans("EnterHereLicenseInformation");
4046 print $form->textwithpicto($langs->trans("File").' LICENSE', $htmlhelp, 1, 'help', '', 0, 2, 'licensetooltip');
4047 print '</td><td>';
4048
4049 $poscursor = array('x' => GETPOST('WEBSITE_LICENSE_x'), 'y' => GETPOST('WEBSITE_LICENSE_y'));
4050 $doleditor = new DolEditor('WEBSITE_LICENSE', $licensecontent, '', '220', 'ace', 'In', true, false, 'ace', 0, '100%', '', $poscursor);
4051 print $doleditor->Create(1, '', true, $langs->trans("File").' LICENSE', 'text');
4052
4053 print '</td></tr>';
4054
4055 // RSS
4056 print '<tr><td class="tdtop">';
4057 $htmlhelp = $langs->trans('RSSFeedDesc');
4058 print $form->textwithpicto($langs->trans('RSSFeed'), $htmlhelp, 1, 'help', '', 0, 2, '');
4059 print '</td><td>';
4060 print '/wrapper.php?rss=1[&l=XX][&limit=123]';
4061 print '</td></tr>';
4062
4063 print '</table>';
4064
4065 print dol_get_fiche_end();
4066
4067 print '</div>';
4068
4069 print '<br>';
4070}
4071
4072
4073if ($action == 'createsite') {
4074 print '<div class="fiche">';
4075
4076 print '<br>';
4077
4078 /*$h = 0;
4079 $head = array();
4080
4081 $head[$h][0] = dol_buildpath('/website/index.php',1).'?id='.$object->id;
4082 $head[$h][1] = $langs->trans("AddSite");
4083 $head[$h][2] = 'card';
4084 $h++;
4085
4086 print dol_get_fiche_head($head, 'card', '', -1, 'globe');
4087 */
4088 if ($action == 'createcontainer') {
4089 print load_fiche_titre($langs->trans("AddSite"));
4090 }
4091
4092 print '<!-- Add site -->'."\n";
4093 print '<div class="tabBar tabBarWithBottom">';
4094
4095 print '<table class="border centpercent">';
4096
4097 $siteref = $sitedesc = $sitelang = $siteotherlang = '';
4098 if (GETPOST('WEBSITE_REF')) {
4099 $siteref = GETPOST('WEBSITE_REF', 'aZ09');
4100 }
4101 if (GETPOST('WEBSITE_DESCRIPTION')) {
4102 $sitedesc = GETPOST('WEBSITE_DESCRIPTION', 'alpha');
4103 }
4104 if (GETPOST('WEBSITE_LANG')) {
4105 $sitelang = GETPOST('WEBSITE_LANG', 'aZ09');
4106 }
4107 if (GETPOST('WEBSITE_OTHERLANG')) {
4108 $siteotherlang = GETPOST('WEBSITE_OTHERLANG', 'aZ09comma');
4109 }
4110
4111 print '<tr><td class="titlefieldcreate fieldrequired">';
4112 print $form->textwithpicto($langs->trans('WebsiteName'), $langs->trans("Example").': MyPortal, www.mywebsite.com, ...');
4113 print '</td><td>';
4114 print '<input type="text" class="flat maxwidth300" name="WEBSITE_REF" value="'.dol_escape_htmltag($siteref).'" autofocus>';
4115 print '</td></tr>';
4116
4117 print '<tr><td class="fieldrequired">';
4118 print $langs->trans('MainLanguage');
4119 print '</td><td>';
4120 $shortlangcode = preg_replace('/[_-].*$/', '', trim($langs->defaultlang));
4121 print img_picto('', 'language', 'class="pictofixedwidth"');
4122 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);
4123 print '</td></tr>';
4124
4125 print '<tr><td>';
4126 $htmltext = $langs->trans("Example").': fr,de,sv,it,pt';
4127 print $form->textwithpicto($langs->trans('OtherLanguages'), $htmltext, 1, 'help', '', 0, 2);
4128 print '</td><td>';
4129 print img_picto('', 'language', 'class="pictofixedwidth"');
4130 print '<input type="text" class="flat minwidth300" name="WEBSITE_OTHERLANG" value="'.dol_escape_htmltag($siteotherlang).'">';
4131 print '</td></tr>';
4132
4133 print '<tr><td>';
4134 print $langs->trans('Description');
4135 print '</td><td>';
4136 print '<input type="text" class="flat minwidth500" name="WEBSITE_DESCRIPTION" value="'.dol_escape_htmltag($sitedesc).'">';
4137 print '</td></tr>';
4138
4139 print '<tr><td>';
4140
4141 $htmltext = $langs->trans("VirtualhostDesc");
4142 /*$htmltext = str_replace('{s1}', DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/website/<i>websiteref</i>', $htmltext);
4143 $htmltext .= '<br>';
4144 $htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("ReadPerm"), DOL_DOCUMENT_ROOT);
4145 $htmltext .= '<br>'.$langs->trans("CheckVirtualHostPerms", $langs->transnoentitiesnoconv("WritePerm"), '{s1}');
4146 $htmltext = str_replace('{s1}', DOL_DATA_ROOT.'/website<br>'.DOL_DATA_ROOT.'/medias', $htmltext);*/
4147
4148
4149 print $form->textwithpicto($langs->trans('Virtualhost'), $htmltext, 1, 'help', '', 0, 2, '');
4150 print '</td><td>';
4151 print '<input type="text" class="flat minwidth300" name="virtualhost" value="'.dol_escape_htmltag(GETPOST('virtualhost', 'alpha')).'">';
4152 print '</td></tr>';
4153
4154 print '</table>';
4155 print '</div>';
4156
4157 if ($action == 'createsite') {
4158 print '<div class="center">';
4159
4160 print '<input type="submit" class="button small" name="addcontainer" value="'.$langs->trans("Create").'">';
4161 print '<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans("Cancel").'">';
4162
4163 print '</div>';
4164 }
4165
4166
4167 //print '</div>';
4168
4169 //print dol_get_fiche_end();
4170
4171 print '</div>';
4172
4173 print '<br>';
4174}
4175
4176if ($action == 'importsite') {
4177 print '<!-- action=importsite -->';
4178 print '<div class="fiche">';
4179
4180 print '<br>';
4181
4182 print load_fiche_titre($langs->trans("ImportSite"));
4183
4184 print dol_get_fiche_head(array(), '0', '', -1);
4185
4186 print '<span class="opacitymedium">'.$langs->trans("ZipOfWebsitePackageToImport").'</span><br><br>';
4187
4188
4189 $dolibarrdataroot = preg_replace('/([\\/]+)$/i', '', DOL_DATA_ROOT);
4190 $allowimportsite = true;
4191 if (dol_is_file($dolibarrdataroot.'/installmodules.lock')) {
4192 $allowimportsite = false;
4193 }
4194
4195 if ($allowimportsite) {
4196 $maxfilesizearray = getMaxFileSizeArray();
4197 $maxmin = $maxfilesizearray['maxmin'];
4198 if ($maxmin > 0) {
4199 print '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
4200 }
4201 print '<input class="flat minwidth400" type="file" name="userfile[]" accept=".zip">';
4202 print '<input type="submit" class="button small" name="buttonsubmitimportfile" value="'.dol_escape_htmltag($langs->trans("Upload")).'">';
4203 print '<input type="submit" class="button button-cancel small" name="preview" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
4204 print '<br><br><br>';
4205 } else {
4206 if (getDolGlobalString('MAIN_MESSAGE_INSTALL_MODULES_DISABLED_CONTACT_US')) {
4207 // Show clean corporate message
4208 $message = $langs->trans('InstallModuleFromWebHasBeenDisabledContactUs');
4209 } else {
4210 // Show technical generic message
4211 $message = $langs->trans("InstallModuleFromWebHasBeenDisabledByFile", $dolibarrdataroot.'/installmodules.lock');
4212 }
4213 print info_admin($message).'<br><br>';
4214 }
4215
4216
4217 print '<span class="opacitymedium">'.$langs->trans("ZipOfWebsitePackageToLoad").'</span><br><br>';
4218
4219 showWebsiteTemplates($website);
4220
4221 print dol_get_fiche_end();
4222
4223 print '</div>';
4224
4225 print '<br>';
4226}
4227
4228if ($action == 'editmeta' || $action == 'createcontainer') { // Edit properties of a web site OR properties of a web page
4229 print '<div class="fiche">';
4230
4231 print '<br>';
4232
4233 /*$h = 0;
4234 $head = array();
4235
4236 $head[$h][0] = dol_buildpath('/website/index.php',1).'?id='.$object->id;
4237 $head[$h][1] = $langs->trans("AddPage");
4238 $head[$h][2] = 'card';
4239 $h++;
4240
4241 print dol_get_fiche_head($head, 'card', '', -1, 'globe');
4242 */
4243 if ($action == 'createcontainer') {
4244 print load_fiche_titre($langs->trans("AddPage"));
4245 }
4246
4247 print '<!-- Edit or create page/container -->'."\n";
4248 //print '<div class="fichecenter">';
4249
4250 $hiddenfromfetchingafterload = ' hideobject';
4251 $hiddenmanuallyafterload = ' hideobject';
4252 if (GETPOST('radiocreatefrom') == 'checkboxcreatefromfetching') {
4253 $hiddenfromfetchingafterload = '';
4254 }
4255 if (GETPOST('radiocreatefrom') == 'checkboxcreatemanually') {
4256 $hiddenmanuallyafterload = '';
4257 }
4258
4259 if ($action == 'editmeta' || empty($conf->use_javascript_ajax)) { // No autohide/show in such case
4260 $hiddenfromfetchingafterload = '';
4261 $hiddenmanuallyafterload = '';
4262 }
4263
4264 if ($action == 'createcontainer') {
4265 print '<br>';
4266
4267 if (!empty($conf->use_javascript_ajax)) {
4268 print '<input type="radio" name="radiocreatefrom" id="checkboxcreatemanually" value="checkboxcreatemanually"'.(GETPOST('radiocreatefrom') == 'checkboxcreatemanually' ? ' checked' : '').'> ';
4269 }
4270 print '<label for="checkboxcreatemanually"><span class="opacitymediumxx">'.$langs->trans("OrEnterPageInfoManually").'</span></label><br>';
4271 print '<hr class="tablecheckboxcreatemanually'.$hiddenmanuallyafterload.'">';
4272 }
4273
4274 print '<table class="border tableforfield nobackground centpercent tablecheckboxcreatemanually'.$hiddenmanuallyafterload.'">';
4275
4276 if ($action != 'createcontainer') {
4277 print '<tr><td class="titlefield fieldrequired">';
4278 print $langs->trans('IDOfPage').' - '.$langs->trans('InternalURLOfPage');
4279 print '</td><td>';
4280 print $pageid;
4281 //print '</td></tr>';
4282
4283 //print '<tr><td class="titlefield fieldrequired">';
4284 //print $langs->trans('InternalURLOfPage');
4285 //print '</td><td>';
4286 print ' &nbsp; - &nbsp; ';
4287 print '/public/website/index.php?website='.urlencode($websitekey).'&pageid='.urlencode($pageid);
4288 //if ($objectpage->grabbed_from) print ' - <span class="opacitymedium">'.$langs->trans('InitiallyGrabbedFrom').' '.$objectpage->grabbed_from.'</span>';
4289 print '</td></tr>';
4290
4291 $type_container = $objectpage->type_container;
4292 $pageurl = $objectpage->pageurl;
4293 $pagealiasalt = $objectpage->aliasalt;
4294 $pagetitle = $objectpage->title;
4295 $pagedescription = $objectpage->description;
4296 $pageimage = $objectpage->image;
4297 $pagekeywords = $objectpage->keywords;
4298 $pagelang = $objectpage->lang;
4299 $pageallowedinframes = $objectpage->allowed_in_frames;
4300 $pagehtmlheader = $objectpage->htmlheader;
4301 $pagedatecreation = $objectpage->date_creation;
4302 $pagedatemodification = $objectpage->date_modification;
4303 $pageauthorid = $objectpage->fk_user_creat;
4304 $pageusermodifid = $objectpage->fk_user_modif;
4305 $pageauthoralias = $objectpage->author_alias;
4306 $pagestatus = $objectpage->status;
4307 } else { // $action = 'createcontainer'
4308 $type_container = 'page';
4309 $pageurl = '';
4310 $pagealiasalt = '';
4311 $pagetitle = '';
4312 $pagedescription = '';
4313 $pageimage = '';
4314 $pagekeywords = '';
4315 $pagelang = '';
4316 $pageallowedinframes = 0;
4317 $pagehtmlheader = '';
4318 $pagedatecreation = dol_now();
4319 $pagedatemodification = '';
4320 $pageauthorid = $user->id;
4321 $pageusermodifid = 0;
4322 $pageauthoralias = '';
4323 $pagestatus = 1;
4324 }
4325 if (GETPOST('WEBSITE_TITLE', 'alpha')) {
4326 $pagetitle = str_replace(array('<', '>'), '', GETPOST('WEBSITE_TITLE', 'alphanohtml'));
4327 }
4328 if (GETPOST('WEBSITE_PAGENAME', 'alpha')) {
4329 $pageurl = GETPOST('WEBSITE_PAGENAME', 'alpha');
4330 }
4331 if (GETPOST('WEBSITE_ALIASALT', 'alpha')) {
4332 $pagealiasalt = str_replace(array('<', '>'), '', GETPOST('WEBSITE_ALIASALT', 'alphanohtml'));
4333 }
4334 if (GETPOST('WEBSITE_DESCRIPTION', 'alpha')) {
4335 $pagedescription = str_replace(array('<', '>'), '', GETPOST('WEBSITE_DESCRIPTION', 'alphanohtml'));
4336 }
4337 if (GETPOST('WEBSITE_IMAGE', 'alpha')) {
4338 $pageimage = GETPOST('WEBSITE_IMAGE', 'alpha');
4339 }
4340 if (GETPOST('WEBSITE_KEYWORDS', 'alpha')) {
4341 $pagekeywords = str_replace(array('<', '>'), '', GETPOST('WEBSITE_KEYWORDS', 'alphanohtml'));
4342 }
4343 if (GETPOST('WEBSITE_LANG', 'aZ09')) {
4344 $pagelang = GETPOST('WEBSITE_LANG', 'aZ09');
4345 }
4346 if (GETPOST('WEBSITE_ALLOWED_IN_FRAMES', 'aZ09')) {
4347 $pageallowedinframes = GETPOST('WEBSITE_ALLOWED_IN_FRAMES', 'aZ09');
4348 }
4349 if (GETPOST('htmlheader', 'none')) {
4350 $pagehtmlheader = GETPOST('htmlheader', 'none');
4351 }
4352
4353 if ($action != 'createcontainer') {
4354 if (empty($conf->use_javascript_ajax)) {
4355 print '<!-- Status of web site page -->'."\n";
4356 print '<tr><td class="fieldrequired">';
4357 print $langs->trans('Status');
4358 print '</td><td>';
4359 print $form->selectyesno('status', $objectpage->status);
4360 print '</td></tr>';
4361 }
4362 }
4363
4364 // Type of container
4365 print '<tr><td class="titlefield fieldrequired">';
4366 print $langs->trans('WEBSITE_TYPE_CONTAINER');
4367 print '</td><td>';
4368 print img_picto('', 'object_technic', 'class="paddingrightonly"').' ';
4369 print $formwebsite->selectTypeOfContainer('WEBSITE_TYPE_CONTAINER', (GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha') ? GETPOST('WEBSITE_TYPE_CONTAINER', 'alpha') : $type_container), 0, '', 1, 'minwidth300');
4370 print '</td></tr>';
4371
4372 print '<script type="text/javascript">
4373 jQuery(document).ready(function() {
4374 jQuery("#selectWEBSITE_TYPE_CONTAINER").change(function() {
4375 console.log("We change type of page : "+jQuery("#selectWEBSITE_TYPE_CONTAINER").val());
4376 if (jQuery("#selectWEBSITE_TYPE_CONTAINER").val() == \'blogpost\') {
4377 jQuery(".trpublicauthor").show();
4378 } else {
4379 jQuery(".trpublicauthor").hide();
4380 }
4381 if (jQuery("#selectWEBSITE_TYPE_CONTAINER").val() == \'service\' || jQuery("#selectWEBSITE_TYPE_CONTAINER").val() == \'library\') {
4382 $(".spanprefix").html("_" + $("#selectWEBSITE_TYPE_CONTAINER").val() + "_");
4383 jQuery(".spanprefix").show();
4384 } else {
4385 jQuery(".spanprefix").hide();
4386 }
4387 });
4388
4389 // Force at init execution a first time of the handler change
4390 jQuery("#selectWEBSITE_TYPE_CONTAINER").trigger(\'change\');
4391 });
4392 </script>
4393 ';
4394
4395 // Title
4396 print '<tr><td class="fieldrequired">';
4397 print $langs->trans('WEBSITE_TITLE');
4398 print '</td><td>';
4399 print '<input type="text" class="flat quatrevingtpercent" name="WEBSITE_TITLE" id="WEBSITE_TITLE" value="'.dol_escape_htmltag($pagetitle).'" autofocus>';
4400 print '</td></tr>';
4401
4402 // Alias page
4403 print '<tr><td class="titlefieldcreate fieldrequired">';
4404 print $langs->trans('WEBSITE_PAGENAME');
4405 print '</td><td>';
4406 print '<span class="opacitymedium spanprefix hidden"></span> ';
4407 print '<input type="text" class="flat minwidth300" name="WEBSITE_PAGENAME" id="WEBSITE_PAGENAME" value="'.dol_escape_htmltag((string) preg_replace('/^_[a-z]+_/', '', (string) $pageurl)).'">';
4408 print '</td></tr>';
4409
4410 print '<script type="text/javascript">
4411 $(document).ready(function() {
4412 console.log("Manage prefix for service or library");
4413 if ($("#selectWEBSITE_TYPE_CONTAINER").val() == "service" || $("#selectWEBSITE_TYPE_CONTAINER").val() == "library") {
4414 $(".spanprefix").html("_" + $("#selectWEBSITE_TYPE_CONTAINER").val() + "_");
4415 $(".spanprefix").show();
4416 }
4417 $(".websiteformtoolbar").on("submit", function(event) {
4418 if ($("#selectWEBSITE_TYPE_CONTAINER").val() == "service" || $("#selectWEBSITE_TYPE_CONTAINER").val() == "library") {
4419 var prefix = "_" + $("#selectWEBSITE_TYPE_CONTAINER").val() + "_";
4420 var userInput = $("#WEBSITE_PAGENAME").val();
4421 var $inputField = $("#WEBSITE_PAGENAME");
4422 if (userInput.indexOf(prefix) !== 0) {
4423 $inputField.val(prefix + userInput);
4424 }
4425 }
4426 });
4427 });
4428 </script>
4429 ';
4430
4431 print '<tr><td class="titlefieldcreate">';
4432 $htmlhelp = $langs->trans("WEBSITE_ALIASALTDesc");
4433 print $form->textwithpicto($langs->trans('WEBSITE_ALIASALT'), $htmlhelp, 1, 'help', '', 0, 2, 'aliastooltip');
4434 print '</td><td>';
4435 print '<input type="text" class="flat minwidth500" name="WEBSITE_ALIASALT" value="'.dol_escape_htmltag($pagealiasalt).'">';
4436 print '</td></tr>';
4437
4438 print '<tr><td>';
4439 print $langs->trans('WEBSITE_DESCRIPTION');
4440 print '</td><td>';
4441 print '<input type="text" class="flat quatrevingtpercent" name="WEBSITE_DESCRIPTION" value="'.dol_escape_htmltag($pagedescription).'">';
4442 print '</td></tr>';
4443
4444 // Deprecated. Image for RSS or Thumbs must be taken from the content.
4445 if (getDolGlobalInt('WEBSITE_MANAGE_IMAGE_FOR_PAGES')) {
4446 print '<tr class="trimageforpage hidden"><td>';
4447 $htmlhelp = $langs->trans("WEBSITE_IMAGEDesc");
4448 print $form->textwithpicto($langs->trans('WEBSITE_IMAGE'), $htmlhelp, 1, 'help', '', 0, 2, 'imagetooltip');
4449 print '</td><td>';
4450 print '<input type="text" class="flat quatrevingtpercent" name="WEBSITE_IMAGE" value="'.dol_escape_htmltag($pageimage).'">';
4451 print '</td></tr>';
4452
4453 print '<script type="text/javascript">
4454 jQuery(document).ready(function() {
4455 jQuery("#selectWEBSITE_TYPE_CONTAINER").change(function() {
4456 console.log("We change type of page : "+jQuery("#selectWEBSITE_TYPE_CONTAINER").val());
4457 if (jQuery("#selectWEBSITE_TYPE_CONTAINER").val() == \'blogpost\') {
4458 jQuery(".trimageforpage").show();
4459 } else {
4460 jQuery(".trimageforpage").hide();
4461 }
4462 });
4463 });
4464 </script>
4465 ';
4466 }
4467
4468 // Keywords
4469 print '<tr><td>';
4470 $htmlhelp = $langs->trans("WEBSITE_KEYWORDSDesc");
4471 print $form->textwithpicto($langs->trans('WEBSITE_KEYWORDS'), $htmlhelp, 1, 'help', '', 0, 2, 'keywordtooltip');
4472 print '</td><td>';
4473 print '<input type="text" class="flat quatrevingtpercent" name="WEBSITE_KEYWORDS" value="'.dol_escape_htmltag($pagekeywords).'">';
4474 print '</td></tr>';
4475
4476 print '<tr><td>';
4477 print $langs->trans('Language');
4478 print '</td><td>';
4479 $onlykeys = array();
4480 if ($object->lang) {
4481 $onlykeys[$object->lang] = $object->lang;
4482 } else {
4483 $onlykeys[$langs->defaultlang] = $langs->defaultlang;
4484 }
4485 if ($object->otherlang) {
4486 $tmparray = explode(',', $object->otherlang);
4487 foreach ($tmparray as $key) {
4488 $tmpkey = trim($key);
4489 if (strlen($key) == 2) {
4490 $tmpkey = strtolower($key);
4491 }
4492 $onlykeys[$tmpkey] = $tmpkey;
4493 }
4494 }
4495 if (empty($object->lang) && empty($object->otherlang)) {
4496 $onlykeys = null; // We keep full list of languages
4497 }
4498 print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language($pagelang ? $pagelang : '', 'WEBSITE_LANG', 0, null, '1', 0, 0, 'minwidth200', 0, 0, 0, $onlykeys, 1);
4499 $htmltext = $langs->trans("AvailableLanguagesAreDefinedIntoWebsiteProperties");
4500 print $form->textwithpicto('', $htmltext);
4501 print '</td></tr>';
4502
4503 // Translation of
4504 $translationof = 0;
4505 $translatedby = 0;
4506 print '<!-- Translation of --><tr><td>';
4507 print $langs->trans('TranslationLinks');
4508 print '</td><td>';
4509 if ($action != 'createcontainer') {
4510 // Has translation pages
4511 $sql = "SELECT rowid, lang from ".MAIN_DB_PREFIX."website_page where fk_page = ".((int) $objectpage->id);
4512 $resql = $db->query($sql);
4513 if ($resql) {
4514 $num_rows = $db->num_rows($resql);
4515 if ($num_rows > 0) {
4516 print '<span class="opacitymedium">'.$langs->trans('ThisPageHasTranslationPages').':</span>';
4517 $i = 0;
4518 $tmppage = new WebsitePage($db);
4519 $tmpstring = '';
4520 while ($obj = $db->fetch_object($resql)) {
4521 $result = $tmppage->fetch($obj->rowid);
4522 if ($result > 0) {
4523 if ($i > 0) {
4524 $tmpstring .= '<br>';
4525 }
4526 $tmpstring .= $tmppage->getNomUrl(1).' '.picto_from_langcode($tmppage->lang).' '.$tmppage->lang;
4527 // Button unlink
4528 $tmpstring .= ' <a class="paddingleft" href="'.$_SERVER["PHP_SELF"].'?website='.urlencode($object->ref).'&pageid='.((int) $objectpage->id).'&action=deletelang&token='.newToken().'&deletelangforid='.((int) $tmppage->id).'">'.img_picto($langs->trans("Remove"), 'unlink').'</a>';
4529 $translatedby++;
4530 $i++;
4531 }
4532 }
4533 if ($i > 1) {
4534 print '<br>';
4535 } else {
4536 print ' ';
4537 }
4538 print $tmpstring;
4539 }
4540 } else {
4541 dol_print_error($db);
4542 }
4543 }
4544 if ((empty($translatedby) || ($objectpage->lang != $object->lang)) && ($action == 'editmeta' || $action == 'createcontainer' || $objectpage->fk_page > 0)) {
4545 $sourcepage = new WebsitePage($db);
4546 $result = 1;
4547 if ($objectpage->fk_page > 0) {
4548 $result = $sourcepage->fetch($objectpage->fk_page);
4549 if ($result == 0) {
4550 // not found, we can reset value to clean database
4551 // TODO
4552 }
4553 }
4554 if ($result >= 0) {
4555 if ($translatedby) {
4556 print '<br>';
4557 }
4558 $translationof = $objectpage->fk_page;
4559 print '<span class="opacitymedium">'.$langs->trans('ThisPageIsTranslationOf').'</span> ';
4560 print $sourcepage->getNomUrl(2).' '.$formwebsite->selectContainer($website, 'pageidfortranslation', ($translationof ? $translationof : -1), 1, $action, 'minwidth300', array($objectpage->id));
4561 if ($translationof > 0 && $sourcepage->lang) {
4562 print picto_from_langcode($sourcepage->lang).' '.$sourcepage->lang;
4563 // Button unlink
4564 print ' <a class="paddingleft" href="'.$_SERVER["PHP_SELF"].'?website='.urlencode($object->ref).'&pageid='.((int) $objectpage->id).'&action=deletelang&token='.newToken().'&deletelangforid='.((int) $objectpage->id).'">'.img_picto($langs->trans("Remove"), 'unlink').'</a>';
4565 }
4566 }
4567 }
4568 print '</td></tr>';
4569
4570 // Categories
4571 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
4572 $langs->load('categories');
4573
4574 if (!GETPOSTISSET('categories')) {
4575 $c = new Categorie($db);
4576 $cats = $c->containing($objectpage->id, Categorie::TYPE_WEBSITE_PAGE);
4577 $arrayselected = array();
4578 if (is_array($cats)) {
4579 foreach ($cats as $cat) {
4580 $arrayselected[] = $cat->id;
4581 }
4582 }
4583
4584 //$cate_arbo = $form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE, '', '', 0, 0, 3);
4585 $cate_arbo = $form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE, '', 'parent', 0, 0, 3);
4586 }
4587
4588 print '<tr><td class="toptd">'.$form->editfieldkey('Categories', 'categories', '', $objectpage, 0).'</td><td>';
4589 print img_picto('', 'category', 'class="pictofixedwidth"');
4590 print $form->multiselectarray('categories', $cate_arbo, (GETPOSTISSET('categories') ? GETPOST('categories', 'array') : $arrayselected), null, null, 'minwidth200 widthcentpercentminusxx');
4591
4592 print dolButtonToOpenUrlInDialogPopup('categories', $langs->transnoentitiesnoconv("Categories"), img_picto('', 'add'), '/categories/index.php?leftmenu=website&nosearch=1&type='.urlencode(Categorie::TYPE_WEBSITE_PAGE).'&website='.urlencode($website->ref), $disabled);
4593
4594 print "</td></tr>";
4595 }
4596
4597 if (getDolGlobalString('WEBSITE_PAGE_SHOW_INTERNAL_LINKS_TO_OBJECT')) { // TODO Replace this with link into element_element ?
4598 print '<tr><td class="titlefieldcreate">';
4599 print 'ObjectClass';
4600 print '</td><td>';
4601 print '<input type="text" class="flat minwidth300" name="WEBSITE_OBJECTCLASS" placeholder="ClassName::/path/class/ObjectClass.class.php" >';
4602 print '</td></tr>';
4603
4604 print '<tr><td class="titlefieldcreate">';
4605 print 'ObjectID';
4606 print '</td><td>';
4607 print '<input type="text" class="flat minwidth300" name="WEBSITE_OBJECTID" >';
4608 print '</td></tr>';
4609 }
4610
4611 $fuser = new User($db);
4612
4613 // Date last modification
4614 if ($action != 'createcontainer') {
4615 print '<tr><td>';
4616 print $langs->trans('DateLastModification');
4617 print '</td><td>';
4618 print dol_print_date($pagedatemodification, 'dayhour', 'tzuser');
4619 print '</td></tr>';
4620
4621 print '<tr><td>';
4622 print $langs->trans('UserModification');
4623 print '</td><td>';
4624 if ($pageusermodifid > 0) {
4625 $fuser->fetch($pageusermodifid);
4626 print $fuser->getNomUrl(-1);
4627 } else {
4628 print '<span class="opacitymedium">'.$langs->trans("Unknown").'</span>';
4629 }
4630 print '</td></tr>';
4631 }
4632
4633 // Content - Example/templates of page
4634 $url = 'https://wiki.dolibarr.org/index.php/Module_Website';
4635 $htmltext = '<small>';
4636 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource", $url);
4637 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource1", $url);
4638 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource2", $url);
4639 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSource3", $url);
4640 $htmltext .= $langs->transnoentitiesnoconv("YouCanEditHtmlSourceMore", $url);
4641 $htmltext .= '<br>';
4642 $htmltext .= '</small>';
4643
4644 $formmail = new FormMail($db);
4645 $formmail->withaiprompt = 'html';
4646 $formmail->withlayout = 1;
4647 $showlinktolayout = $formmail->withlayout;
4648 $showlinktoai = ($formmail->withaiprompt && isModEnabled('ai')) ? 'textgenerationwebpage' : '';
4649 if (($action == 'createcontainer' && $showlinktolayout) || ($action == 'createcontainer' && $showlinktoai)) {
4650 print '<tr><td class="titlefield tdtop">';
4651 if ($conf->browser->layout == 'phone') {
4652 print $form->textwithpicto('', $htmltext, 1, 'help', 'inline-block', 1, 2, 'tooltipsubstitution');
4653 } else {
4654 //img_help(($tooltiptrigger != '' ? 2 : 1), $alt)
4655 print $form->textwithpicto($langs->trans("PreviewPageContent").' '.img_help(2, $langs->trans("PreviewPageContent")), $htmltext, 1, 'none', 'inline-block', 1, 2, 'tooltipsubstitution');
4656 }
4657 print '</td><td class="tdtop">';
4658
4659 $out = '';
4660
4661 $showlinktolayoutlabel = $langs->trans("FillPageWithALayout");
4662 $showlinktoailabel = $langs->trans("FillPageWithAIContent");
4663 $htmlname = 'content';
4664 // Fill $out
4665 include DOL_DOCUMENT_ROOT.'/core/tpl/formlayoutai.tpl.php';
4666
4667 print $out;
4668 print '</td></tr>';
4669 }
4670
4671 if ($action == 'createcontainer') {
4672 print '<tr id="pageContent"><td class="tdtop">';
4673 if (!$showlinktolayout || !$showlinktoai) {
4674 if ($conf->browser->layout == 'phone') {
4675 print $form->textwithpicto('', $htmltext, 1, 'help', 'inline-block', 1, 2, 'tooltipsubstitution');
4676 } else {
4677 //img_help(($tooltiptrigger != '' ? 2 : 1), $alt)
4678 print $form->textwithpicto($langs->trans("PreviewPageContent").' '.img_help(2, $langs->trans("PreviewPageContent")), $htmltext, 1, 'none', 'inline-block', 1, 2, 'tooltipsubstitution');
4679 }
4680 }
4681 print '</td><td>';
4682 //$doleditor = new DolEditor('content', GETPOST('content', 'restricthtmlallowunvalid'), '', 200, 'dolibarr_mailings', 'In', true, true, true, 40, '90%');
4683 $doleditor = new DolEditor('content', GETPOST('content', 'none'), '', 200, 'dolibarr_mailings', 'In', true, true, true, 40, '90%');
4684 $doleditor->Create();
4685 //print '<div class="websitesample" id="contentpreview" name="contentpreview" style="height: 200px; border: 1px solid #bbb; overflow: scroll">';
4686 print '</div>';
4687 //print '<textarea id="content" name="content" class="hideobject">'.GETPOST('content', 'none').'</textarea>';
4688 print '</td></tr>';
4689 }
4690
4691 // Date creation
4692 print '<tr><td>';
4693 print $langs->trans('DateCreation');
4694 print '</td><td>';
4695 print $form->selectDate($pagedatecreation, 'datecreation', 1, 1, 0, '', 1, 1);
4696 //print dol_print_date($pagedatecreation, 'dayhour');
4697 print '</td></tr>';
4698
4699 // Author
4700 print '<tr><td>';
4701 print $langs->trans('Author');
4702 print '</td><td>';
4703 if ($pageauthorid > 0) {
4704 $fuser->fetch($pageauthorid);
4705 print $fuser->getNomUrl(-1);
4706 } else {
4707 print '<span class="opacitymedium">'.$langs->trans("Unknown").'</span>';
4708 }
4709 print '</td></tr>';
4710
4711 // Author - public alias
4712 print '<tr class="trpublicauthor hidden"><td>';
4713 print $langs->trans('PublicAuthorAlias');
4714 print '</td><td>';
4715 print '<input type="text" class="flat minwidth300" name="WEBSITE_AUTHORALIAS" value="'.dol_escape_htmltag($pageauthoralias).'" placeholder="Anonymous">';
4716 print '</td></tr>';
4717
4718 print '<tr><td class="tdhtmlheader tdtop">';
4719 $htmlhelp = $langs->trans("EditTheWebSiteForACommonHeader").'<br><br>';
4720 $htmlhelp .= $langs->trans("Example").' :<br>';
4721 $htmlhelp .= dol_nl2br(dol_htmlentities($htmlheadercontentdefault)); // do not use dol_htmlentitiesbr here, $htmlheadercontentdefault is HTML with content like <link> and <script> that we want to be html encode as they must be show as doc content not executable instruction.
4722 print $form->textwithpicto($langs->transnoentitiesnoconv('HtmlHeaderPage'), $htmlhelp, 1, 'help', '', 0, 2, 'htmlheadertooltip');
4723 print '</td><td>';
4724 $poscursor = array('x' => GETPOST('htmlheader_x'), 'y' => GETPOST('htmlheader_y'));
4725 $doleditor = new DolEditor('htmlheader', $pagehtmlheader, '', '120', 'ace', 'In', true, false, 'ace', ROWS_3, '100%', '', $poscursor);
4726 print $doleditor->Create(1, '', true, 'HTML Header', 'html');
4727 print '</td></tr>';
4728
4729 // Allowed in frames
4730 print '<tr><td>';
4731 print $langs->trans('AllowedInFrames');
4732 //$htmlhelp = $langs->trans("AllowedInFramesDesc");
4733 //print $form->textwithpicto($langs->trans('AllowedInFrames'), $htmlhelp, 1, 'help', '', 0, 2, 'allowedinframestooltip');
4734 print '</td><td>';
4735 print '<input type="checkbox" class="flat" name="WEBSITE_ALLOWED_IN_FRAMES" value="1"'.($pageallowedinframes ? 'checked="checked"' : '').'>';
4736 print '</td></tr>';
4737
4738 print '</table>';
4739
4740 if ($action == 'createcontainer') {
4741 print '<div class="center tablecheckboxcreatemanually'.$hiddenmanuallyafterload.'">';
4742
4743 print '<input type="submit" class="button small" name="addcontainer" value="'.$langs->trans("Create").'">';
4744 print '<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans("Cancel").'">';
4745
4746 print '</div>';
4747
4748
4749 print '<br>';
4750
4751 if (!empty($conf->use_javascript_ajax)) {
4752 print '<input type="radio" name="radiocreatefrom" id="checkboxcreatefromfetching" value="checkboxcreatefromfetching"'.(GETPOST('radiocreatefrom') == 'checkboxcreatefromfetching' ? ' checked' : '').'> ';
4753 }
4754 print '<label for="checkboxcreatefromfetching"><span class="opacitymediumxx">'.$langs->trans("CreateByFetchingExternalPage").'</span></label><br>';
4755 print '<hr class="tablecheckboxcreatefromfetching'.$hiddenfromfetchingafterload.'">';
4756 print '<table class="tableforfield centpercent tablecheckboxcreatefromfetching'.$hiddenfromfetchingafterload.'">';
4757 print '<tr><td class="titlefield">';
4758 print $langs->trans("URL");
4759 print '</td><td>';
4760 print info_admin($langs->trans("OnlyEditionOfSourceForGrabbedContentFuture"), 0, 0, 'warning');
4761 print '<input class="flat minwidth500" type="text" name="externalurl" value="'.dol_escape_htmltag(GETPOST('externalurl', 'alpha')).'" placeholder="https://externalsite/pagetofetch"> ';
4762 print '<br><input class="flat paddingtop" type="checkbox" name="grabimages" value="1" checked="checked"> '.$langs->trans("GrabImagesInto");
4763 print ' ';
4764 print $langs->trans("ImagesShouldBeSavedInto").' ';
4765 $arraygrabimagesinto = array('root' => $langs->trans("WebsiteRootOfImages"), 'subpage' => $langs->trans("SubdirOfPage"));
4766 print $form->selectarray('grabimagesinto', $arraygrabimagesinto, GETPOSTISSET('grabimagesinto') ? GETPOST('grabimagesinto') : 'root', 0, 0, 0, '', 0, 0, 0, '', '', 1);
4767 print '<br>';
4768
4769 print '<input class="button small" style="margin-top: 5px" type="submit" name="fetchexternalurl" value="'.dol_escape_htmltag($langs->trans("FetchAndCreate")).'">';
4770 print '<input class="button button-cancel small" type="submit" name="preview" value="'.$langs->trans("Cancel").'">';
4771
4772 print '</td></tr>';
4773 print '</table>';
4774 }
4775
4776 if ($action == 'createcontainer') {
4777 print '<script type="text/javascript">
4778 jQuery(document).ready(function() {
4779 var disableautofillofalias = 0;
4780 var selectedm = \'\';
4781 var selectedf = \'\';
4782
4783 jQuery("#WEBSITE_TITLE").keyup(function() {
4784 if (disableautofillofalias == 0) {
4785 var valnospecial = jQuery("#WEBSITE_TITLE").val();
4786 valnospecial = valnospecial.replace(/[éèê]/g, \'e\').replace(/[à]/g, \'a\').replace(/[ù]/g, \'u\').replace(/[î]/g, \'i\');
4787 valnospecial = valnospecial.replace(/[ç]/g, \'c\').replace(/[ö]/g, \'o\');
4788 valnospecial = valnospecial.replace(/[^\w]/gi, \'-\').toLowerCase();
4789 valnospecial = valnospecial.replace(/\-+/g, \'-\').replace(/\-$/, \'\');
4790 console.log("disableautofillofalias=0 so we replace WEBSITE_TITLE with "+valnospecial);
4791 jQuery("#WEBSITE_PAGENAME").val(valnospecial);
4792 }
4793 });
4794 jQuery("#WEBSITE_PAGENAME").keyup(function() {
4795 if (jQuery("#WEBSITE_PAGENAME").val() == \'\') {
4796 disableautofillofalias = 0;
4797 } else {
4798 disableautofillofalias = 1;
4799 }
4800 });
4801 jQuery("#WEBSITE_PAGENAME").blur(function() {
4802 if (jQuery("#WEBSITE_PAGENAME").val() == \'\') {
4803 disableautofillofalias = 0;
4804 jQuery("#WEBSITE_TITLE").trigger(\'keyup\');
4805 }
4806 });
4807
4808 jQuery("#checkboxcreatefromfetching,#checkboxcreatemanually").click(function() {
4809 console.log("we select a method to create a new container "+jQuery("#checkboxcreatefromfetching:checked").val())
4810 jQuery(".tablecheckboxcreatefromfetching").hide();
4811 jQuery(".tablecheckboxcreatemanually").hide();
4812 if (typeof(jQuery("#checkboxcreatefromfetching:checked").val()) != \'undefined\') {
4813 console.log("show create from spider form");
4814 if (selectedf != \'createfromfetching\') {
4815 jQuery(".tablecheckboxcreatefromfetching").show();
4816 selectedf = \'createfromfetching\';
4817 selectedm = \'\';
4818 } else {
4819 jQuery(".tablecheckboxcreatefromfetching").hide();
4820 selectedf = \'\';
4821 }
4822 }
4823 if (typeof(jQuery("#checkboxcreatemanually:checked").val()) != \'undefined\') {
4824 console.log("show create from scratch or template form");
4825 if (selectedm != \'createmanually\') {
4826 jQuery(".tablecheckboxcreatemanually").show();
4827 selectedm = \'createmanually\';
4828 selectedf = \'\';
4829 } else {
4830 jQuery(".tablecheckboxcreatemanually").hide();
4831 selectedm = \'\';
4832 }
4833 }
4834 });
4835 });
4836 </script>';
4837 }
4838 //print '</div>';
4839
4840 //print dol_get_fiche_end();
4841
4842 print '</div>';
4843
4844 print '<br>';
4845}
4846
4847
4848// Print formconfirm
4849if ($action == 'preview') {
4850 print $formconfirm;
4851}
4852
4853if ($action == 'editfile' || $action == 'file_manager' || $action == 'convertimgwebp' || $action == 'confirmconvertimgwebp') {
4854 print '<!-- Edit Media -->'."\n";
4855 print '<div class="fiche"><br>';
4856 //print '<div class="center">'.$langs->trans("FeatureNotYetAvailable").'</center>';
4857
4858
4859 $module = 'medias';
4860 $formalreadyopen = 2; // So the form to submit a new file will not be open another time inside the core/tpl/filemanager.tpl.php
4861 if (empty($url)) {
4862 $url = DOL_URL_ROOT.'/website/index.php'; // Must be an url without param
4863 }
4864 include DOL_DOCUMENT_ROOT.'/core/tpl/filemanager.tpl.php';
4865
4866 print '</div>';
4867}
4868
4869if ($action == 'editmenu') {
4870 print '<!-- Edit Menu -->'."\n";
4871 print '<div class="center">'.$langs->trans("FeatureNotYetAvailable").'</center>';
4872}
4873
4874if ($action == 'editsource') {
4875 // Editing with source editor
4876
4877 $contentforedit = '';
4878 //$contentforedit.='<style scoped>'."\n"; // "scoped" means "apply to parent element only". Not yet supported by browsers
4879 //$contentforedit.=$csscontent;
4880 //$contentforedit.='</style>'."\n";
4881 $contentforedit .= $objectpage->content;
4882 //var_dump($_SESSION["dol_screenheight"]);
4883 $maxheightwin = 480;
4884 if (isset($_SESSION["dol_screenheight"])) {
4885 if ($_SESSION["dol_screenheight"] > 680) {
4886 $maxheightwin = $_SESSION["dol_screenheight"] - 400;
4887 }
4888 if ($_SESSION["dol_screenheight"] > 800) {
4889 $maxheightwin = $_SESSION["dol_screenheight"] - 490;
4890 }
4891 }
4892
4893 $poscursor = array('x' => GETPOST('PAGE_CONTENT_x'), 'y' => GETPOST('PAGE_CONTENT_y'));
4894 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
4895 $doleditor = new DolEditor('PAGE_CONTENT', $contentforedit, '', $maxheightwin, 'Full', '', true, true, 'ace', ROWS_5, '40%', 0, $poscursor);
4896 $doleditor->Create(0, '', false, 'HTML Source', 'php');
4897}
4898
4899if ($action == 'editcontent') {
4900 // Editing with default ckeditor
4901
4902 $contentforedit = '';
4903 //$contentforedit.='<style scoped>'."\n"; // "scoped" means "apply to parent element only". Not yet supported by browsers
4904 //$contentforedit.=$csscontent;
4905 //$contentforedit.='</style>'."\n";
4906 $contentforedit .= $objectpage->content;
4907
4908 $nbrep = array();
4909 // If contentforedit has a string <img src="xxx", we replace the xxx with /viewimage.php?modulepart=medias&file=xxx except if xxx starts
4910 // with http, /viewimage.php or DOL_URL_ROOT./viewimage.phps
4911 $contentforedit = preg_replace('/(<img.*\ssrc=")(?!http|\/viewimage\.php|'.preg_quote(DOL_URL_ROOT, '/').'\/viewimage\.php)/', '\1'.DOL_URL_ROOT.'/viewimage.php?modulepart=medias&file=', $contentforedit, -1, $nbrep);
4912
4913 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
4914 $poscursor = array('x' => GETPOST('PAGE_CONTENT_x'), 'y' => GETPOST('PAGE_CONTENT_y'));
4915 $doleditor = new DolEditor('PAGE_CONTENT', $contentforedit, '', 500, 'Full', '', true, true, true, ROWS_5, '90%', 0, $poscursor);
4916 $doleditor->Create(0, '', false);
4917}
4918
4919print "</div>\n";
4920print "</form>\n";
4921
4922
4923if ($mode == 'replacesite' || $massaction == 'replace') {
4924 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
4925 print '<input type="hidden" name="token" value="'.newToken().'">';
4926 print '<input type="hidden" name="action" value="replacesiteconfirm">';
4927 print '<input type="hidden" name="mode" value="replacesite">';
4928 print '<input type="hidden" name="website" value="'.$website->ref.'">';
4929
4930
4931 print '<!-- Search page and replace string -->'."\n";
4932 print '<div class="fiche"><br>';
4933
4934 print load_fiche_titre($langs->trans("ReplaceWebsiteContent"), '', 'search');
4935
4936 print '<div class="fichecenter"><div class="fichehalfleft">';
4937
4938 print '<div class="tagtable">';
4939
4940 print '<div class="tagtr">';
4941 print '<div class="tagtd paddingrightonly opacitymedium">';
4942 print $langs->trans("SearchReplaceInto");
4943 print '</div>';
4944 print '<div class="tagtd">';
4945 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>';
4946 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>';
4947 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>';
4948 print '</div>';
4949 print '</div>';
4950
4951 print '<div class="tagtr">';
4952 print '<div class="tagtd paddingrightonly opacitymedium" style="padding-right: 10px !important">';
4953 print $langs->trans("SearchString");
4954 print '</div>';
4955 print '<div class="tagtd">';
4956 print '<input type="text" name="searchstring" value="'.dol_escape_htmltag($searchkey, 0, 0, '', 1).'" autofocus>';
4957 print '</div>';
4958 print '</div>';
4959
4960 print '</div>';
4961
4962 print '</div><div class="fichehalfleft">';
4963
4964 print '<div class="tagtable">';
4965
4966 print '<div class="tagtr">';
4967 print '<div class="tagtd paddingrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4968 print $langs->trans("WEBSITE_TYPE_CONTAINER");
4969 print '</div>';
4970 print '<div class="tagtd">';
4971 print img_picto('', 'object_technic', 'class="paddingrightonly"').' ';
4972 print $formwebsite->selectTypeOfContainer('optioncontainertype', (GETPOST('optioncontainertype', 'alpha') ? GETPOST('optioncontainertype', 'alpha') : ''), 1, '', 1, 'minwidth125 maxwidth400 widthcentpercentminusx');
4973 print '</div>';
4974 print '</div>';
4975
4976 print '<div class="tagtr">';
4977 print '<div class="tagtd paddingrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4978 print $langs->trans("Language");
4979 print '</div>';
4980 print '<div class="tagtd">';
4981 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);
4982 print '</div>';
4983 print '</div>';
4984
4985 // Categories
4986 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
4987 print '<div class="tagtr">';
4988 print '<div class="tagtd paddingrightonly marginrightonly opacitymedium tdoverflowmax100onsmartphone" style="padding-right: 10px !important">';
4989 print $langs->trans("Category");
4990 print '</div>';
4991 print '<div class="tagtd">';
4992 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');
4993 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
4994 print ajax_combobox('optioncategory');
4995 print '</div>';
4996 print '</div>';
4997 }
4998
4999 print '</div>';
5000
5001 print '<input type="submit" class="button margintoponly" name="buttonreplacesitesearch" value="'.dol_escape_htmltag($langs->trans("Search")).'">';
5002
5003 print '</div></div>';
5004
5005 if ($mode == 'replacesite') {
5006 print '<!-- List of search result -->'."\n";
5007 print '<div class="rowsearchresult clearboth">';
5008
5009 print '<br>';
5010 print '<br>';
5011
5012 if ($listofpages['code'] == 'OK') {
5013 $arrayofselected = is_array($toselect) ? $toselect : array();
5014 $param = '';
5015 $nbtotalofrecords = count($listofpages['list']);
5016 $num = $limit;
5017 $permissiontodelete = $user->hasRight('website', 'delete');
5018
5019 // List of mass actions available
5020 $arrayofmassactions = array();
5021 if ($user->hasRight('website', 'writephp') && $searchkey) {
5022 $arrayofmassactions['replace'] = img_picto('', 'replacement', 'class="pictofixedwidth"').$langs->trans("Replace");
5023 }
5024 if ($user->hasRight('website', 'write')) {
5025 $arrayofmassactions['setcategory'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("ClassifyInCategory");
5026 }
5027 if ($user->hasRight('website', 'write')) {
5028 $arrayofmassactions['delcategory'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("RemoveCategory");
5029 }
5030 if ($permissiontodelete) {
5031 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
5032 }
5033 if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
5034 $arrayofmassactions = array();
5035 }
5036
5037 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
5038 $massactionbutton .= '<div class="massactionother massactionreplace hidden">';
5039 $massactionbutton .= $langs->trans("ReplaceString");
5040 $massactionbutton .= ' <input type="text" name="replacestring" value="'.dol_escape_htmltag(GETPOST('replacestring', 'none')).'">';
5041 $massactionbutton .= '</div>';
5042 $massactionbutton .= '<div class="massactionother massactionsetcategory massactiondelcategory hidden">';
5043 $massactionbutton .= img_picto('', 'category', 'class="pictofixedwidth"');
5044 $massactionbutton .= $form->select_all_categories(Categorie::TYPE_WEBSITE_PAGE, GETPOSTISSET('setcategory') ? GETPOST('setcategory') : '', 'setcategory', 64, 0, 0, 0, 'minwidth300 alignstart');
5045 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
5046 $massactionbutton .= ajax_combobox('setcategory');
5047 $massactionbutton .= '</div>';
5048
5049 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
5050
5051 //$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
5052 $selectedfields = '';
5053 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
5054
5055 print_barre_liste($langs->trans("Results"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'generic', 0, '', '', $limit, 1, 1, 1);
5056
5057 $topicmail = "WebsitePageRef";
5058 $modelmail = "websitepage_send";
5059 $objecttmp = new WebsitePage($db);
5060 $trackid = 'wsp'.$object->id;
5061 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
5062
5063 $param = 'mode=replacesite&website='.urlencode($website->ref);
5064 $param .= '&searchstring='.urlencode($searchkey);
5065 if (GETPOST('optioncontent')) {
5066 $param .= '&optioncontent=content';
5067 }
5068 if (GETPOST('optionmeta')) {
5069 $param .= '&optionmeta=meta';
5070 }
5071 if (GETPOST('optionsitefiles')) {
5072 $param .= '&optionsitefiles=optionsitefiles';
5073 }
5074 if (GETPOST('optioncontainertype')) {
5075 $param .= '&optioncontainertype='.GETPOST('optioncontainertype', 'aZ09');
5076 }
5077 if (GETPOST('optionlanguage')) {
5078 $param .= '&optionlanguage='.GETPOST('optionlanguage', 'aZ09');
5079 }
5080 if (GETPOST('optioncategory')) {
5081 $param .= '&optioncategory='.GETPOST('optioncategory', 'aZ09');
5082 }
5083
5084 print '<div class="div-table-responsive-no-min">';
5085 print '<table class="noborder centpercent">';
5086 print '<tr class="liste_titre">';
5087 // Action column
5088 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5089 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
5090 }
5091 print getTitleFieldOfList("Type", 0, $_SERVER['PHP_SELF'], 'type_container', '', $param, '', $sortfield, $sortorder, '')."\n";
5092 print getTitleFieldOfList("Page", 0, $_SERVER['PHP_SELF'], 'pageurl', '', $param, '', $sortfield, $sortorder, '')."\n";
5093 print getTitleFieldOfList("Language", 0, $_SERVER['PHP_SELF'], 'lang', '', $param, '', $sortfield, $sortorder, 'center ')."\n";
5094 print getTitleFieldOfList("Categories", 0, $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'center ')."\n";
5095 print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']);
5096 print getTitleFieldOfList("UserCreation", 0, $_SERVER['PHP_SELF'], 'fk_user_creat', '', $param, '', $sortfield, $sortorder, '')."\n";
5097 print getTitleFieldOfList("DateCreation", 0, $_SERVER['PHP_SELF'], 'date_creation', '', $param, '', $sortfield, $sortorder, 'center ')."\n"; // Date creation
5098 print getTitleFieldOfList("DateLastModification", 0, $_SERVER['PHP_SELF'], 'tms', '', $param, '', $sortfield, $sortorder, 'center ')."\n"; // Date last modif
5099 print getTitleFieldOfList("", 0, $_SERVER['PHP_SELF']);
5100 // Action column
5101 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5102 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
5103 }
5104 print '</tr>';
5105
5106 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
5107 $c = new Categorie($db);
5108
5109 $totalnbwords = 0;
5110
5111 foreach ($listofpages['list'] as $answerrecord) {
5112 if (is_object($answerrecord) && get_class($answerrecord) == 'WebsitePage') {
5113 $param = '?mode=replacesite';
5114 $param .= '&websiteid='.$website->id;
5115 $param .= '&optioncontent='.GETPOST('optioncontent', 'aZ09');
5116 $param .= '&optionmeta='.GETPOST('optionmeta', 'aZ09');
5117 $param .= '&optionsitefiles='.GETPOST('optionsitefiles', 'aZ09');
5118 $param .= '&optioncontainertype='.GETPOST('optioncontainertype', 'aZ09');
5119 $param .= '&optionlanguage='.GETPOST('optionlanguage', 'aZ09');
5120 $param .= '&optioncategory='.GETPOST('optioncategory', 'aZ09');
5121 $param .= '&searchstring='.urlencode($searchkey);
5122
5123 print '<tr>';
5124
5125 // Action column
5126 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5127 print '<td class="nowrap center">';
5128
5129 print '<!-- Status of page -->'."\n";
5130 if ($massactionbutton || $massaction) {
5131 $selected = 0;
5132 if (in_array($answerrecord->id, $arrayofselected)) {
5133 $selected = 1;
5134 }
5135 print '<input id="'.$answerrecord->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$answerrecord->id.'"'.($selected ? ' checked="checked"' : '').'>';
5136 }
5137 print '</td>';
5138 }
5139
5140 // Type of container
5141 print '<td class="nowraponall">';
5142 //print $langs->trans("Container").'<br>';
5143 if (!empty($conf->cache['type_of_container'][$answerrecord->type_container])) {
5144 print $langs->trans($conf->cache['type_of_container'][$answerrecord->type_container]);
5145 } else {
5146 print $langs->trans($answerrecord->type_container);
5147 }
5148 print '</td>';
5149
5150 // Container url and label
5151 $titleofpage = ($answerrecord->title ? $answerrecord->title : $langs->trans("NoTitle"));
5152 print '<td class="tdoverflowmax300" title="'.dol_escape_htmltag($titleofpage).'">';
5153 print $answerrecord->getNomUrl(1);
5154 print ' <span class="opacitymedium">('.dol_escape_htmltag($titleofpage).')</span>';
5155 //print '</td>';
5156 //print '<td class="tdoverflow100">';
5157 print '<br>';
5158 print '<span class="opacitymedium">'.dol_escape_htmltag($answerrecord->description ? $answerrecord->description : $langs->trans("NoDescription")).'</span>';
5159 print '</td>';
5160
5161 // Language
5162 print '<td class="center">';
5163 print picto_from_langcode($answerrecord->lang, $answerrecord->lang);
5164 print '</td>';
5165
5166 // Categories - Tags
5167 print '<td class="center">';
5168 if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
5169 // Get current categories
5170 $existing = $c->containing($answerrecord->id, Categorie::TYPE_WEBSITE_PAGE, 'object');
5171 if (is_array($existing)) {
5172 foreach ($existing as $tmpcategory) {
5173 //var_dump($tmpcategory);
5174 print img_object($langs->trans("Category").' : '.$tmpcategory->label, 'category', 'style="padding-left: 2px; padding-right: 2px; color: #'.($tmpcategory->color != '' ? $tmpcategory->color : '888').'"');
5175 }
5176 }
5177 }
5178 //var_dump($existing);
5179 print '</td>';
5180
5181 // Number of words
5182 print '<td class="center nowraponall">';
5183 $textwithouthtml = dol_string_nohtmltag(dolStripPhpCode($answerrecord->content));
5184 $characterMap = 'áàéèëíóúüñùç0123456789';
5185 $nbofwords = str_word_count($textwithouthtml, 0, $characterMap);
5186 if ($nbofwords) {
5187 print $nbofwords.' '.$langs->trans("words");
5188 $totalnbwords += $nbofwords;
5189 }
5190 print '</td>';
5191
5192 // Author
5193 print '<td class="tdoverflowmax125">';
5194 if (!empty($answerrecord->fk_user_creat)) {
5195 if (empty($conf->cache['user'][$answerrecord->fk_user_creat])) {
5196 $tmpuser = new User($db);
5197 $tmpuser->fetch($answerrecord->fk_user_creat);
5198 $conf->cache['user'][$answerrecord->fk_user_creat] = $tmpuser;
5199 } else {
5200 $tmpuser = $conf->cache['user'][$answerrecord->fk_user_creat];
5201 }
5202 print $tmpuser->getNomUrl(-1, '', 0, 0, 0, 0, 'login');
5203 }
5204 print '</td>';
5205
5206 // Date creation
5207 print '<td class="center nowraponall">';
5208 print dol_print_date($answerrecord->date_creation, 'dayhour');
5209 print '</td>';
5210
5211 // Date last modification
5212 print '<td class="center nowraponall">';
5213 print dol_print_date($answerrecord->date_modification, 'dayhour');
5214 print '</td>';
5215
5216 // Edit properties, HTML sources, status
5217 print '<td class="tdwebsitesearchresult right nowraponall">';
5218 $disabled = '';
5219 $urltoedithtmlsource = $_SERVER["PHP_SELF"].'?action=editmeta&token='.newToken().'&websiteid='.$website->id.'&pageid='.$answerrecord->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].$param);
5220 if (!$user->hasRight('website', 'write')) {
5221 $disabled = ' disabled';
5222 $urltoedithtmlsource = '';
5223 }
5224 print '<a class="editfielda marginleftonly marginrightonly '.$disabled.'" href="'.$urltoedithtmlsource.'" title="'.$langs->trans("EditPageMeta").'">'.img_picto($langs->trans("EditPageMeta"), 'pencil-ruler').'</a>';
5225
5226 $disabled = '';
5227 $urltoedithtmlsource = $_SERVER["PHP_SELF"].'?action=editsource&token='.newToken().'&websiteid='.$website->id.'&pageid='.$answerrecord->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].$param);
5228 if (!$user->hasRight('website', 'write')) {
5229 $disabled = ' disabled';
5230 $urltoedithtmlsource = '';
5231 }
5232 print '<a class="editfielda marginleftonly marginrightonly '.$disabled.'" href="'.$urltoedithtmlsource.'" title="'.$langs->trans("EditHTMLSource").'">'.img_picto($langs->trans("EditHTMLSource"), 'edit').'</a>';
5233
5234 print '<span class="marginleftonly marginrightonly"></span>';
5235 print ajax_object_onoff($answerrecord, 'status', 'status', 'Enabled', 'Disabled', array(), 'valignmiddle inline-block');
5236
5237 print '</td>';
5238
5239 // Action column
5240 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5241 print '<td class="nowrap center">';
5242
5243 print '<!-- Status of page -->'."\n";
5244 if ($massactionbutton || $massaction) {
5245 $selected = 0;
5246 if (in_array($answerrecord->id, $arrayofselected)) {
5247 $selected = 1;
5248 }
5249 print '<input id="'.$answerrecord->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$answerrecord->id.'"'.($selected ? ' checked="checked"' : '').'>';
5250 }
5251 print '</td>';
5252 }
5253
5254 print '</tr>';
5255 } else {
5256 $param = '?mode=replacesite';
5257 $param .= '&websiteid='.$website->id;
5258 $param .= '&optioncontent='.GETPOST('optioncontent', 'aZ09');
5259 $param .= '&optionmeta='.GETPOST('optionmeta', 'aZ09');
5260 $param .= '&optionsitefiles='.GETPOST('optionsitefiles', 'aZ09');
5261 $param .= '&optioncontainertype='.GETPOST('optioncontainertype', 'aZ09');
5262 $param .= '&optionlanguage='.GETPOST('optionlanguage', 'aZ09');
5263 $param .= '&optioncategory='.GETPOST('optioncategory', 'aZ09');
5264 $param .= '&searchstring='.urlencode($searchkey);
5265
5266 print '<tr>';
5267
5268 // Action column
5269 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5270 print '<td class="nowrap center">';
5271 print '</td>';
5272 }
5273
5274 // Type of container
5275 print '<td>';
5276 $translateofrecordtype = array(
5277 'website_csscontent' => 'WEBSITE_CSS_INLINE',
5278 'website_jscontent' => 'WEBSITE_JS_INLINE',
5279 'website_robotcontent' => 'WEBSITE_ROBOT',
5280 'website_htmlheadercontent' => 'WEBSITE_HTML_HEADER',
5281 'website_htaccess' => 'WEBSITE_HTACCESS',
5282 'website_readme' => 'WEBSITE_README',
5283 'website_manifestjson' => 'WEBSITE_MANIFEST_JSON'
5284 );
5285 print '<span class="opacitymedium">';
5286 if (!empty($translateofrecordtype[$answerrecord['type']])) {
5287 print $langs->trans($translateofrecordtype[$answerrecord['type']]);
5288 } else {
5289 print $answerrecord['type'];
5290 }
5291 print '</span>';
5292 print '</td>';
5293
5294 // Container url and label
5295 print '<td>';
5296 $backtopageurl = $_SERVER["PHP_SELF"].$param;
5297 print '<a href="'.$_SERVER["PHP_SELF"].'?action=editcss&token='.newToken().'&website='.urlencode($website->ref).'&backtopage='.urlencode($backtopageurl).'">'.$langs->trans("EditCss").'</a>';
5298 print '</td>';
5299
5300 // Language
5301 print '<td>';
5302 print '</td>';
5303
5304 // Categories - Tags
5305 print '<td>';
5306 print '</td>';
5307
5308 // Nb of words
5309 print '<td>';
5310 print '</td>';
5311
5312 print '<td>';
5313 print '</td>';
5314
5315 print '<td>';
5316 print '</td>';
5317
5318 // Date last modification
5319 print '<td class="center nowraponall">';
5320 //print dol_print_date(filemtime());
5321 print '</td>';
5322
5323 // Edit properties, HTML sources, status
5324 print '<td>';
5325 print '</td>';
5326
5327 // Action column
5328 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5329 print '<td class="nowrap center">';
5330 print '</td>';
5331 }
5332
5333 print '</tr>';
5334 }
5335 }
5336
5337 if (count($listofpages['list']) >= 2) {
5338 // Total
5339 print '<tr class="lite_titre">';
5340
5341 // Action column
5342 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5343 print '<td class="nowrap center">';
5344 print '</td>';
5345 }
5346
5347 // Type of container
5348 print '<td>';
5349 print $langs->trans("Total");
5350 print '</td>';
5351
5352 // Container url and label
5353 print '<td>';
5354 print '</td>';
5355
5356 // Language
5357 print '<td>';
5358 print '</td>';
5359
5360 // Categories - Tags
5361 print '<td>';
5362 print '</td>';
5363
5364 // Nb of words
5365 print '<td class="center nowraponall">';
5366 print $totalnbwords.' '.$langs->trans("words");
5367 print '</td>';
5368
5369 print '<td>';
5370 print '</td>';
5371
5372 print '<td>';
5373 print '</td>';
5374
5375 // Date last modification
5376 print '<td>';
5377 print '</td>';
5378
5379 // Edit properties, HTML sources, status
5380 print '<td>';
5381 print '</td>';
5382
5383 // Action column
5384 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
5385 print '<td class="nowrap center">';
5386 print '</td>';
5387 }
5388
5389 print '</tr>';
5390 }
5391
5392 print '</table>';
5393 print '</div>';
5394 print '<br>';
5395 } else {
5396 print '<div class="warning">'.$listofpages['message'].'</div>';
5397 }
5398
5399 print '</div>';
5400 }
5401
5402 print '</form>';
5403}
5404
5405if ((empty($action) || $action == 'preview' || $action == 'createfromclone' || $action == 'createpagefromclone') && !in_array($mode, array('replacesite'))) {
5406 if ($pageid > 0 && $atleastonepage) {
5407 // $filejs
5408 // $filecss
5409 // $filephp
5410
5411 // Output page under the Dolibarr top menu
5412 $objectpage->fetch($pageid);
5413
5414 $jscontent = @file_get_contents($filejs);
5415
5416 $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";
5417
5418 // Include a html so we can benefit of the header of page.
5419 // Note: We can't use iframe as it can be used to include another external html file
5420 // Note: We can't use frame as it is deprecated.
5421 /*if ($includepageintoaframeoradiv == 'iframe')
5422 {
5423 $out .= "<iframe><body></html>";
5424 }*/
5425 $out .= "\n<html><head>\n";
5426 $out .= "<!-- htmlheader/style of page from database -->\n";
5427 $out .= dolWebsiteReplacementOfLinks($object, $objectpage->htmlheader, 1, 'htmlheader');
5428
5429 $out .= "<!-- htmlheader/style of website from files -->\n";
5430 // TODO Keep only the <link> or the <script> tags
5431 /*
5432 $htmlheadercontent = @file_get_contents($filehtmlheader);
5433 $dom = new DOMDocument;
5434 @$dom->loadHTML($htmlheadercontent);
5435 $styles = $dom->getElementsByTagName('link');
5436 $scripts = $dom->getElementsByTagName('script');
5437 foreach($styles as $stylescursor)
5438 {
5439 $out.=$stylescursor;
5440 }
5441 foreach($scripts as $scriptscursor)
5442 {
5443 $out.=$scriptscursor;
5444 }
5445 */
5446
5447 $out .= "</head>\n";
5448 $out .= "\n<body>";
5449
5450
5451 $out .= '<div id="websitecontentundertopmenu" class="websitecontentundertopmenu boostrap-iso">'."\n";
5452
5453 // REPLACEMENT OF LINKS When page called by website editor
5454
5455 $out .= '<!-- style of website from file -->'."\n";
5456 $out .= '<style scoped>'."\n"; // "scoped" means "apply to parent element only and not grand parent". No more supported by browsers, snif !
5457 $tmpout = '';
5458 $tmpout .= '/* Include website CSS file */'."\n";
5459 //$csscontent = @file_get_contents($filecss);
5460 ob_start();
5461 include $filecss;
5462 $csscontent = ob_get_contents();
5463 ob_end_clean();
5464 $tmpout .= dolWebsiteReplacementOfLinks($object, $csscontent, 1, 'css');
5465 $tmpout .= '/* Include style from the HTML header of page */'."\n";
5466 // Clean the html header of page to get only <style> content
5467 $tmp = preg_split('(<style[^>]*>|</style>)', $objectpage->htmlheader);
5468 $tmpstyleinheader = '';
5469 $i = 0;
5470 foreach ($tmp as $valtmp) {
5471 $i++;
5472 if ($i % 2 == 0) {
5473 $tmpstyleinheader .= $valtmp."\n";
5474 }
5475 }
5476 $tmpout .= $tmpstyleinheader."\n";
5477 // Clean style that may affect global style of Dolibarr
5478 $tmpout = preg_replace('/}[\s\n]*body\s*{[^}]+}/ims', '}', $tmpout);
5479 $out .= $tmpout;
5480 $out .= '</style>'."\n";
5481
5482 // Note: <div>, <section>, ... with contenteditable="true" inside this can be edited with inline ckeditor
5483
5484 // Do not enable the contenteditable when page was grabbed, ckeditor is removing span and adding borders,
5485 // so editable will be available only from container created from scratch
5486 //$out.='<div id="bodywebsite" class="bodywebsite"'.($objectpage->grabbed_from ? ' contenteditable="true"' : '').'>'."\n";
5487 $out .= '<div id="divbodywebsite" class="bodywebsite bodywebpage-'.$objectpage->ref.'">'."\n";
5488
5489 $newcontent = $objectpage->content;
5490
5491 // If mode WEBSITE_SUBCONTAINERSINLINE is on
5492 if (getDolGlobalString('WEBSITE_SUBCONTAINERSINLINE')) {
5493 // TODO Check file $filephp exists, if not create it.
5494
5495 //var_dump($filetpl);
5496 $filephp = $filetpl;
5497
5498 // Get session info and obfuscate session cookie
5499 $savsessionname = session_name();
5500 $savsessionid = $_COOKIE[$savsessionname];
5501 $_COOKIE[$savsessionname] = 'obfuscatedcookie';
5502
5503 ob_start();
5504 try {
5505 $res = include $filephp;
5506 if (empty($res)) {
5507 print "ERROR: Failed to include file '".$filephp."'. Try to edit and re-save page with this ID.";
5508 }
5509 } catch (Exception $e) {
5510 print $e->getMessage();
5511 }
5512 $newcontent = ob_get_contents();
5513 ob_end_clean();
5514
5515 // Restore data
5516 $_COOKIE[$savsessionname] = $savsessionid;
5517 }
5518
5519 // Change the contenteditable to "true" or "false" when mode Edit Inline is on or off
5520 if (!getDolGlobalString('WEBSITE_EDITINLINE')) {
5521 // Remove the contenteditable="true"
5522 $newcontent = preg_replace('/(div|section|header|main|footer)(\s[^>]*)contenteditable="true"/', '\1\2', $newcontent);
5523 } else {
5524 // Keep the contenteditable="true" when mode Edit Inline is on
5525 }
5526 $out .= dolWebsiteReplacementOfLinks($object, $newcontent, 0, 'html', $objectpage->id)."\n";
5527 //$out.=$newcontent;
5528
5529 $out .= '</div>';
5530
5531 $out .= '</div> <!-- End div id=websitecontentundertopmenu -->';
5532
5533 /*if ($includepageintoaframeoradiv == 'iframe')
5534 {
5535 $out .= "</body></html></iframe>";
5536 }*/
5537 $out .= "\n</body></html>\n";
5538
5539 $out .= "\n".'<!-- End page content '.$filetpl.' -->'."\n\n";
5540
5541 print $out;
5542
5543 /*file_put_contents($filetpl, $out);
5544 dolChmod($filetpl);
5545
5546 // Output file on browser
5547 dol_syslog("index.php include $filetpl $filename content-type=$type");
5548 $original_file_osencoded=dol_osencode($filetpl); // New file name encoded in OS encoding charset
5549
5550 // This test if file exists should be useless. We keep it to find bug more easily
5551 if (! file_exists($original_file_osencoded))
5552 {
5553 dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$original_file));
5554 exit;
5555 }
5556
5557 //include_once $original_file_osencoded;
5558 */
5559
5560 /*print '<iframe class="websiteiframenoborder centpercent" src="'.DOL_URL_ROOT.'/public/website/index.php?website='.$websitekey.'&pageid='.$pageid.'"/>';
5561 print '</iframe>';*/
5562 } else {
5563 if (empty($websitekey) || $websitekey == '-1') {
5564 print '<br><br><div class="center previewnotyetavailable"><span class="">'.$langs->trans("NoWebSiteCreateOneFirst").'</span></div><br><br><br>';
5565 print '<div class="center"><div class="logo_setup"></div></div>';
5566 } else {
5567 print '<br><br><div class="center previewnotyetavailable"><span class="">'.$langs->trans("PreviewOfSiteNotYetAvailable", $object->ref).'</span></div><br><br><br>';
5568 print '<div class="center"><div class="logo_setup"></div></div>';
5569 }
5570 }
5571}
5572
5573// End of page
5574llxFooter();
5575$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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.
Definition ajax.lib.php:456
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='')
On/off button to change a property status of an object This uses the ajax service objectonoff....
Definition ajax.lib.php:725
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage categories.
Class to manage a WYSIWYG editor.
Class to generate html code for admin pages.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new Form...
Class permettant la generation de composants html autre Only common components are here.
Class to manage component html for module website.
lessphp v0.8.0 http://leafo.net/lessphp
Class to manage Dolibarr users.
Class Website.
Class Websitepage.
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_add_file_process($upload_dir, $allowoverwrite=0, $updatesessionordb=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_is_file($pathoffile)
Return if path is a file.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
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.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
dolButtonToOpenExportDialog($name, $label, $buttonstring, $exportSiteName, $overwriteGitUrl, $website)
Create a dialog with two buttons for export and overwrite of a website.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
img_previous($titlealt='default', $moreatt='')
Show previous logo.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
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...
print_barre_liste($title, $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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_next($titlealt='default', $moreatt='')
Show next logo.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
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)
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.
a disabled
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:137
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:140
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.
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.
checkPHPCode(&$phpfullcodestringold, &$phpfullcodestring)
Check a new string containing only php code (including <php tag)
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.
dolStripPhpCode($str, $replacewith='')
Remove PHP code part from a string.
dolWebsiteReplacementOfLinks($website, $content, $removephppart=0, $contenttype='html', $containerid=0)
Convert a page content to have correct links (based on DOL_URL_ROOT) into an html content.
getPagesFromSearchCriterias($type, $algo, $searchstring, $max=25, $sortfield='date_creation', $sortorder='DESC', $langcode='', $otherfilters=[], $status=1)
Return list of containers object that match a criteria.
dolKeepOnlyPhpCode($str)
Keep only PHP code part from a HTML string page.