index.php 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046
  1. <?php
  2. /* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /**
  18. * \file htdocs/website/index.php
  19. * \ingroup website
  20. * \brief Page to website view/edit
  21. */
  22. define('NOSCANPOSTFORINJECTION',1);
  23. define('NOSTYLECHECK',1);
  24. /**
  25. * Show HTML header HTML + BODY + Top menu + left menu + DIV
  26. *
  27. * @param string $head Optionnal head lines
  28. * @param string $title HTML title
  29. * @param string $help_url Url links to help page
  30. * Syntax is: For a wiki page: EN:EnglishPage|FR:FrenchPage|ES:SpanishPage
  31. * For other external page: http://server/url
  32. * @param string $target Target to use on links
  33. * @param int $disablejs More content into html header
  34. * @param int $disablehead More content into html header
  35. * @param array $arrayofjs Array of complementary js files
  36. * @param array $arrayofcss Array of complementary css files
  37. * @param string $morequerystring Query string to add to the link "print" to get same parameters (use only if autodetect fails)
  38. * @return void
  39. */
  40. function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='')
  41. {
  42. global $conf;
  43. // html header
  44. top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss);
  45. // top menu and left menu area
  46. if (empty($conf->dol_hide_topmenu))
  47. {
  48. top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url);
  49. }
  50. if (empty($conf->dol_hide_leftmenu))
  51. {
  52. left_menu('', $help_url, '', '', 1, $title, 1);
  53. }
  54. // main area
  55. //main_area($title);
  56. }
  57. require '../main.inc.php';
  58. require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
  59. require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
  60. require_once DOL_DOCUMENT_ROOT.'/websites/class/website.class.php';
  61. require_once DOL_DOCUMENT_ROOT.'/websites/class/websitepage.class.php';
  62. $langs->load("admin");
  63. $langs->load("other");
  64. $langs->load("website");
  65. if (! $user->admin) accessforbidden();
  66. $conf->dol_hide_leftmenu = 1;
  67. $error=0;
  68. $website=GETPOST('website', 'alpha');
  69. $page=GETPOST('page', 'alpha');
  70. $pageid=GETPOST('pageid', 'int');
  71. $action=GETPOST('action','alpha');
  72. if (GETPOST('delete')) { $action='delete'; }
  73. if (GETPOST('preview')) $action='preview';
  74. if (GETPOST('create')) { $action='create'; }
  75. if (GETPOST('editmedia')) { $action='editmedia'; }
  76. if (GETPOST('editcss')) { $action='editcss'; }
  77. if (GETPOST('editmenu')) { $action='editmenu'; }
  78. if (GETPOST('setashome')) { $action='setashome'; }
  79. if (GETPOST('editmeta')) { $action='editmeta'; }
  80. if (GETPOST('editcontent')) { $action='editcontent'; }
  81. if (empty($action)) $action='preview';
  82. $object=new Website($db);
  83. $objectpage=new WebsitePage($db);
  84. $object->fetchAll(); // Init $object->records
  85. // If website not defined, we take first found
  86. if (empty($website))
  87. {
  88. foreach($object->records as $key => $valwebsite)
  89. {
  90. $website=$valwebsite->ref;
  91. break;
  92. }
  93. }
  94. if ($website)
  95. {
  96. $res = $object->fetch(0, $website);
  97. }
  98. if ($pageid < 0) $pageid = 0;
  99. if ($pageid > 0 && $action != 'add')
  100. {
  101. $res = $objectpage->fetch($pageid);
  102. }
  103. global $dolibarr_main_data_root;
  104. $pathofwebsite=$dolibarr_main_data_root.'/websites/'.$website;
  105. $filecss=$pathofwebsite.'/styles.css.php';
  106. $filetpl=$pathofwebsite.'/page'.$pageid.'.tpl.php';
  107. $fileindex=$pathofwebsite.'/index.php';
  108. // Define $urlwithroot
  109. $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
  110. $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
  111. //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
  112. /*
  113. * Actions
  114. */
  115. if (GETPOST('refreshsite')) $pageid=0; // If we change the site, we reset the pageid.
  116. // Add page
  117. if ($action == 'add')
  118. {
  119. $db->begin();
  120. $objectpage->fk_website = $object->id;
  121. $objectpage->title = GETPOST('WEBSITE_TITLE');
  122. $objectpage->pageurl = GETPOST('WEBSITE_PAGENAME');
  123. $objectpage->description = GETPOST('WEBSITE_DESCRIPTION');
  124. $objectpage->keywords = GETPOST('WEBSITE_KEYWORD');
  125. if (empty($objectpage->title))
  126. {
  127. setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WEBSITE_PAGENAME")), null, 'errors');
  128. $error++;
  129. }
  130. if (! $error)
  131. {
  132. $res = $objectpage->create($user);
  133. if ($res <= 0)
  134. {
  135. $error++;
  136. setEventMessages($objectpage->error, $objectpage->errors, 'errors');
  137. }
  138. }
  139. if (! $error)
  140. {
  141. $db->commit();
  142. setEventMessages($langs->trans("PageAdded", $objectpage->pageurl), null, 'mesgs');
  143. $action='';
  144. }
  145. else
  146. {
  147. $db->rollback();
  148. }
  149. $action = 'preview';
  150. $id = $objectpage->id;
  151. }
  152. // Update page
  153. if ($action == 'delete')
  154. {
  155. $db->begin();
  156. $res = $object->fetch(0, $website);
  157. $res = $objectpage->fetch($pageid, $object->fk_website);
  158. if ($res > 0)
  159. {
  160. $res = $objectpage->delete($user);
  161. if (! $res > 0)
  162. {
  163. $error++;
  164. setEventMessages($objectpage->error, $objectpage->errors, 'errors');
  165. }
  166. if (! $error)
  167. {
  168. $db->commit();
  169. setEventMessages($langs->trans("PageDeleted", $objectpage->pageurl, $website), null, 'mesgs');
  170. header("Location: ".$_SERVER["PHP_SELF"].'?website='.$website);
  171. exit;
  172. }
  173. else
  174. {
  175. $db->rollback();
  176. }
  177. }
  178. else
  179. {
  180. dol_print_error($db);
  181. }
  182. }
  183. // Update css
  184. if ($action == 'updatecss')
  185. {
  186. //$db->begin();
  187. $res = $object->fetch(0, $website);
  188. /*
  189. $res = $object->update($user);
  190. if ($res > 0)
  191. {
  192. $db->commit();
  193. $action='';
  194. }
  195. else
  196. {
  197. $error++;
  198. $db->rollback();
  199. }*/
  200. $csscontent = '<!-- START DOLIBARR-WEBSITE-ADDED-HEADER -->'."\n";
  201. $csscontent.= '<?php '."\n";
  202. $csscontent.= "header('Content-type: text/css');\n";
  203. $csscontent.= "?>"."\n";
  204. $csscontent.= '<!-- END -->'."\n";
  205. $csscontent.= GETPOST('WEBSITE_CSS_INLINE');
  206. dol_syslog("Save file css into ".$filecss);
  207. dol_mkdir($pathofwebsite);
  208. $result = file_put_contents($filecss, $csscontent);
  209. if (! empty($conf->global->MAIN_UMASK))
  210. @chmod($filecss, octdec($conf->global->MAIN_UMASK));
  211. if (! $result)
  212. {
  213. $error++;
  214. setEventMessages('Failed to write file '.$filecss, null, 'errors');
  215. }
  216. if (! $error)
  217. {
  218. setEventMessages($langs->trans("Saved"), null, 'mesgs');
  219. }
  220. $action='preview';
  221. }
  222. // Update page
  223. if ($action == 'setashome')
  224. {
  225. $db->begin();
  226. $object->fetch(0, $website);
  227. $object->fk_default_home = $pageid;
  228. $res = $object->update($user);
  229. if (! $res > 0)
  230. {
  231. $error++;
  232. setEventMessages($objectpage->error, $objectpage->errors, 'errors');
  233. }
  234. if (! $error)
  235. {
  236. $db->commit();
  237. // Generate the index.php page to be the home page
  238. //-------------------------------------------------
  239. dol_mkdir($pathofwebsite);
  240. dol_delete_file($fileindex);
  241. $indexcontent = '<?php'."\n";
  242. $indexcontent.= '// File generated to wrap the home page'."\n";
  243. $indexcontent.= "include_once './".basename($filetpl)."'\n";
  244. $indexcontent.= '?>'."\n";
  245. $result = file_put_contents($fileindex, $indexcontent);
  246. if (! empty($conf->global->MAIN_UMASK))
  247. @chmod($fileindex, octdec($conf->global->MAIN_UMASK));
  248. if ($result) setEventMessages($langs->trans("Saved"), null, 'mesgs');
  249. else setEventMessages('Failed to write file '.$fileindex, null, 'errors');
  250. $action='preview';
  251. }
  252. else
  253. {
  254. $db->rollback();
  255. }
  256. }
  257. // Update page (meta)
  258. if ($action == 'updatemeta')
  259. {
  260. $db->begin();
  261. $object->fetch(0, $website);
  262. $objectpage->fk_website = $object->id;
  263. $res = $objectpage->fetch($pageid, $object->fk_website);
  264. if ($res > 0)
  265. {
  266. $objectpage->old_object = clone $objectpage;
  267. $objectpage->pageurl = GETPOST('WEBSITE_PAGENAME');
  268. $objectpage->title = GETPOST('WEBSITE_TITLE');
  269. $objectpage->description = GETPOST('WEBSITE_DESCRIPTION');
  270. $objectpage->keywords = GETPOST('WEBSITE_KEYWORDS');
  271. $res = $objectpage->update($user);
  272. if (! $res > 0)
  273. {
  274. $error++;
  275. setEventMessages($objectpage->error, $objectpage->errors, 'errors');
  276. }
  277. if (! $error)
  278. {
  279. $db->commit();
  280. $filemaster=$pathofwebsite.'/master.inc.php';
  281. $fileoldalias=$pathofwebsite.'/'.$objectpage->old_object->pageurl.'.php';
  282. $filealias=$pathofwebsite.'/'.$objectpage->pageurl.'.php';
  283. dol_mkdir($pathofwebsite);
  284. // Now generate the master.inc.php page
  285. dol_syslog("We regenerate the master file");
  286. dol_delete_file($filemaster);
  287. $mastercontent = '<?php'."\n";
  288. $mastercontent.= '// File generated to link to the master file'."\n";
  289. $mastercontent.= "if (! defined('USEDOLIBARRSERVER')) require '".DOL_DOCUMENT_ROOT."/master.inc.php';\n";
  290. $mastercontent.= '?>'."\n";
  291. $result = file_put_contents($filemaster, $mastercontent);
  292. if (! empty($conf->global->MAIN_UMASK))
  293. @chmod($filemaster, octdec($conf->global->MAIN_UMASK));
  294. if (! $result) setEventMessages('Failed to write file '.$filemaster, null, 'errors');
  295. // Now generate the alias.php page
  296. if (! empty($fileoldalias))
  297. {
  298. dol_syslog("We regenerate alias page new name=".$filealias.", old name=".$fileoldalias);
  299. dol_delete_file($fileoldalias);
  300. }
  301. $aliascontent = '<?php'."\n";
  302. $aliascontent.= '// File generated to wrap the alias page'."\n";
  303. $aliascontent.= "include_once './page".$objectpage->id.".tpl.php';\n";
  304. $aliascontent.= '?>'."\n";
  305. $result = file_put_contents($filealias, $aliascontent);
  306. if (! empty($conf->global->MAIN_UMASK))
  307. @chmod($filealias, octdec($conf->global->MAIN_UMASK));
  308. if (! $result) setEventMessages('Failed to write file '.$filealias, null, 'errors');
  309. // Now create the .tpl file (duplicate code with actions updatecontent but we need this to save new header)
  310. dol_syslog("We regenerate the tpl page filetpl=".$filetpl);
  311. dol_delete_file($filetpl);
  312. $tplcontent ='';
  313. $tplcontent.= '<?php require "./master.inc.php"; ?>'."\n";
  314. $tplcontent.= '<html>'."\n";
  315. $tplcontent.= '<header>'."\n";
  316. $tplcontent.= '<meta http-equiv="content-type" content="text/html; charset=utf-8" />'."\n";
  317. $tplcontent.= '<meta name="robots" content="index, follow" />'."\n";
  318. $tplcontent.= '<meta name="viewport" content="width=device-width, initial-scale=0.8">'."\n";
  319. $tplcontent.= '<meta name="keywords" content="'.join(', ', explode(',',$objectpage->keywords)).'" />'."\n";
  320. $tplcontent.= '<meta name="title" content="'.dol_escape_htmltag($objectpage->title).'" />'."\n";
  321. $tplcontent.= '<meta name="description" content="'.dol_escape_htmltag($objectpage->description).'" />'."\n";
  322. $tplcontent.= '<meta name="generator" content="'.DOL_APPLICATION_TITLE.'" />'."\n";
  323. $tplcontent.= '<link rel="stylesheet" href="styles.css.php?website='.$website.'" type="text/css" />'."\n";
  324. $tplcontent.= '<title>'.dol_escape_htmltag($objectpage->title).'</title>'."\n";
  325. $tplcontent.= '</header>'."\n";
  326. $tplcontent.= '<body>'."\n";
  327. $tplcontent.= $objectpage->content."\n";
  328. $tplcontent.= '</body>'."\n";
  329. //var_dump($filetpl);exit;
  330. $result = file_put_contents($filetpl, $tplcontent);
  331. if (! empty($conf->global->MAIN_UMASK))
  332. @chmod($filetpl, octdec($conf->global->MAIN_UMASK));
  333. if ($result)
  334. {
  335. setEventMessages($langs->trans("Saved"), null, 'mesgs');
  336. //header("Location: ".$_SERVER["PHP_SELF"].'?website='.$website.'&pageid='.$pageid);
  337. //exit;
  338. }
  339. else setEventMessages('Failed to write file '.$filetpl, null, 'errors');
  340. $action='preview';
  341. }
  342. else
  343. {
  344. $db->rollback();
  345. }
  346. }
  347. else
  348. {
  349. dol_print_error($db, 'Page not found');
  350. }
  351. }
  352. // Update page
  353. if ($action == 'updatecontent')
  354. {
  355. $db->begin();
  356. $object->fetch(0, $website);
  357. $objectpage->fk_website = $object->id;
  358. $res = $objectpage->fetch($pageid, $object->fk_website);
  359. if ($res > 0)
  360. {
  361. $objectpage->content = GETPOST('PAGE_CONTENT');
  362. // Clean data. We remove all the head section.
  363. $objectpage->content = preg_replace('/<head.*<\/head>/s', '', $objectpage->content);
  364. /* $objectpage->content = preg_replace('/<base\s+href=[\'"][^\'"]+[\'"]\s/?>/s', '', $objectpage->content); */
  365. $res = $objectpage->update($user);
  366. if ($res < 0)
  367. {
  368. $error++;
  369. setEventMessages($objectpage->error, $objectpage->errors, 'errors');
  370. }
  371. if (! $error)
  372. {
  373. $db->commit();
  374. $filemaster=$pathofwebsite.'/master.inc.php';
  375. //$fileoldalias=$pathofwebsite.'/'.$objectpage->old_object->pageurl.'.php';
  376. $filealias=$pathofwebsite.'/'.$objectpage->pageurl.'.php';
  377. dol_mkdir($pathofwebsite);
  378. // Now generate the master.inc.php page
  379. dol_syslog("We regenerate the master file");
  380. dol_delete_file($filemaster);
  381. $mastercontent = '<?php'."\n";
  382. $mastercontent.= '// File generated to link to the master file'."\n";
  383. $mastercontent.= "if (! defined('USEDOLIBARRSERVER')) require '".DOL_DOCUMENT_ROOT."/master.inc.php';\n";
  384. $mastercontent.= '?>'."\n";
  385. $result = file_put_contents($filemaster, $mastercontent);
  386. if (! empty($conf->global->MAIN_UMASK))
  387. @chmod($filemaster, octdec($conf->global->MAIN_UMASK));
  388. if (! $result) setEventMessages('Failed to write file '.$filemaster, null, 'errors');
  389. // Now generate the alias.php page
  390. if (! empty($fileoldalias))
  391. {
  392. dol_syslog("We regenerate alias page new name=".$filealias.", old name=".$fileoldalias);
  393. dol_delete_file($fileoldalias);
  394. }
  395. $aliascontent = '<?php'."\n";
  396. $aliascontent.= '// File generated to wrap the alias page'."\n";
  397. $aliascontent.= "include_once './page".$objectpage->id.".tpl.php';\n";
  398. $aliascontent.= '?>'."\n";
  399. $result = file_put_contents($filealias, $aliascontent);
  400. if (! empty($conf->global->MAIN_UMASK))
  401. @chmod($filealias, octdec($conf->global->MAIN_UMASK));
  402. if (! $result) setEventMessages('Failed to write file '.$filealias, null, 'errors');
  403. // Now create the .tpl file
  404. // TODO Keep a one time generate file or include a dynamicaly generated content ?
  405. dol_delete_file($filetpl);
  406. $tplcontent ='';
  407. $tplcontent.= "<?php if (! defined('USEDOLIBARRSERVER')) require './master.inc.php'; ?>"."\n";
  408. $tplcontent.= '<html>'."\n";
  409. $tplcontent.= '<header>'."\n";
  410. $tplcontent.= '<meta http-equiv="content-type" content="text/html; charset=utf-8" />'."\n";
  411. $tplcontent.= '<meta name="robots" content="index, follow" />'."\n";
  412. $tplcontent.= '<meta name="viewport" content="width=device-width, initial-scale=0.8">'."\n";
  413. $tplcontent.= '<meta name="keywords" content="'.join(', ', explode(',',$objectpage->keywords)).'" />'."\n";
  414. $tplcontent.= '<meta name="title" content="'.dol_escape_htmltag($objectpage->title).'" />'."\n";
  415. $tplcontent.= '<meta name="description" content="'.dol_escape_htmltag($objectpage->description).'" />'."\n";
  416. $tplcontent.= '<meta name="generator" content="'.DOL_APPLICATION_TITLE.'" />'."\n";
  417. $tplcontent.= '<link rel="stylesheet" href="styles.css.php?website='.$website.'" type="text/css" />'."\n";
  418. $tplcontent.= '<title>'.dol_escape_htmltag($objectpage->title).'</title>'."\n";
  419. $tplcontent.= '</header>'."\n";
  420. $tplcontent.= '<body>'."\n";
  421. $tplcontent.= $objectpage->content."\n";
  422. $tplcontent.= '</body>'."\n";
  423. //var_dump($filetpl);exit;
  424. $result = file_put_contents($filetpl, $tplcontent);
  425. if (! empty($conf->global->MAIN_UMASK))
  426. @chmod($filetpl, octdec($conf->global->MAIN_UMASK));
  427. if ($result)
  428. {
  429. setEventMessages($langs->trans("Saved"), null, 'mesgs');
  430. header("Location: ".$_SERVER["PHP_SELF"].'?website='.$website.'&pageid='.$pageid);
  431. exit;
  432. }
  433. else setEventMessages('Failed to write file '.$filetpl, null, 'errors');
  434. }
  435. else
  436. {
  437. $db->rollback();
  438. }
  439. }
  440. else
  441. {
  442. dol_print_error($db, 'Page not found');
  443. }
  444. }
  445. /*
  446. * View
  447. */
  448. $form = new Form($db);
  449. $help_url='';
  450. llxHeader('', $langs->trans("WebsiteSetup"), $help_url);
  451. print "\n".'<form action="'.$_SERVER["PHP_SELF"].'" method="POST"><div>';
  452. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  453. if ($action == 'create')
  454. {
  455. print '<input type="hidden" name="action" value="add">';
  456. }
  457. if ($action == 'editcss')
  458. {
  459. print '<input type="hidden" name="action" value="updatecss">';
  460. }
  461. if ($action == 'editmenu')
  462. {
  463. print '<input type="hidden" name="action" value="updatemenu">';
  464. }
  465. if ($action == 'setashome')
  466. {
  467. print '<input type="hidden" name="action" value="updateashome">';
  468. }
  469. if ($action == 'editmeta')
  470. {
  471. print '<input type="hidden" name="action" value="updatemeta">';
  472. }
  473. if ($action == 'editcontent')
  474. {
  475. print '<input type="hidden" name="action" value="updatecontent">';
  476. }
  477. if ($action == 'edit')
  478. {
  479. print '<input type="hidden" name="action" value="update">';
  480. }
  481. // Add a margin under toolbar ?
  482. $style='';
  483. if ($action != 'preview' && $action != 'editcontent') $style=' margin-bottom: 5px;';
  484. print '<div class="centpercent websitebar">';
  485. if (count($object->records) > 0)
  486. {
  487. // ***** Part for web sites
  488. print '<div class="websiteselection">';
  489. print $langs->trans("Website").': ';
  490. print '</div>';
  491. // List of websites
  492. print '<div class="websiteselection">';
  493. $out='';
  494. $out.='<select name="website">';
  495. if (empty($object->records)) $out.='<option value="-1">&nbsp;</option>';
  496. // Loop on each sites
  497. $i=0;
  498. foreach($object->records as $key => $valwebsite)
  499. {
  500. if (empty($website)) $website=$valwebsite->ref;
  501. $out.='<option value="'.$valwebsite->ref.'"';
  502. if ($website == $valwebsite->ref) $out.=' selected'; // To preselect a value
  503. $out.='>';
  504. $out.=$valwebsite->ref;
  505. $out.='</option>';
  506. $i++;
  507. }
  508. $out.='</select>';
  509. print $out;
  510. print '<input type="submit" class="button" name="refreshsite" value="'.$langs->trans("Load").'">';
  511. if ($website)
  512. {
  513. $realurl=$urlwithroot.'/public/websites/index.php?website='.$website;
  514. $dataroot=DOL_DATA_ROOT.'/websites/'.$website;
  515. if (! empty($object->virtualhost)) $realurl=$object->virtualhost;
  516. }
  517. if ($website && $action == 'preview')
  518. {
  519. $disabled='';
  520. if (empty($user->rights->websites->write)) $disabled=' disabled="disabled"';
  521. print ' &nbsp; ';
  522. //print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("MediaFiles")).'" name="editmedia">';
  523. print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("EditCss")).'" name="editcss">';
  524. print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("EditMenu")).'" name="editmenu">';
  525. print '<input type="submit"'.$disabled.' class="button" value="'.dol_escape_htmltag($langs->trans("AddPage")).'" name="create">';
  526. }
  527. print '</div>';
  528. // Button for websites
  529. print '<div class="websitetools">';
  530. if ($action == 'preview')
  531. {
  532. print '<div class="websiteinputurl">';
  533. print '<input type="text" id="previewsiteurl" class="minwidth200imp" name="previewsite" value="'.$realurl.'">';
  534. //print '<input type="submit" class="button" name="previewwebsite" target="tab'.$website.'" value="'.$langs->trans("ViewSiteInNewTab").'">';
  535. $htmltext=$langs->trans("SetHereVirtualHost", $dataroot);
  536. print $form->textwithpicto('', $htmltext);
  537. print '</div>';
  538. $urlext=$realurl;
  539. $urlint=DOL_URL_ROOT.'/public/websites/index.php?website='.$website;
  540. print '<a class="websitebuttonsitepreview" id="previewsiteext" href="'.$urlext.'" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByWebServer")).'">';
  541. print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $urlext), 1, 'preview_ext');
  542. print '</a>';
  543. print '<a class="websitebuttonsitepreview" id="previewsite" href="'.DOL_URL_ROOT.'/public/websites/index.php?website='.$website.'" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByDolibarr")).'">';
  544. print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $urlint), 1, 'preview');
  545. print '</a>';
  546. }
  547. if (in_array($action, array('editcss','editmenu','create')))
  548. {
  549. if ($action != 'preview') print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" name="preview">';
  550. if (preg_match('/^create/',$action)) print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
  551. if (preg_match('/^edit/',$action)) print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
  552. }
  553. print '</div>';
  554. // ***** Part for pages
  555. if ($website)
  556. {
  557. print '</div>';
  558. $array=$objectpage->fetchAll($object->id);
  559. if (! is_array($array) && $array < 0) dol_print_error('', $objectpage->error, $objectpage->errors);
  560. $atleastonepage=(is_array($array) && count($array) > 0);
  561. print '<div class="centpercent websitebar"'.($style?' style="'.$style.'"':'').'">';
  562. print '<div class="websiteselection">';
  563. print $langs->trans("Page").': ';
  564. print '</div>';
  565. print '<div class="websiteselection">';
  566. if ($action != 'add')
  567. {
  568. $out='';
  569. $out.='<select name="pageid">';
  570. if ($atleastonepage)
  571. {
  572. if (empty($pageid) && $action != 'create') // Page id is not defined, we try to take one
  573. {
  574. $firstpageid=0;$homepageid=0;
  575. foreach($array as $key => $valpage)
  576. {
  577. if (empty($firstpageid)) $firstpageid=$valpage->id;
  578. if ($object->fk_default_home && $key == $object->fk_default_home) $homepageid=$valpage->id;
  579. }
  580. $pageid=$homepageid?$homepageid:$firstpageid; // We choose home page and if not defined yet, we take first page
  581. }
  582. foreach($array as $key => $valpage)
  583. {
  584. $out.='<option value="'.$key.'"';
  585. if ($pageid > 0 && $pageid == $key) $out.=' selected'; // To preselect a value
  586. $out.='>';
  587. $out.=$valpage->title;
  588. if ($object->fk_default_home && $key == $object->fk_default_home) $out.=' ('.$langs->trans("HomePage").')';
  589. $out.='</option>';
  590. }
  591. }
  592. else $out.='<option value="-1">&nbsp;</option>';
  593. $out.='</select>';
  594. print $out;
  595. }
  596. else
  597. {
  598. print $langs->trans("New");
  599. }
  600. print '<input type="submit" class="button" name="refreshpage" value="'.$langs->trans("Load").'"'.($atleastonepage?'':' disabled="disabled"').'>';
  601. //print $form->selectarray('page', $array);
  602. if ($action == 'preview')
  603. {
  604. $disabled='';
  605. if (empty($user->rights->websites->write)) $disabled=' disabled="disabled"';
  606. if ($pageid > 0)
  607. {
  608. print ' &nbsp; ';
  609. if ($object->fk_default_home > 0 && $pageid == $object->fk_default_home) print '<input type="submit" class="button" disabled="disabled" value="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'" name="setashome">';
  610. else print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("SetAsHomePage")).'" name="setashome">';
  611. print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("EditPageMeta")).'" name="editmeta">';
  612. print '<input type="submit" class="button"'.$disabled.' value="'.dol_escape_htmltag($langs->trans("EditPageContent")).'" name="editcontent">';
  613. //print '<a href="'.$_SERVER["PHP_SELF"].'?action=editmeta&website='.urlencode($website).'&pageid='.urlencode($pageid).'" class="button">'.dol_escape_htmltag($langs->trans("EditPageMeta")).'</a>';
  614. //print '<a href="'.$_SERVER["PHP_SELF"].'?action=editcontent&website='.urlencode($website).'&pageid='.urlencode($pageid).'" class="button">'.dol_escape_htmltag($langs->trans("EditPageContent")).'</a>';
  615. print '<input type="submit" class="buttonDelete" name="delete" value="'.$langs->trans("Delete").'"'.($atleastonepage?'':' disabled="disabled"').'>';
  616. }
  617. }
  618. print '</div>';
  619. print '<div class="websiteselection">';
  620. print '</div>';
  621. print '<div class="websitetools">';
  622. if ($website && $pageid > 0 && $action == 'preview')
  623. {
  624. $websitepage = new WebSitePage($db);
  625. $websitepage->fetch($pageid);
  626. $realpage=$urlwithroot.'/public/websites/index.php?website='.$website.'&page='.$pageid;
  627. $pagealias = $websitepage->pageurl;
  628. print '<div class="websiteinputurl">';
  629. print '<input type="text" id="previewpageurl" class="minwidth200imp" name="previewsite" value="'.$pagealias.'" disabled="disabled">';
  630. //print '<input type="submit" class="button" name="previewwebsite" target="tab'.$website.'" value="'.$langs->trans("ViewSiteInNewTab").'">';
  631. $htmltext=$langs->trans("WEBSITE_PAGENAME", $pagealias);
  632. print $form->textwithpicto('', $htmltext);
  633. print '</div>';
  634. $urlext=$realurl.'/'.$pagealias.'.php';
  635. print '<a class="websitebuttonsitepreview" id="previewpageext" href="'.$urlext.'" target="tab'.$website.'" alt="'.dol_escape_htmltag($langs->trans("PreviewSiteServedByWebServer")).'">';
  636. print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $urlext), 1, 'preview_ext');
  637. print '</a>';
  638. print '<a class="websitebuttonsitepreview" id="previewpage" href="'.$realpage.'&nocache='.dol_now().'" class="button" target="tab'.$website.'">';
  639. print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage), 1, 'preview');
  640. print '</a>'; // View page in new Tab
  641. //print '<input type="submit" class="button" name="previewpage" target="tab'.$website.'"value="'.$langs->trans("ViewPageInNewTab").'">';
  642. // TODO Add js to save alias like we save virtual host name and use dynamic virtual host for url of id=previewpageext
  643. }
  644. if (! in_array($action, array('editcss','editmenu','create')))
  645. {
  646. if ($action != 'preview') print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Cancel")).'" name="preview">';
  647. if (preg_match('/^create/',$action)) print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
  648. if (preg_match('/^edit/',$action)) print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Save")).'" name="update">';
  649. }
  650. print '</div>';
  651. if ($action == 'preview')
  652. {
  653. // Adding jquery code to change on the fly url of preview ext
  654. if (! empty($conf->use_javascript_ajax))
  655. {
  656. print '<script type="text/javascript" language="javascript">
  657. jQuery(document).ready(function() {
  658. jQuery("#previewsiteext,#previewpageext").click(function() {
  659. newurl=jQuery("#previewsiteurl").val();
  660. newpage=jQuery("#previewsiteurl").val() + "/" + jQuery("#previewpageurl").val() + ".php";
  661. console.log("Open url "+newurl);
  662. /* Save url */
  663. jQuery.ajax({
  664. method: "POST",
  665. url: "'.DOL_URL_ROOT.'/core/ajax/saveinplace.php",
  666. data: {
  667. field: \'editval_virtualhost\',
  668. element: \'websites\',
  669. table_element: \'website\',
  670. fk_element: '.$object->id.',
  671. value: newurl,
  672. },
  673. context: document.body
  674. });
  675. jQuery("#previewsiteext").attr("href",newurl);
  676. jQuery("#previewpageext").attr("href",newpage);
  677. });
  678. });
  679. </script>';
  680. }
  681. }
  682. }
  683. }
  684. else
  685. {
  686. print '<div class="websiteselection">';
  687. $langs->load("errors");
  688. print $langs->trans("ErrorModuleSetupNotComplete");
  689. print '<div>';
  690. $action='';
  691. }
  692. print '</div>';
  693. $head = array();
  694. /*
  695. * Edit mode
  696. */
  697. if ($action == 'editcss')
  698. {
  699. print '<div class="fiche">';
  700. print '<br>';
  701. $csscontent = @file_get_contents($filecss);
  702. // Clean php css file to get only css part
  703. $csscontent = preg_replace('/<!-- START DOLIBARR.*END -->/s', '', $csscontent);
  704. dol_fiche_head();
  705. print '<!-- Edit CSS -->'."\n";
  706. print '<table class="border" width="100%">';
  707. print '<tr><td class="titlefieldcreate">';
  708. print $langs->trans('WebSite');
  709. print '</td><td>';
  710. print $website;
  711. print '</td></tr>';
  712. print '<tr><td class="tdtop">';
  713. print $langs->trans('WEBSITE_CSS_INLINE');
  714. print '</td><td>';
  715. print '<textarea class="flat centpercent" rows="32" name="WEBSITE_CSS_INLINE">';
  716. print $csscontent;
  717. print '</textarea>';
  718. print '</td></tr>';
  719. /*print '<tr><td>';
  720. print $langs->trans('WEBSITE_CSS_URL');
  721. print '</td><td>';
  722. print '<input type="text" class="flat" size="96" name="WEBSITE_CSS_URL" value="'.dol_escape_htmltag($obj->WEBSITE_CSS_URL).'">';
  723. print '</td></tr>';*/
  724. print '</table>';
  725. dol_fiche_end();
  726. print '</div>';
  727. print '<br>';
  728. }
  729. if ($action == 'editmeta' || $action == 'create')
  730. {
  731. print '<div class="fiche">';
  732. print '<br>';
  733. dol_fiche_head();
  734. print '<!-- Edit Meta -->'."\n";
  735. print '<table class="border" width="100%">';
  736. if ($action != 'create')
  737. {
  738. print '<tr><td>';
  739. print $langs->trans('WEBSITE_PAGEURL');
  740. print '</td><td>';
  741. print '/public/websites/index.php?website='.urlencode($website).'&pageid='.urlencode($pageid);
  742. print '</td></tr>';
  743. $pageurl=dol_escape_htmltag($objectpage->pageurl);
  744. $pagetitle=dol_escape_htmltag($objectpage->title);
  745. $pagedescription=dol_escape_htmltag($objectpage->description);
  746. $pagekeywords=dol_escape_htmltag($objectpage->keywords);
  747. }
  748. if (GETPOST('WEBSITE_PAGENAME')) $pageurl=GETPOST('WEBSITE_PAGENAME');
  749. if (GETPOST('WEBSITE_TITLE')) $pagetitle=GETPOST('WEBSITE_TITLE');
  750. if (GETPOST('WEBSITE_DESCRIPTION')) $pagedescription=GETPOST('WEBSITE_DESCRIPTION');
  751. if (GETPOST('WEBSITE_KEYWORDS')) $pagekeywords=GETPOST('WEBSITE_KEYWORDS');
  752. print '<tr><td class="titlefieldcreate">';
  753. print $langs->trans('WEBSITE_PAGENAME');
  754. print '</td><td>';
  755. print '<input type="text" class="flat" size="96" name="WEBSITE_PAGENAME" value="'.$pageurl.'">';
  756. print '</td></tr>';
  757. print '<tr><td>';
  758. print $langs->trans('WEBSITE_TITLE');
  759. print '</td><td>';
  760. print '<input type="text" class="flat" size="96" name="WEBSITE_TITLE" value="'.$pagetitle.'">';
  761. print '</td></tr>';
  762. print '<tr><td>';
  763. print $langs->trans('WEBSITE_DESCRIPTION');
  764. print '</td><td>';
  765. print '<input type="text" class="flat" size="96" name="WEBSITE_DESCRIPTION" value="'.$pagedescription.'">';
  766. print '</td></tr>';
  767. print '<tr><td>';
  768. print $langs->trans('WEBSITE_KEYWORDS');
  769. print '</td><td>';
  770. print '<input type="text" class="flat" size="128" name="WEBSITE_KEYWORDS" value="'.$pagekeywords.'">';
  771. print '</td></tr>';
  772. print '</table>';
  773. dol_fiche_end();
  774. print '</div>';
  775. print '<br>';
  776. }
  777. if ($action == 'editmedia')
  778. {
  779. print '<!-- Edit Media -->'."\n";
  780. print '<div class="center">'.$langs->trans("FeatureNotYetAvailable").'</center>';
  781. }
  782. if ($action == 'editmenu')
  783. {
  784. print '<!-- Edit Menu -->'."\n";
  785. print '<div class="center">'.$langs->trans("FeatureNotYetAvailable").'</center>';
  786. }
  787. if ($action == 'editcontent')
  788. {
  789. /*
  790. * Editing global variables not related to a specific theme
  791. */
  792. $csscontent = @file_get_contents($filecss);
  793. $contentforedit = '';
  794. /*$contentforedit.='<style scoped>'."\n"; // "scoped" means "apply to parent element only". Not yet supported by browsers
  795. $contentforedit.=$csscontent;
  796. $contentforedit.='</style>'."\n";*/
  797. $contentforedit .= $objectpage->content;
  798. require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
  799. $doleditor=new DolEditor('PAGE_CONTENT',$contentforedit,'',500,'Full','',true,true,true,ROWS_5,'90%');
  800. $doleditor->Create(0, '', false);
  801. }
  802. print "</div>\n</form>\n";
  803. if ($action == 'preview')
  804. {
  805. if ($pageid > 0)
  806. {
  807. $objectpage->fetch($pageid);
  808. print "\n".'<!-- Page content '.$filetpl.' : Div with (CSS + Page content from database) -->'."\n";
  809. $csscontent = @file_get_contents($filecss);
  810. $out='';
  811. $out.='<div id="websitecontent" class="websitecontent">'."\n";
  812. $out.='<style scoped>'."\n"; // "scoped" means "apply to parent element only". Not yet supported by browsers
  813. $out.=$csscontent;
  814. $out.='</style>'."\n";
  815. $out.=$objectpage->content."\n";
  816. $out.='</div>';
  817. print $out;
  818. /*file_put_contents($filetpl, $out);
  819. if (! empty($conf->global->MAIN_UMASK))
  820. @chmod($filetpl, octdec($conf->global->MAIN_UMASK));
  821. // Output file on browser
  822. dol_syslog("index.php include $filetpl $filename content-type=$type");
  823. $original_file_osencoded=dol_osencode($filetpl); // New file name encoded in OS encoding charset
  824. // This test if file exists should be useless. We keep it to find bug more easily
  825. if (! file_exists($original_file_osencoded))
  826. {
  827. dol_print_error(0,$langs->trans("ErrorFileDoesNotExists",$original_file));
  828. exit;
  829. }
  830. //include_once $original_file_osencoded;
  831. */
  832. /*print '<iframe class="websiteiframenoborder centpercent" src="'.DOL_URL_ROOT.'/public/websites/index.php?website='.$website.'&pageid='.$pageid.'"/>';
  833. print '</iframe>';*/
  834. }
  835. else
  836. {
  837. print '<br><br><div class="center">'.$langs->trans("PreviewOfSiteNotYetAvailable", $website).'</center><br><br><br>';
  838. print '<div class="center"><div class="logo_setup"></div></div>';
  839. }
  840. }
  841. llxFooter();
  842. $db->close();