From e50333a518f100d5807ab674895a2d553429027e Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Fri, 30 Mar 2018 19:14:46 +0200 Subject: [PATCH] DB/Favorites * implement favorites for DB entries * click on the star besides the name of the entry to add it to a new quick menu --- includes/ajaxHandler/account.class.php | 51 +++-- includes/user.class.php | 30 +++ pages/genericPage.class.php | 3 +- setup/db_structure.sql | 19 +- setup/updates/1522421324_01.sql | 8 + static/css/aowow.css | 18 ++ static/images/icons/fav-star.png | Bin 0 -> 2368 bytes static/js/global.js | 246 ++++++++++++++++++++++++- static/js/locale_dede.js | 7 + static/js/locale_enus.js | 7 + static/js/locale_eses.js | 7 + static/js/locale_frfr.js | 7 + static/js/locale_ruru.js | 7 + template/bricks/head.tpl.php | 6 + template/bricks/headerMenu.tpl.php | 1 + 15 files changed, 401 insertions(+), 16 deletions(-) create mode 100644 setup/updates/1522421324_01.sql create mode 100644 static/images/icons/fav-star.png diff --git a/includes/ajaxHandler/account.class.php b/includes/ajaxHandler/account.class.php index ae25b4f8..dfd8df4d 100644 --- a/includes/ajaxHandler/account.class.php +++ b/includes/ajaxHandler/account.class.php @@ -5,17 +5,20 @@ if (!defined('AOWOW_REVISION')) class AjaxAccount extends AjaxHandler { - protected $validParams = ['exclude', 'weightscales']; + protected $validParams = ['exclude', 'weightscales', 'favorites']; protected $_post = array( - 'groups' => [FILTER_SANITIZE_NUMBER_INT, null], - 'save' => [FILTER_SANITIZE_NUMBER_INT, null], - 'delete' => [FILTER_SANITIZE_NUMBER_INT, null], - 'id' => [FILTER_CALLBACK, ['options' => 'AjaxHandler::checkIdList']], - 'name' => [FILTER_CALLBACK, ['options' => 'AjaxAccount::checkName']], - 'scale' => [FILTER_CALLBACK, ['options' => 'AjaxAccount::checkScale']], - 'reset' => [FILTER_SANITIZE_NUMBER_INT, null], - 'mode' => [FILTER_SANITIZE_NUMBER_INT, null], - 'type' => [FILTER_SANITIZE_NUMBER_INT, null], + 'groups' => [FILTER_SANITIZE_NUMBER_INT, null], + 'save' => [FILTER_SANITIZE_NUMBER_INT, null], + 'delete' => [FILTER_SANITIZE_NUMBER_INT, null], + 'id' => [FILTER_CALLBACK, ['options' => 'AjaxHandler::checkIdList']], + 'name' => [FILTER_CALLBACK, ['options' => 'AjaxAccount::checkName']], + 'scale' => [FILTER_CALLBACK, ['options' => 'AjaxAccount::checkScale']], + 'reset' => [FILTER_SANITIZE_NUMBER_INT, null], + 'mode' => [FILTER_SANITIZE_NUMBER_INT, null], + 'type' => [FILTER_SANITIZE_NUMBER_INT, null], + 'add' => [FILTER_SANITIZE_NUMBER_INT, null], + 'remove' => [FILTER_SANITIZE_NUMBER_INT, null], + // 'sessionKey' => [FILTER_SANITIZE_NUMBER_INT, null] ); protected $_get = array( 'locale' => [FILTER_CALLBACK, ['options' => 'AjaxHandler::checkLocale']] @@ -36,13 +39,12 @@ class AjaxAccount extends AjaxHandler $this->handler = 'handleExclude'; else if ($this->params[0] == 'weightscales') $this->handler = 'handleWeightscales'; + else if ($this->params[0] == 'favorites') + $this->handler = 'handleFavorites'; } protected function handleExclude() { - if (!User::$id) - return; - if ($this->_post['mode'] == 1) // directly set exludes { $type = $this->_post['type']; @@ -121,6 +123,29 @@ class AjaxAccount extends AjaxHandler return 0; } + protected function handleFavorites() + { + // omit usage of sessionKey + if (count($this->_post['id']) != 1 || empty($this->_post['id'][0])) + return; + + $typeId = $this->_post['id'][0]; + + if ($type = $this->_post['add']) + { + if (empty(Util::$typeClasses[$type])) + return; + + $tc = new Util::$typeClasses[$type]([['id', $typeId]]); + if ($tc->error) + return; + + DB::Aowow()->query('INSERT INTO ?_account_favorites (`userId`, `type`, `typeId`) VALUES (?d, ?d, ?d)', User::$id, $type, $typeId); + } + else if ($type = $this->_post['remove']) + DB::Aowow()->query('DELETE FROM ?_account_favorites WHERE `userId` = ?d AND `type` = ?d AND `typeId` = ?d', User::$id, $type, $typeId); + } + protected function checkScale($val) { if (preg_match('/^((\w+:\d+)(,\w+:\d+)*)$/', $val)) diff --git a/includes/user.class.php b/includes/user.class.php index 9144eaed..265593c9 100644 --- a/includes/user.class.php +++ b/includes/user.class.php @@ -648,6 +648,36 @@ class User return $data; } + + public static function getFavorites() + { + if (!self::$id) + return []; + + $res = DB::Aowow()->selectCol('SELECT `type` AS ARRAY_KEY, `typeId` AS ARRAY_KEY2, `typeId` FROM ?_account_favorites WHERE `userId` = ?d', self::$id); + if (!$res) + return []; + + $data = []; + foreach ($res as $type => $ids) + { + if (empty(Util::$typeClasses[$type])) + continue; + + $tc = new Util::$typeClasses[$type]([['id', array_values($ids)]]); + if ($tc->error) + continue; + + $entities = []; + foreach ($tc->iterate() as $id => $__) + $entities[] = [$id, $tc->getField('name', true)]; + + if ($entities) + $data[] = ['id' => $type, 'entities' => $entities]; + } + + return $data; + } } ?> diff --git a/pages/genericPage.class.php b/pages/genericPage.class.php index 65337489..043bd168 100644 --- a/pages/genericPage.class.php +++ b/pages/genericPage.class.php @@ -265,7 +265,8 @@ class GenericPage if ($ahl = DB::Aowow()->selectCell('SELECT altHeaderLogo FROM ?_home_featuredbox WHERE ?d BETWEEN startDate AND endDate ORDER BY id DESC', time())) $this->headerLogo = Util::defStatic($ahl); - $this->gUser = User::getUserGlobals(); + $this->gUser = User::getUserGlobals(); + $this->gFavorites = User::getFavorites(); $this->pageTemplate['pageName'] = strtolower($pageCall); if (!$this->isValidPage()) diff --git a/setup/db_structure.sql b/setup/db_structure.sql index 312bdf57..defafb86 100644 --- a/setup/db_structure.sql +++ b/setup/db_structure.sql @@ -106,6 +106,23 @@ CREATE TABLE `aowow_account_cookies` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `aowow_account_favorites` +-- + +DROP TABLE IF EXISTS `aowow_account_favorites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `aowow_account_favorites` ( + `userId` int(11) unsigned NOT NULL, + `type` smallint(5) unsigned NOT NULL, + `typeId` mediumint(8) unsigned NOT NULL, + UNIQUE INDEX `userId_type_typeId` (`userId`, `type`, `typeId`), + KEY `userId` (`userId`), + CONSTRAINT `FK_acc_favorites` FOREIGN KEY (`userId`) REFERENCES `aowow_account` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `aowow_account_excludes` -- @@ -3004,7 +3021,7 @@ UNLOCK TABLES; LOCK TABLES `aowow_dbversion` WRITE; /*!40000 ALTER TABLE `aowow_dbversion` DISABLE KEYS */; -INSERT INTO `aowow_dbversion` VALUES (1522321543,0,NULL,NULL); +INSERT INTO `aowow_dbversion` VALUES (1522421325,0,NULL,NULL); /*!40000 ALTER TABLE `aowow_dbversion` ENABLE KEYS */; UNLOCK TABLES; diff --git a/setup/updates/1522421324_01.sql b/setup/updates/1522421324_01.sql new file mode 100644 index 00000000..9a5a7a42 --- /dev/null +++ b/setup/updates/1522421324_01.sql @@ -0,0 +1,8 @@ +CREATE TABLE `aowow_account_favorites` ( + `userId` INT(11) UNSIGNED NOT NULL, + `type` SMALLINT(5) UNSIGNED NOT NULL, + `typeId` MEDIUMINT(8) UNSIGNED NOT NULL, + UNIQUE INDEX `userId_type_typeId` (`userId`, `type`, `typeId`), + INDEX `userId` (`userId`), + CONSTRAINT `FK_acc_favorites` FOREIGN KEY (`userId`) REFERENCES `aowow_account` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB; diff --git a/static/css/aowow.css b/static/css/aowow.css index 1a54e25d..5356bc25 100644 --- a/static/css/aowow.css +++ b/static/css/aowow.css @@ -4320,3 +4320,21 @@ input.button-copy { input.button-copy:hover { background-color: #444; } + +/* favicon fa-replacement custom */ +.fav-star { + cursor:pointer; + display: inline-block; + width: 22px; + height: 20px; + background: url(../images/icons/fav-star.png) 0px center no-repeat; + margin-left:10px; +} + +.fav-star-0:hover { + background-position: -32px center; +} + +.fav-star-1 { + background-position: -65px center; +} diff --git a/static/images/icons/fav-star.png b/static/images/icons/fav-star.png new file mode 100644 index 0000000000000000000000000000000000000000..2b029078f185b45ac3ef8b9e90ce380974334a78 GIT binary patch literal 2368 zcmV-G3BUGPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00^*2L_t(oN4=SUP*YbH$6tN{As_`oARrX% zu4{Lg{iECN?2j3DXYAI_?95I(b=Iw|R%>b9m0}bW`C%|5A<291zV{HSv06adsu3-s zB7zZ-UkQXCx=vfgs#KKvgK7l~0?FAMc)BizUy|~fIe+AybKkq~oAb`SCm|-oW{wNd zr7myLZCn<~56viTZG`N0QP|EaWaLWQOD{?I;Ta{3^Z&zvykPiNKUYz<_yuo%czP^K z)GbKSGc|}Kfl;nrr&KN!^R5{o-bnbC9G2wuv`C;mI|6KLqkqM_W(>RrNznmG*1aY% zd}|1Y`VV7X;a$_?gG?$h(?A1aSYUL?K+_5-@0t;c4oV|yE5$Hq6T-mh0I2)m`J&Rl zh5PdE8DUom;cqS%0kjeDu*x55{~fj8v?w-!cRw4iCFP+QJ#T|d86Q8TdboiMm9^~& zm3840fs;4mmhhI!ok5PS2Ex&24sw>f{=yzUoM>qvS_Ye?&MUja9EY~Z&p(>uvaS;& z*WyDbjZzuzJG_Py|GUG-5J8Zc2I-8|%HGhtyI8E-@wleyt+chMq z4R2&=ba=zS_#UO z_^W)_q@Z&HdoLZ9!Tkm?473R0p;ZjMwO(-B>JbSS9%KL`Ba=4lD^H3{%K2pGcVz!{70^|ZKdO#lxq zV(32Z5A6kV$oW(3ABhcGwA+AKU`aKQy3FFOX=!Mq;v?kBX#U<~lA4YGf2XfGX#zA2uC znvZ*(yVr;_%;pUja`5XqMRAWE5vg5o$>fC`+Z@tuXyfU-=WAUogsI8?){hQ zW8#aw4Zh%P2w1=Gjd{!Q@RT>)7BjKDqt;Ccn1VU1K2V<_hoZm7{0k?BaQMOr8ZIP7 zhfD^_07$#O)m1x(9TTuTm0F#e&2%$#7I1Xh;>l#YJF2P(aZ`nGZD$QW&zb`-_Ls=# z^R99EO{;Sf*eZx69d+)7o5){v&}K3d!{*F*wV^JudF2p9}IjCtG`Q=HA~IZq+Y{{RKaLY?2IIJHu>w zENS3DI*z94I5o-GSws$!G<`)+F<9IjkBVz=BTUX(DfHL`U*EL|odfkUxRe`K-d!Py z>uDn5I%|cO2OGt>dlQ}S#F^WBbQWCGKkrd-?=};815XI(Xq3XGys*~p(~>xiCg_Ou zh!;G>9o!?4?I(SqlZ+Z)+*j9W4{9l9h~sd_h71oViVAl9X283L(Q3EN)-%j}18$Y^ zi2<0bkAFhx%YV(gr$sy?Ti<$8)IZX@d&AZ3xRtH)3;sqw-=7a5I%V> z59c`L2LpSeJSOfcy=+-!sl<+3Z-8bm==d}odg^3zzSE8Te!D7pwtrQrU$7!0sOxgI zXrxW9@xg15k1y`BRHjmoOMoi*JuFKu@&{;HwCaiA(MjzHcj+K-b<7=q!}~a;!DDT60(3 m*BgSM%PfTlrqSXO#D4+n{^qp0GTxs60000 a'); + + favMenu.text(LANG.favorites); + if (!Favorites.hasFavorites()) + favMenu.parent().hide(); + + Favorites.refreshMenu() + } + function initUserMenu() { var $link = $('#toplinks-user'); @@ -4235,6 +4247,238 @@ Dialog.templates.docompare = { ] }; +var Favorites = new function() { + var _type = null; + var _typeId = null; + var _favIcon = null; + + this.pageInit = function(h1, type, typeId) { + if (typeof h1 == 'string') { + if (!document.querySelector) + return; + + h1 = document.querySelector(h1); + } + + if (!h1 || typeof type != 'number' || typeof typeId != 'number') + return; + + _type = type; + _typeId = typeId; + + createIcon(h1); + }; + + function initFavIcon() { + var h1 = typeof g_pageInfo == 'object' && typeof g_pageInfo.type == 'number' && typeof g_pageInfo.typeId == 'number' ? document.querySelector('#main-contents h1') : null; + if (!h1) { + if (document.readyState !== 'complete') + setTimeout(initFavIcon, 9); + + return; + } + + _type = g_pageInfo.type; + _typeId = g_pageInfo.typeId; + + createIcon(h1); + } + + this.hasFavorites = function() { + return !!g_favorites.length + }; + + this.getMenu = function() { + var favMenu = []; + var nGroups = 0; + var nEntries = 0; + + for (var i = 0, favGroup; favGroup = g_favorites[i]; i++) { + if (!favGroup.entities.length) + continue; + + nGroups++; + var subMenu = []; + for (var j = 0, favEntry; favEntry = favGroup.entities[j]; j++) { + subMenu.push([favEntry[0], favEntry[1], '?' + g_types[favGroup.id] + '=' + favEntry[0]]); + nEntries++ + } + + Menu.sort(subMenu); + favMenu.push([favGroup.id, LANG.types[favGroup.id][2], , subMenu]) + } + + Menu.sort(favMenu); + + // display short favorites as 1-dim list + if ((nGroups == 1 && nEntries <= 45) || (nGroups == 2 && nGroups + nEntries <= 30) || (nGroups > 2 && nGroups + nEntries <= 15)) { + var list = []; + + for (var i = 0; subMenu = favMenu[i]; i++) { + list.push([, subMenu[MENU_IDX_NAME]]); + + for (var j = 0, subEntry; subEntry = subMenu[MENU_IDX_SUB][j]; j++) { + var listEntry = [subEntry[MENU_IDX_ID], subEntry[MENU_IDX_NAME], subEntry[MENU_IDX_URL]]; + + if (subEntry[MENU_IDX_OPT]) + listEntry[MENU_IDX_OPT] = subEntry[MENU_IDX_OPT]; + + list.push(listEntry); + } + } + + favMenu = list; + } + + return favMenu; + }; + + this.refreshMenu = function() { + var menuRoot = $('#toplinks-favorites'); + if (!menuRoot.length) + return; + + var favMenu = Favorites.getMenu(); + if (!favMenu.length) { + menuRoot.hide(); + return; + } + + Menu.add(menuRoot, favMenu); + menuRoot.show(); + }; + + function createIcon(heading) { + _favIcon = $('', { + 'class': 'fav-star', + mouseout: $WH.Tooltip.hide + }).appendTo(heading); + + if (g_user.id) { + _favIcon.addClass('fav-star' + (isFaved(_type, _typeId) ? '-1' : '-0')).click((function(type, typeId, name) { + toggleEntry(type, typeId, name); + updateIcon(type, typeId); + $WH.Tooltip.hide(); + }).bind(null, _type, _typeId, heading.textContent.trim().replace(/(.+)<.*/, '$1'))); + + _favIcon.mouseover(function(r) { + var tt = this.className.match(/\bfav-star-0\b/) ? LANG.addtofavorites : LANG.removefromfavorites; + $WH.Tooltip.show(this, tt, false, false, 'q2'); + }); + + } + else { + _favIcon.addClass('fa-star-0').click(function() { + location.href = "?account=signin"; + $WH.Tooltip.hide(); + }).mouseover(function(r) { + $WH.Tooltip.show(this, LANG.favorites_login + "
" + LANG.clicktologin + ''); + }); + } + } + + function updateIcon(type, typeId) { + if (_favIcon) { + var rmv = 'fav-star-0'; + var add = 'fav-star-1'; + if (!isFaved(type, typeId)) { + rmv = 'fav-star-1'; + add = 'fav-star-0'; + } + + _favIcon.removeClass(rmv).addClass(add); + } + } + + function isFaved(type, typeId) { + var idx = getIndex(type); + if (idx == -1) + return false; + + for (var i = 0, j; j = g_favorites[idx].entities[i]; i++) + if (j[0] == typeId) + return true; + + return false; + } + + function toggleEntry(type, typeId, name) { + if (isFaved(type, typeId)) + removeEntry(type, typeId); + else + addEntry(type, typeId, name); + } + + function addEntry(type, typeId, name) { + var idx = getIndex(type, true); + if (idx == -1) + return; + + for (var i = 0, j; j = g_favorites[idx].entities[i]; i++) { + if (j[0] == typeId) { + alert(LANG.favorites_duplicate.replace('%s', LANG.types[type][1])); + return; + } + } + + sendUpdate('add', type, typeId); + g_favorites[idx].entities.push([typeId, name]); + Favorites.refreshMenu(); + } + + function removeEntry(type, typeId) { + var idx = getIndex(type); + if (idx == -1) + return; + + for (var i = 0, j; j = g_favorites[idx].entities[i]; i++) { + if (j[0] == typeId) { + sendUpdate('remove', type, typeId); + g_favorites[idx].entities.splice(i, 1); + if (!g_favorites[idx].entities.length) + g_favorites.splice(idx, 1); + + Favorites.refreshMenu(); + return; + } + } + } + + function getIndex(type, createNew) { + if (!LANG.types[type]) + return -1; + + for (var i = 0, j; j = g_favorites[i]; i++) + if (j.id == type) + return i; + + if (!createNew) + return -1; + + g_favorites.push({ id: type, entities: [] }); + + g_favorites.sort(function(a, b) { return $WH.stringCompare(LANG.types[a.id], LANG.types[b.id]) }); + + for (i = 0; j = g_favorites[i]; i++) + if (j.id == type) + return i; + + return -1; + } + + function sendUpdate(method, type, typeId) { + var data = { + id: typeId, + // sessionKey: g_user.sessionKey + }; + data[method] = type; + $.post('?account=favorites', data); + } + + if (document.querySelector && $WH.localStorage.isSupported()) + initFavIcon(); +}; + function Tabs(opt) { $WH.cO(this, opt); diff --git a/static/js/locale_dede.js b/static/js/locale_dede.js index 6152d189..519820c1 100644 --- a/static/js/locale_dede.js +++ b/static/js/locale_dede.js @@ -3282,6 +3282,13 @@ var LANG = { myaccount_purgefailed: "Löschen fehlgeschlagen :(", myaccount_purgesuccess: "Bekanntmachungsdaten wurden erfolgreich gelöscht!", + favorites: "Favoriten", + clicktologin: "Klicken zum Einloggen", + favorites_login: "Melden Sie sich an, um Ihre Favoriten in einem benutzerdefinierten Menü zu speichern!", + favorites_duplicate: "Diese(s/r) %s wurde bereits favorisiert!", + addtofavorites: "Zu Favoriten hinzufügen", + removefromfavorites: "Aus Favoriten entfernen", + types: { 1: ["NPC", "NPC" , "NPCs", "NPCs"], 2: ["Objekt", "Objekt", "Objekte", "Objekte"], diff --git a/static/js/locale_enus.js b/static/js/locale_enus.js index fff1f954..f72faf1f 100644 --- a/static/js/locale_enus.js +++ b/static/js/locale_enus.js @@ -3330,6 +3330,13 @@ var LANG = { myaccount_purgefailed: "Purge failed :(", myaccount_purgesuccess: "Announcement data has been successfully purged!", + favorites: "Favorites", + clicktologin: "Click to log in", + favorites_login: "Log in to save your favorites to a custom menu!", + favorites_duplicate: "This %s is already favorited!", + addtofavorites: "Add to Favorites", + removefromfavorites: "Remove from Favorites", + types: { 1: ["NPC", "NPC" , "NPCs", "NPCs"], 2: ["Object", "object", "Objects", "objects"], diff --git a/static/js/locale_eses.js b/static/js/locale_eses.js index 5c4840f3..774d6575 100644 --- a/static/js/locale_eses.js +++ b/static/js/locale_eses.js @@ -3283,6 +3283,13 @@ var LANG = { myaccount_purgefailed: "La purga ha fallado :(", myaccount_purgesuccess: "¡Se han purgado los datos de los anuncios correctamente!", + favorites: "Favoritos", + clicktologin: "Haz clic para iniciar sesión", + favorites_login: "Inicia sesión para guardar tus favoritos a un menú personalizado!", + favorites_duplicate: "Este(a) %s ya está marcado como favorito!", + addtofavorites: "Agregar a Favoritos", + removefromfavorites: "Quitar de favoritos", + types: { 1: ["PNJ", "PNJ" , "PNJs", "PNJs"], 2: ["Entidad", "entidad", "Entidades", "entidades"], diff --git a/static/js/locale_frfr.js b/static/js/locale_frfr.js index ccfddc19..4c0603f0 100644 --- a/static/js/locale_frfr.js +++ b/static/js/locale_frfr.js @@ -3273,6 +3273,13 @@ var LANG = { myaccount_purgefailed: "La purge a échouée :(", myaccount_purgesuccess: "Les données d'annonce ont été purgées correctement!", + favorites: "Favoris", + clicktologin: "Cliquez pour vous connecter", + favorites_login: "Connectez-vous pour enregistrer vos favoris dans un menu personnalisé !", + favorites_duplicate: "Cet(te) %s est déjà mis en favori !", + addtofavorites: "Ajouter aux favoris", + removefromfavorites: "Retirer des favoris", + types: { 1: ["PNJ", "PNJ" , "PNJs", "PNJs"], 2: ["Entité", "entité", "Entités", "entités"], diff --git a/static/js/locale_ruru.js b/static/js/locale_ruru.js index 592ef8f7..31b5ee63 100644 --- a/static/js/locale_ruru.js +++ b/static/js/locale_ruru.js @@ -3273,6 +3273,13 @@ var LANG = { myaccount_purgefailed: "Ошибка сброса :(", myaccount_purgesuccess: "Закрытые объявления успешно сброшены!", + favorites: "Избранное", + clicktologin: "Нажмите, чтобы войти", + favorites_login: "Выполните вход в систему, чтобы сохранить избранное в настраиваемом меню.", + favorites_duplicate: "%s уже в избранном!", + addtofavorites: "Добавить в Избранное", + removefromfavorites: "Удалить из Избранного", + types: { 1: ["НИП", "НИП" , "НИП", "НИП"], 2: ["Объект", "объект", "Объекты", "объекты"], diff --git a/template/bricks/head.tpl.php b/template/bricks/head.tpl.php index 8200dbf6..d29d88fd 100644 --- a/template/bricks/head.tpl.php +++ b/template/bricks/head.tpl.php @@ -52,7 +52,13 @@ endforeach; ?> + diff --git a/template/bricks/headerMenu.tpl.php b/template/bricks/headerMenu.tpl.php index 3515cb80..78e04d46 100644 --- a/template/bricks/headerMenu.tpl.php +++ b/template/bricks/headerMenu.tpl.php @@ -1,5 +1,6 @@ |'; echo ''.User::$displayName.''; echo '('.User::getReputation().')'; else: