* Copyright (C) 2006-2013 Laurent Destailleur * Copyright (C) 2010 Regis Houssin * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2024 Frédéric France * Copyright (C) 2024-2025 MDW * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/public/demo/index.php * \ingroup core * \brief Entry page to access demo */ if (!defined('NOLOGIN')) { define('NOLOGIN', '1'); } if (!defined('NOBROWSERNOTIF')) { define('NOBROWSERNOTIF', 1); } if (!defined('NOIPCHECK')) { define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip } // Load Dolibarr environment require '../../main.inc.php'; require_once '../../core/lib/functions2.lib.php'; /** * @var Conf $conf * @var DoliDB $db * @var HookManager $hookmanager * @var Translate $langs */ $langs->loadLangs(array("main", "install", "other")); $conf->dol_hide_topmenu = GETPOSTINT('dol_hide_topmenu'); $conf->dol_hide_leftmenu = GETPOSTINT('dol_hide_leftmenu'); $conf->dol_optimize_smallscreen = GETPOSTINT('dol_optimize_smallscreen'); $conf->dol_no_mouse_hover = GETPOSTINT('dol_no_mouse_hover'); $conf->dol_use_jmobile = GETPOSTINT('dol_use_jmobile'); // Security check global $dolibarr_main_demo; if (empty($dolibarr_main_demo)) { httponly_accessforbidden('Parameter dolibarr_main_demo must be defined in conf file with value "default login,default pass" to enable the demo entry page'); } // Initialize a technical object to manage hooks of the page. // Note that conf->hooks_modules contains an array of hook contexats $res = $hookmanager->initHooks(array('demo')); $demoprofiles = array(); $alwayscheckedmodules = array(); $alwaysuncheckedmodules = array(); $alwayshiddencheckedmodules = array(); $alwayshiddenuncheckedmodules = array(); $url = ''; $url .= ($url ? '&' : '').($conf->dol_hide_topmenu ? 'dol_hide_topmenu='.$conf->dol_hide_topmenu : ''); $url .= ($url ? '&' : '').($conf->dol_hide_leftmenu ? 'dol_hide_leftmenu='.$conf->dol_hide_leftmenu : ''); $url .= ($url ? '&' : '').($conf->dol_optimize_smallscreen ? 'dol_optimize_smallscreen='.$conf->dol_optimize_smallscreen : ''); $url .= ($url ? '&' : '').($conf->dol_no_mouse_hover ? 'dol_no_mouse_hover='.$conf->dol_no_mouse_hover : ''); $url .= ($url ? '&' : '').($conf->dol_use_jmobile ? 'dol_use_jmobile='.$conf->dol_use_jmobile : ''); $url = DOL_URL_ROOT.'/index.php'.($url ? '?'.$url : ''); $tmpaction = 'view'; $parameters = array(); $object = new stdClass(); $reshook = $hookmanager->executeHooks('addDemoProfile', $parameters, $object, $tmpaction); // Note that $action and $object may have been modified by some hooks $error = $hookmanager->error; $errors = $hookmanager->errors; if (empty($reshook)) { $demoprofiles = array( array( 'default' => '1', 'key' => 'profdemoservonly', 'label' => 'DemoCompanyServiceOnly', 'disablemodules' => 'adherent,barcode,bom,cashdesk,don,expedition,externalsite,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,stock,takepos', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot8.png', 'icon' => DOL_URL_ROOT.'/public/demo/demo-profile-service.jpg', 'url' => $url, 'lang' => '', ), array( 'default' => '0', 'key' => 'profmanufacture', 'label' => 'DemoCompanyManufacturing', 'disablemodules' => 'adherent,contrat,don,externalsite,ficheinter,ftp,mailmanspip,prelevement,service', 'icon' => DOL_URL_ROOT.'/public/demo/demo-profile-manufacturing.jpg', 'url' => $url, 'lang' => '', ), array( 'default' => '0', 'key' => 'profdemoprodstock', 'label' => 'DemoCompanyProductAndStocks', 'disablemodules' => 'adherent,bom,contrat,don,externalsite,ficheinter,ftp,mailmanspip,mrp,prelevement,service', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot2.png', 'icon' => DOL_URL_ROOT.'/public/demo/demo-profile-product.jpg', 'url' => $url, 'lang' => '', ), array( 'default' => '0', 'key' => 'profdemofun2', 'label' => 'DemoFundation2', 'disablemodules' => 'barcode,cashdesk,bom,commande,commercial,compta,comptabilite,contrat,expedition,externalsite,ficheinter,ftp,incoterm,mailmanspip,margin,mrp,prelevement,product,productbatch,projet,propal,propale,service,societe,stock,tax,takepos', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot6.png', 'icon' => DOL_URL_ROOT.'/public/demo/demo-profile-foundation.jpg', 'url' => $url, 'lang' => '', ), // All demo profiles array( 'default' => '0', 'key' => 'profdemoall', 'label' => 'ChooseYourDemoProfilMore', 'disablemodules' => 'adherent,cashdesk,don,externalsite,mailmanspip', //'icon'=>DOL_URL_ROOT.'/public/demo/dolibarr_screenshot9.png' 'icon' => DOL_URL_ROOT.'/public/demo/demo-profile-all.jpg', 'lang' => '', ) ); // Visible $alwayscheckedmodules = array('barcode', 'bookmark', 'categorie', 'externalrss', 'fckeditor', 'geoipmaxmind', 'gravatar', 'memcached', 'syslog', 'user', 'webservices'); // Technical module we always want $alwaysuncheckedmodules = array('ai', 'dav', 'dynamicprices', 'incoterm', 'loan', 'multicurrency', 'paybox', 'paypal', 'stripe', 'google', 'printing', 'scanner', 'socialnetworks', 'webhook', 'webportal', 'website', 'zapier'); // Module we don't want by default // Not visible $alwayshiddencheckedmodules = array('accounting', 'api', 'barcode', 'blockedlog', 'bookmark', 'clicktodial', 'comptabilite', 'cron', 'document', 'domain', 'externalrss', 'externalsite', 'fckeditor', 'geoipmaxmind', 'gravatar', 'label', 'ldap', 'mailmanspip', 'notification', 'oauth', 'syslog', 'user', 'webservices', 'workflow', // Extended modules 'memcached', 'numberwords', 'zipautofillfr'); $alwayshiddenuncheckedmodules = array('cashdesk', 'collab', 'dav', 'debugbar', 'emailcollector', 'ftp', 'hrm', 'modulebuilder', 'printing', 'webservicesclient', 'zappier', // Extended modules 'awstats', 'bittorrent', 'bootstrap', 'cabinetmed', 'cmcic', 'concatpdf', 'customfield', 'datapolicy', 'deplacement', 'dolicloud', 'filemanager', 'lightbox', 'mantis', 'monitoring', 'moretemplates', 'multicompany', 'nltechno', 'numberingpack', 'openstreetmap', 'ovh', 'phenix', 'phpsysinfo', 'pibarcode', 'postnuke', 'dynamicprices', 'receiptprinter', 'selectbank', 'skincoloreditor', 'submiteverywhere', 'survey', 'thomsonphonebook', 'topten', 'tvacerfa', 'voyage', 'webcalendar', 'webmail'); } // Search modules $dirlist = $conf->file->dol_document_root; // Search modules dirs $modulesdir = dolGetModulesDirs(); $filename = array(); $modules = array(); $orders = array(); $categ = array(); $i = 0; // is a sequencer of modules found $j = 0; // j is module number. Automatically assigned if module number is not defined. $const_name = ''; foreach ($modulesdir as $dir) { // Charge tableaux modules, nom, numero, orders depuis repertoire dir $handle = @opendir($dir); if (is_resource($handle)) { while (($file = readdir($handle)) !== false) { //print "$i ".$file."\n
"; if (is_readable($dir.$file) && substr($file, 0, 3) == 'mod' && substr($file, dol_strlen($file) - 10) == '.class.php') { $modName = substr($file, 0, dol_strlen($file) - 10); if ($modName) { try { include_once $dir.$file; $objMod = new $modName($db); if ($objMod->numero > 0) { $j = $objMod->numero; } else { $j = 1000 + $i; } $modulequalified = 1; // We discard modules according to features level (PS: if module is activated we always show it) $const_name = 'MAIN_MODULE_'.strtoupper(preg_replace('/^mod/i', '', get_class($objMod))); if ($objMod->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2 && !getDolGlobalString($const_name)) { $modulequalified = 0; } if ($objMod->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1 && !getDolGlobalString($const_name)) { $modulequalified = 0; } if ($modulequalified) { $modules[$i] = $objMod; $filename[$i] = $modName; $orders[$i] = $objMod->family."_".$j; // Tri par famille puis numero module //print "x".$modName." ".$orders[$i]."\n
"; $j++; $i++; } } catch (Exception $e) { dol_syslog("Failed to load ".$dir.$file." ".$e->getMessage(), LOG_ERR); } } } } } } '@phan-var-force DolibarrModules[] $modules'; asort($orders); /* * Actions */ if (GETPOST('action', 'aZ09') == 'gotodemo') { // Action run when we click on "Start" after selection modules //print 'ee'.GETPOST("demochoice"); $disablestring = ''; // If we disable modules using a profile choice if (GETPOST("demochoice")) { foreach ($demoprofiles as $profilearray) { if ($profilearray['key'] == GETPOST("demochoice")) { $disablestring = $profilearray['disablemodules']; break; } } } // If we disable modules using personalized list foreach ($modules as $val) { $modulekeyname = strtolower($val->name); if (!GETPOST($modulekeyname) && empty($val->always_enabled) && !in_array($modulekeyname, $alwayscheckedmodules)) { $disablestring .= $modulekeyname.','; if ($modulekeyname == 'propale') { $disablestring .= 'propal,'; } } } // Do redirect to login page if ($disablestring) { if (GETPOST('urlfrom')) { $url .= (preg_match('/\?/', $url) ? '&' : '?').'urlfrom='.urlencode(GETPOST('urlfrom', 'alpha')); } $url .= (preg_match('/\?/', $url) ? '&' : '?').'disablemodules='.$disablestring; header("Location: ".$url); exit; } } /* * View */ $head = ''; $head .= ''."\n"; $head .= ''."\n"; $head .= ' '; llxHeaderVierge($langs->trans("DolibarrDemo"), $head); print "\n"; print '
'; print '
'; print ''; print '
'; print '
'; print '
'; print '
'; print '
'.$langs->trans("DemoDesc").'

