aboutsummaryrefslogtreecommitdiff
path: root/Application/Controllers/BaseController.php
diff options
context:
space:
mode:
authorYuchen Pei <hi@ypei.me>2021-10-15 09:52:00 +1100
committerYuchen Pei <hi@ypei.me>2021-10-15 09:52:00 +1100
commit71b0e901f5fb1cfcd162d8acc23120d3f77a3152 (patch)
tree323c00faef1edc7dea2e88ff581cc2258b2b6432 /Application/Controllers/BaseController.php
parent72cce24864b064b5762f4fe97fdf40d8d2ad4b51 (diff)
parent07f5140771388c9e0c8a99b0dd2e5d950bdb173b (diff)
Merge branch 'development' into h-node
Diffstat (limited to 'Application/Controllers/BaseController.php')
-rw-r--r--Application/Controllers/BaseController.php303
1 files changed, 303 insertions, 0 deletions
diff --git a/Application/Controllers/BaseController.php b/Application/Controllers/BaseController.php
new file mode 100644
index 0000000..ac2be1f
--- /dev/null
+++ b/Application/Controllers/BaseController.php
@@ -0,0 +1,303 @@
+<?php
+
+// h-source, a web software to build a community of people that want to share their hardware information.
+// Copyright (C) 2010 Antonio Gallo (h-source-copyright.txt)
+//
+// This file is part of h-source
+//
+// h-source 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.
+//
+// h-source 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 h-source. If not, see <http://www.gnu.org/licenses/>.
+
+if (!defined('EG')) die('Direct access not allowed!');
+
+class BaseController extends Controller
+{
+
+ protected $lang;
+ protected $islogged = 'no';
+ protected $ismoderator = false;
+ protected $isadmin = false;
+ protected $querySanitized = true;
+ protected $token = 'token';
+ protected $_updating = 'no';
+
+ protected $_configXml = null;
+
+ protected $_topMenuClasses = array(
+ "home" => null,
+ "hardware" => null,
+ "credits" => null,
+ "issues" => null,
+ "contact" => null,
+ "search" => null,
+ "news" => null,
+ "download" => null,
+ "help" => null,
+ "wiki" => null,
+ "faq" => null,
+ "project" => null,
+ );
+
+ public function __construct($model, $controller, $queryString) {
+ parent::__construct($model, $controller, $queryString);
+
+ header("Cache-Control: no-cache");
+
+ $this->model('BoxesModel');
+ $this->model('HistoryModel');
+ $this->model('ParamsModel');
+ $this->model('UsersModel');
+
+ $this->load('header');
+ $this->load('footer','last');
+
+ $this->session('registered');
+ $this->s['registered']->checkStatus();
+
+ $data['username'] = null;
+ $data['user_groups'] = null;
+ $data['islogged'] = 'no';
+ $data['token'] = 'token';
+ $data['ismoderator'] = false;
+ $data['isadmin'] = false;
+
+ if ($this->s['registered']->status['status'] === 'logged')
+ {
+ $data['username'] = $this->s['registered']->status['user'];
+ $groups = $this->s['registered']->status['groups'];
+ $groups[] = 'registered';
+ $data['user_groups'] = implode(',',$groups);
+
+ $data['islogged'] = 'yes';
+ $this->islogged = $data['islogged'];
+
+ $data['token'] = $this->s['registered']->status['token'];
+ $this->token = $data['token'];
+
+ $data['ismoderator'] = in_array('moderator',$this->s['registered']->status['groups']) ? true : false;
+ $this->ismoderator = $data['ismoderator'];
+
+ $data['isadmin'] = in_array('admin',$this->s['registered']->status['groups']) ? true : false;
+ $this->isadmin = $data['isadmin'];
+ }
+
+ $data['lang'] = 'en';
+ $this->lang = 'en';
+
+ if (isset($this->_queryString[0]))
+ {
+ $lang = (strcmp($this->_queryString[0],'') !== 0) ? $this->_queryString[0] : 'en';
+ $data['lang'] = Lang::sanitize($lang);
+ $this->lang = $data['lang'];
+ Lang::$current = $data['lang'];
+ }
+
+ $data['langIcon'] = Lang::getIcon(Lang::$current);
+ $data['langLabel'] = Lang::getLabel(Lang::$current);
+
+ //set desktop or mobile version
+ Version::set();
+ //subfolder of the Views folder where to look for view files
+ Params::$viewSubfolder = Version::getViewSubfolder();
+
+ $data['tm'] = $this->_topMenuClasses;
+
+ $this->_queryString = $this->sanitizeQueryString($this->_queryString);
+
+ $data['querySanitized'] = $this->querySanitized;
+ $data['queryString'] = Url::createUrl($this->_queryString);
+
+ //check ft they are updating the website
+ $updating = $this->m['ParamsModel']->select('updating')->where(array('id_par'=>1))->toList('updating')->send();
+
+ $data['updating_flag'] = 'no';
+ if (count($updating)>0)
+ {
+ $data['updating_flag'] = $updating[0];
+ $this->_updating = $data['updating_flag'];
+ }
+
+ //get the configuration xml
+ $xmlRes = $this->m['ParamsModel']->select('boxes_xml')->where(array('id_par'=>1))->toList('boxes_xml')->send();
+ if (count($xmlRes)>0)
+ {
+ $configXml = htmlspecialchars_decode($xmlRes[0],ENT_QUOTES);
+
+ if (Website::$useXmlConfigFile)
+ {
+ $xmlConfigFile = rtrim(Website::$xmlConfigFileFolder,'/') . '/config.xml';
+ if (@simplexml_load_file($xmlConfigFile))
+ {
+ $this->_configXml = simplexml_load_file($xmlConfigFile);
+ }
+ }
+ else
+ {
+ if (@simplexml_load_string($configXml))
+ {
+ $this->_configXml = simplexml_load_string($configXml);
+ }
+ }
+ }
+
+ //elements of the top menu from the config.xml file
+ //help link
+ $mod = new BoxParser($this->getBox(array("top_menu","help_page_link")));
+ $data["topMenuHelpLink"] = $mod->modules[0]->render($this->_topMenuClasses["help"]);
+ //faq link
+ $mod = new BoxParser($this->getBox(array("top_menu","faq_link")));
+ $data["topMenuFaqLink"] = $mod->modules[0]->render($this->_topMenuClasses["faq"]);
+
+ //link to the "discover your hardware" wiki page
+ $data['discoverYourHardwareLink'] = $this->getModule(array('right_column','discover_your_hardware'));
+
+ Distributions::setAllowedList();
+
+ $this->append($data);
+ }
+
+ //get the right box from the configuration xml
+ protected function getBox($xmlPath,$xmlString = null)
+ {
+ if (!isset($xmlString))
+ {
+ $xmlString = $this->_configXml;
+ }
+
+ if (is_array($xmlPath))
+ {
+ if (isset($xmlString))
+ {
+ $tempXml = $xmlString->{$xmlPath[0]};
+ if (count($xmlPath) === 1)
+ {
+ if (isset($tempXml->{$this->lang}))
+ {
+ return $tempXml->{$this->lang}->asXml();
+ }
+ else if (isset($tempXml->{"en"}))
+ {
+ return $tempXml->{"en"}->asXml();
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ array_shift($xmlPath);
+ return $this->getBox($xmlPath,$tempXml);
+ }
+ }
+ }
+ return null;
+ }
+
+// get the HTML of a module from the xml configuration string
+// $xmlPath: array conitaining the path
+ protected function getModule($xmlPath)
+ {
+ $tracksHelpLabel = null;
+ $xml = $this->getBox($xmlPath);
+ if ($xml)
+ {
+ $box_news = new BoxParser($xml);
+ $tracksHelpLabel = $box_news->render();
+ }
+ return $tracksHelpLabel;
+ }
+
+ protected function right($lang = 'en')
+ {
+ $hard = new HardwareModel();
+
+ $data['stat'] = $hard->clear()->select('type,count(*) AS numb')->where(array('-deleted'=>'no','cleared'=>'no'))->groupBy('type')->toList('type','aggregate.numb')->send();
+
+ $logged = $this->s['registered']->getUsersLogged();
+
+ $data['numbLogged'] = count($logged);
+
+ //render the boxes inside the right column
+ $data['htmlRightBox'] = $this->getModule(array('right_column'));
+
+ $data['language_links'] = $this->buildLanguageLinks($this->lang);
+
+ $data['lastModif'] = $this->m['HistoryModel']
+ ->clear()->select()
+ ->inner('hardware')
+ ->on('hardware.id_hard=history.id')
+ ->where(array('type'=>'hardware','gr'=>'registered','deleted'=>'no','cleared'=>'no',))
+ ->orderBy('id_history desc')
+ ->limit(5)
+ ->send();
+
+ $this->append($data);
+ $this->load('right');
+ }
+
+ protected function sanitizeQueryString($queryArray)
+ {
+ $resArray = array();
+ foreach ($queryArray as $item)
+ {
+ if (preg_match('/^[a-zA-Z0-9\-\_\.\+\s]+$/',$item))
+ {
+ $resArray[] = sanitizeAll($item);
+ }
+ else
+ {
+ $this->querySanitized = false;
+ return array('en');
+ }
+ }
+ return $resArray;
+ }
+
+ protected function buildLanguageLinks($lang)
+ {
+ $status = $this->_queryString;
+ $cPage = $this->querySanitized ? $this->currPage : $this->baseUrl."/home/index";
+
+ $mobileDataRole = Version::get() === "mobile" ? "data-role='listview'" : null;
+
+ $link = "<ul $mobileDataRole class='languages_link_box'>\n";
+ foreach (Lang::$complete as $abbr => $fullName)
+ {
+ $linkClass = (strcmp($abbr,$lang) === 0) ? "class='current_lang'" : null;
+ $status[0] = $abbr;
+ $href = Url::createUrl($status);
+ $fullNameArray = explode(',',$fullName);
+ $text = "<img class='ui-li-icon' src='".$this->baseUrl."/Public/Img/Famfamfam/".$fullNameArray[0]."'><span>".$fullNameArray[1]."</span>";
+
+ $mobileRel = Version::get() === "mobile" ? "rel='external'" : null;
+ $link .= "\t<li><a $mobileRel $linkClass href='".$cPage.$href."'>$text</a></li>\n";
+ }
+ $link .= "</ul>\n";
+ return $link;
+ }
+
+ protected function cleverLoad($file)
+ {
+ $fileInt = $file."_".$this->lang;
+ if (file_exists(ROOT . DS . APPLICATION_PATH . DS . 'Views' . DS . Params::$viewSubfolder . DS . ucwords($this->controller) . DS . $fileInt . '.php'))
+ {
+ $this->load($fileInt);
+ }
+ else
+ {
+ $this->load($file);
+ }
+ }
+
+}