00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 class aliroModuleHandler extends aliroCommonExtHandler {
00075 protected static $instance = __CLASS__;
00076
00077 private $allModules = array();
00078 private $keyToSubscript = array();
00079 private $user_area_links = array();
00080 private $admin_area_links = array();
00081 private $allMenusByModule = array();
00082 private $allModulesByMenu = array();
00083 private $distinct_user_side = array();
00084 private $visibleKeys = array();
00085 private $modulesByFormalName = array();
00086
00087 protected $extensiondir = '/modules/';
00088
00089 protected function __construct () {
00090 $query = "SELECT m1.*, (CASE WHEN m2.menuid = 0 THEN 'All' WHEN m2.menuid IS NULL THEN 'None' ELSE 'Varies' END) pages"
00091 ." FROM `#__modules` m1 LEFT JOIN `#__modules_menu` m2 ON m1.id = m2.moduleid"
00092 ." GROUP BY m1.id ORDER BY m1.position, m1.ordering";
00093 $database = aliroCoreDatabase::getInstance();
00094 if ($result = $database->doSQLget($query, 'aliroModule')) $this->allModules = $result;
00095 $translatePages = array ('All' => T_('All'), 'None' => T_('None'), 'Varies' => T_('Varies'));
00096 foreach ($this->allModules as $sub=>&$module) {
00097 $this->keyToSubscript[$module->id] = $sub;
00098 $this->modulesByFormalName[$module->module] = $sub;
00099 $module->pages = $translatePages[$module->pages];
00100 if ($module->published) {
00101 if ($module->admin & 1) $this->user_area_links[$module->position][] = $module->id;
00102 if ($module->admin & 2) $this->admin_area_links[$module->position][] = $module->id;
00103 }
00104 if ($module->admin & 1) $distinct_user_side[$module->module] = 1;
00105 }
00106 if (isset($distinct_user_side)) {
00107 $this->distinct_user_side = array_keys($distinct_user_side);
00108 sort($this->distinct_user_side);
00109 }
00110 $database->setQuery ("SELECT * FROM #__modules_menu");
00111 if ($menus = $database->loadObjectList()) foreach ($menus as $menu) {
00112 $this->allMenusByModule[$menu->moduleid][] = $menu->menuid;
00113 }
00114 $database->setQuery("SELECT m1.menuid, m2.moduleid FROM `#__modules_menu` m1"
00115 ." INNER JOIN `#__modules_menu` m2 ON m1.menuid = m2.menuid OR m2.menuid =0"
00116 ." GROUP BY m1.menuid, m2.moduleid");
00117 if ($menus = $database->loadObjectList()) foreach ($menus as $menu) {
00118 $this->allModulesByMenu[$menu->menuid][] = $menu->moduleid;
00119 }
00120 }
00121
00122
00123 public static function getInstance () {
00124 return is_object(self::$instance) ? self::$instance : (self::$instance = parent::getCachedSingleton(self::$instance));
00125 }
00126
00127 public function makeModuleFromExtension ($extension) {
00128 $newmodule = new aliroModule();
00129 $newmodule->title = T_('Please select a title');
00130
00131 $newmodule->published = 1;
00132 $newmodule->module = $extension->formalname;
00133 $newmodule->showtitle = 1;
00134 $newmodule->admin = $extension->admin;
00135 $newmodule->class = $extension->class;
00136 $newmodule->adminclass = $extension->adminclass;
00137 return $newmodule;
00138 }
00139
00140 private function getVisibleKeys ($position, $isAdmin) {
00141 if (isset($this->visibleKeys[$position][$isAdmin])) return $this->visibleKeys[$position][$isAdmin];
00142 $result = array();
00143 if ($isAdmin) $elements = isset($this->admin_area_links[$position]) ? $this->admin_area_links[$position] : array();
00144 else $elements = isset($this->user_area_links[$position]) ? $this->user_area_links[$position] : array();
00145 $currentmenu = aliroRequest::getInstance()->getItemid();
00146 if (!isset($this->allModulesByMenu[$currentmenu])) $currentmenu = 0;
00147 if (isset($this->allModulesByMenu[$currentmenu])) {
00148 $elements = array_intersect($elements, $this->allModulesByMenu[$currentmenu]);
00149 $authoriser = aliroAuthoriser::getInstance();
00150 foreach ($elements as $element) if ($authoriser->checkUserPermission ('view', 'aliroModule', $element)) $result[] = $element;
00151 }
00152 $this->visibleKeys[$position][$isAdmin] = $result;
00153 return $result;
00154 }
00155
00156 public function countModules ($position, $isAdmin) {
00157 return count($this->getVisibleKeys ($position, $isAdmin));
00158 }
00159
00160 public function getModules ($position, $isAdmin) {
00161 $result = array();
00162 $keys = $this->getVisibleKeys ($position, $isAdmin);
00163 foreach ($keys as $key) $result[] = $this->allModules[$this->keyToSubscript[$key]];
00164 return $result;
00165 }
00166
00167 public function getModuleByID ($id) {
00168 return isset($this->allModules[$this->keyToSubscript[$id]]) ? $this->allModules[$this->keyToSubscript[$id]] : null;
00169 }
00170
00171 public function getModuleByFormalName ($formalname) {
00172 return isset($this->modulesByFormalName[$formalname]) ? $this->allModules[$this->modulesByFormalName[$formalname]] : null;
00173 }
00174
00175 public function getSelectedModules ($position='', $formalname='', $search='', $admin=false) {
00176 $results = array();
00177 foreach ($this->allModules as $module) {
00178 if ($admin) {
00179 if (!($module->admin & 2)) continue;
00180 }
00181 elseif (!($module->admin & 1)) continue;
00182 if ($position AND $module->position != $position) continue;
00183 if ($formalname AND $module->module != $formalname) continue;
00184 if ($search AND strpos(strtolower($module->title), $search) === false) continue;
00185 $results[] = $module;
00186 }
00187 return $results;
00188 }
00189
00190 public function getModulesByPosition ($admin) {
00191 $results = array();
00192 $check = $admin ? 2 : 1;
00193 foreach ($this->allModules as $module) {
00194 if ($module->admin & $check) $results[$module->position][] = $module;
00195 }
00196 return $results;
00197 }
00198
00199 public function getMenus ($module_id) {
00200 return isset($this->allMenusByModule[$module_id]) ? $this->allMenusByModule[$module_id] : array();
00201 }
00202
00203 public function getDistinctNames () {
00204 return $this->distinct_user_side;
00205 }
00206
00207 public function deleteModules ($ids) {
00208 foreach ($ids as &$id) $id = intval($id);
00209 $idlist = implode (',', $ids);
00210 $database = aliroCoreDatabase::getInstance();
00211 $database->doSQL ("DELETE FROM #__modules WHERE id IN ('$idlist')");
00212 $database->doSQL ("DELETE FROM #__modules_menu WHERE moduleid IN ('$idlist')");
00213 $this->clearCache();
00214 }
00215
00216 public function publishModules ($ids, $new_publish) {
00217 foreach ($ids as &$id) $id = intval($id);
00218 $new_publish = intval($new_publish);
00219 $idlist = implode (',', $ids);
00220 $database = aliroCoreDatabase::getInstance();
00221 $database->doSQL ("UPDATE #__modules SET published = $new_publish WHERE id IN ($idlist)");
00222 $this->clearCache();
00223 }
00224
00225 public function changeOrder ($id, $direction) {
00226 $module = $this->allModules[$this->keyToSubscript[$id]];
00227 $movement = 'down' == $direction ? 15 : -15;
00228 $this->updateOrdering (array($id => $module->ordering + $movement));
00229 }
00230
00231 public function updateOrdering ($orders) {
00232 foreach ($orders as $id=>$order) {
00233 $module = $this->allModules[$this->keyToSubscript[$id]];
00234 if ($module->ordering != $order) $changes[$id] = $order;
00235 }
00236 foreach ($this->allModules as $module) {
00237 $ordering = isset($changes[$module->id]) ? $changes[$module->id] : $module->ordering;
00238 $allmodules[$module->position][$ordering] = $module->id;
00239 }
00240 $changed = false;
00241 $query = "UPDATE #__modules SET ordering = CASE ";
00242 foreach ($allmodules as $position=>$orderings) {
00243 $order = 10;
00244 ksort($orderings);
00245 foreach ($orderings as $ordering=>$id) {
00246 $module = $this->allModules[$this->keyToSubscript[$id]];
00247 if ($order != $module->ordering) {
00248 $query .= "WHEN id = $id THEN $order ";
00249 $changed = true;
00250 }
00251 $order += 10;
00252 }
00253 }
00254 if ($changed) {
00255 $query .= 'ELSE ordering END';
00256 aliroCoreDatabase::getInstance()->doSQL ($query);
00257 $this->clearCache();
00258 }
00259 }
00260
00261 }
00262
00267 class aliroModule extends aliroDatabaseRow {
00268 protected $DBclass = 'aliroCoreDatabase';
00269 protected $tableName = '#__modules';
00270 protected $rowKey = 'id';
00271 protected $handler = 'aliroModuleHandler';
00272 protected $formalfield = 'module';
00273
00274
00275 public function check() {
00276
00277 if (trim( $this->title ) == '') {
00278 $this->_error = T_('Your Module must contain a title.');
00279 return false;
00280 }
00281 return true;
00282 }
00283
00284 public function getParams () {
00285 $params = new aliroParameters ($this->params);
00286 return $params;
00287 }
00288
00289 public function loadLanguage () {
00290
00291 $basepath = criticalInfo::getInstance()->absolute_path.'/modules/'.$this->module;
00292 $path = $basepath.aliroCore::get('mosConfig_lang').'.php';
00293 if (file_exists( $path )) include( $path );
00294 else {
00295 $path = $basepath.'.en.php';
00296 if (file_exists( $path )) include( $path );
00297 }
00298 }
00299
00300 public function renderModule ($area, $template) {
00301 $this->loadLanguage();
00302 $params = $this->getParams();
00303 $moduleclass_sfx = $params->get( 'moduleclass_sfx' );
00304 $title = $this->showtitle ? $this->title : '';
00305 $moduleclass = ($this->admin & 2) ? $this->adminclass : $this->class;
00306 $modobject = new $moduleclass;
00307 $modobject->activate($this, $content, $area, $params);
00308 $method = 'moduleStyle'.$area->style;
00309 return $template->$method($moduleclass_sfx, $title, $content);
00310 }
00311
00312 public function renderModuleTitle ($area, $template) {
00313 $params = $this->getParams();
00314 $moduleclass_sfx = $params->get( 'moduleclass_sfx' );
00315 $title = $this->showtitle ? $this->title : '';
00316 $method = 'moduleStyle'.$area->style;
00317 return $template->$method($moduleclass_sfx, $title, '');
00318 }
00319
00320 }