'; print '
'.$langs->trans("ChooseYourDemoProfil").'
'; print '
'; print '
'; print '
'; print '
'; $i = 0; foreach ($demoprofiles as $profilearray) { if ($profilearray['default'] >= 0) { //print $profilearray['lang']; if (!empty($profilearray['lang'])) { $langs->load($profilearray['lang']); } $url = $_SERVER["PHP_SELF"].'?action=gotodemo'; $urlwithmod = $url.'&demochoice='.$profilearray['key']; // Should work with DOL_URL_ROOT='' or DOL_URL_ROOT='/dolibarr' //print "xx".$_SERVER["PHP_SELF"].' '.DOL_URL_ROOT.'
'; $urlfrom = preg_replace('/^'.preg_quote(DOL_URL_ROOT, '/').'/i', '', $_SERVER["PHP_SELF"]); //print $urlfrom; if (!empty($profilearray['url'])) { $urlwithmod = $profilearray['url']; $urlwithmod = $urlwithmod.(preg_match('/\?/', $urlwithmod) ? '&' : '?').'urlfrom='.urlencode($urlfrom); if (!empty($profilearray['disablemodules'])) { $urlwithmod = $urlwithmod.(preg_match('/\?/', $urlwithmod) ? '&' : '?').'disablemodules='.$profilearray['disablemodules']; } } if (empty($profilearray['url'])) { print '
'; } print '
'."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print '
'."\n"; print '
'; print ''; print '
'; print 'Demo '.$profilearray['label'].''; print '
'; print '
'; print $langs->trans($profilearray['label']); print '
'; print '
'; print '
'; // Modules (a profile to customize by selecting modules) if (empty($profilearray['url'])) { print ''; } print '
'; print '
'."\n"; $i++; } } print '
'; print '
'; // TODO Replace this with a hook // Google Adsense (need Google module) if (isModEnabled('google') && getDolGlobalString('MAIN_GOOGLE_AD_CLIENT') && getDolGlobalString('MAIN_GOOGLE_AD_SLOT')) { if (empty($conf->dol_use_jmobile)) { print '
'."\n"; print ''."\n"; print ''."\n"; print '
'."\n"; } else { print ''."\n"; } } llxFooterVierge(); $db->close(); /** * Show header for demo * * Note: also called by functions.lib:recordNotFound * * @param string $title Title * @param string $head Head array * @param int $disablejs More content into html header * @param int $disablehead More content into html header * @param string[]|string $arrayofjs Array of complementary js files * @param string[]|string $arrayofcss Array of complementary css files * @return void */ function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = [], $arrayofcss = []) // @phan-suppress-current-line PhanRedefineFunction { top_httphead(); top_htmlhead($head, $title, 0, 0, array(), array('public/demo/demo.css'), 0, 1); print '
'."\n"; } /** * Show footer for demo * * Note: also called by functions.lib:recordNotFound * * @return void */ function llxFooterVierge() // @phan-suppress-current-line PhanRedefineFunction { printCommonFooter('public'); print "\n"; print "
\n"; print "\n"; }