From 2c515f2bfeeb8c9a86c896a7eac556e61eff1cad Mon Sep 17 00:00:00 2001 From: coderkun Date: Wed, 16 Apr 2014 11:36:58 +0200 Subject: [PATCH] add ranking to Character page --- configs/AppConfig.inc | 11 ++++ controllers/CharactersController.inc | 27 ++++++++++ locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 7126 -> 7166 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 13 +++-- models/CharactersModel.inc | 54 +++++++++++++++++++- views/html/characters/character.tpl | 40 +++++++-------- 6 files changed, 120 insertions(+), 25 deletions(-) diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 45ccb0fe..adca33d5 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -68,6 +68,17 @@ ); + /** + * Miscellaneous settings + * + * @static + * @var array + */ + public static $misc = array( + 'ranking_range' => 2 + ); + + /** * Validation settings for user input * diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 70a651dd..6299dfe7 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -123,6 +123,32 @@ // Get Achievements $achievements = $this->Achievements->getAchievedAchievementsForCharacter($character['id']); + // Get ranking + $ranking = array( + 'superior' => $this->Characters->getSuperiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']), + 'inferior' => $this->Characters->getInferiorCharacters($seminary['id'], $character['xps'], \nre\configs\AppConfig::$misc['ranking_range']) + ); + foreach($ranking['superior'] as &$rankCharacter) + { + if(!is_null($rankCharacter['avatar_id'])) + { + $avatar = $this->Avatars->getAvatarById($rankCharacter['avatar_id']); + if(!is_null($avatar['small_avatarpicture_id'])) { + $rankCharacter['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); + } + } + } + foreach($ranking['inferior'] as &$rankCharacter) + { + if(!is_null($rankCharacter['avatar_id'])) + { + $avatar = $this->Avatars->getAvatarById($rankCharacter['avatar_id']); + if(!is_null($avatar['small_avatarpicture_id'])) { + $rankCharacter['small_avatar'] = $this->Media->getSeminaryMediaById($avatar['small_avatarpicture_id']); + } + } + } + // Get Quest topics $questtopics = $this->Questtopics->getQuesttopicsForSeminary($seminary['id']); foreach($questtopics as &$questtopic) @@ -139,6 +165,7 @@ $this->set('user', $user); $this->set('groups', $groups); $this->set('achievements', $achievements); + $this->set('ranking', $ranking); $this->set('questtopics', $questtopics); } diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.mo b/locale/de_DE/LC_MESSAGES/The Legend of Z.mo index 1b1ca27ad7273e1c519ddb5637e377ca714944d2..ea6966685377ae2d1fb8addd1978bc04909e406d 100644 GIT binary patch delta 2492 zcmca+{?EMro)F7a1_lO(LIwr~83qQ1CCm&A(-{~Tbl5?n3=AEd3=BLB3=Ex|3=BdH z3=Gpa85npO7#LP^GB5}*FfeTAWMB|yU|=}G$-uzJz`*c;lYv2tfq~&YCj)~R0|SE; z7ld!f#lWD=z`zj0#lRrKz`)SK1y*0rFqeygfs28GVGS1pgAvF;E{MUexF8n(=3-zF zW?*38<7QysXJBAZg3?CZ3=G^13=B?C+K(IJuqbW@22KVBh74{7237_Jh9Yi=$11oX z=1%2iV31&7U|7b@z#z#`&%m%Bs^BI!#HZi5Ar4~Zff&HY!@vLv3=t?_h6kcfiHCuK zje&tdp9iAe49a(es`ubwU|?ZjU2^Ly6inuWgy<4JhI+6M*FZH~;Dh-1 z0UyMNEc_6cYVtEMC@?TE=tiX8$F2b_Y+-xh#4{DA<(;m_)!27VQQ#MvJKP^x5LU=xJ+L;*@`3NkPp zU}Ru05`-A|S%`r_l!1YPMHu2>DPf4XmM|ncS_?y>Fj$y@L6?DnAyJrtL7stup>#C zJUc`oK0P7|3A$UN5C=Yh@?VQWeD)D)fuI<~VhJ%w2x^Ey)EkOHqRIx!cN7CfK|KS5 z4^&~a7z2Y80|P^f7^K9ihtjLWAgT4L7{pw4oPmJ@l>gU4HEt7!ShPnR5*0_pp+PGS3G(|;jbEVjZ*fS7 zF-brymXv__R9=FC!H|K0K}&*x!3tF5N(en~<+!Y0MQ zpu@nxAS}heAjiPK;2_1opvS<#5HH104`%d9K^(AG3gW_JQjqL;4a(<~h6JG`lvb98 zqzPSVh(2d&h|hhX{BUVVTqi*3RB4Ehv!o%3v>IwouXH^mPNqvkTslu0;=|R_kW{)E zN}q>ncn!7St26@xBcy_4@PyJJ%9VkE!H)qF3b7yoBz@P}_r!z1x7&AahxI_j91{Vg1CqT8G z2Ll5`FsPDYU|=v~fRqIwZP^SA47MN!0|SE(0|P@c0|SF20|P@nsJwPyfTUXi$|5Y9D|q9#CZkY8!y6YhExVfY3K`5$N&k^ zAO=Wc1ho-B_A`VsFfc?x6@XGLsC*A$U|?_tB@hM%273lb+=1E#phN>o(fLsI8PJ9c zsJsBxoZ+C<4wZ`lwHX)~7&1W>6R4yFB|ruSh8zY+ngJz9O@?#^h7_mP^?Sra6Nj6t<(00RRN zKt&!%hx_JSP6ZaW#Judxy!6f8yvLc@%@hm`t&GhkM+z#!*qa*#W!PYfW{X?1002mo B%ToXV delta 2462 zcmexoe$Bl8o)F7a1_lO(0tN;K83qQ1Im`?UAORV6kSGH~0Ve|k4+8^3AtwWa5Ca24 z9VY_=F9QR^L{0_<0R{$!`J4<4;tUK78#oyl_!t-%PH-|XXfZG_T<2t95My9qVB&)C zCAk6x}T(}q*L_qd&fz{VDv~n>pa4|42OyOc+FajCK1u^&%7sSHHTnr4t3=9n4 zxEL7t85kJ2xFNI@HvK-3%XFfgz%Ffdp^)!XtgFmNz1FnB@fU>*hrfqDi8h8P|O1{DSdhFl&7 z22}ZY_z9H%1*%?x7ve)(UWfync^Mc485kJ+cp)K>zzcC; z7B3{E3Zde)yby=A^D;2hgIv_Z3-QrZUPurwf*QO5N^j$ZM8zJcMdx`T4!Xt5z@X2- z!0?Kffx&=*fkBE7BJRxxu`n7+r}IIAzL*aZGA(=%kM-~|)Pv)6161GuA0#B6@IhS2 z$5TAe|5)?I@f(#4?7#SFZ1R(}q z7Ghu!Wnf@&%#$YKVDUXVUe{+}ie3A#DrkRV+t4hib*Pz`6G^ks2KNZkTyWME+UC=T)A zcX0*=Lr_sG!N6d}z`$T40m-iU5)g+pNkD>p5|myn0dc?<2?mCG4F(2=y%LZRcqRb} z0Y*s(ts@BufpAGk;)$1ptf*Lej=gNr=xcNkTkwPm+N_hk=3NwIlh|Ih0P5f;eER6g2!ctqekcVAx{px$w-h8Tuu4NTN=rk0t^(!j zOGDz=0!rITLwxKc4N08A(h&1fr6Ey~FAZ^MnY25^ht1NE)Y%QCmqRrihFWk|nt_24 zltv(xBA5&XlMst?CmV7K*MsU%kRT|XgXjWu*s){>yS1XAM*BB0mre?$t3Z(fl376&vL~n@2USxH3=B!2A_}SwL;l-y%`u7QW+r08dON6F+dW6C8z-aRpSH7OQ5C-C`p6L$P5Msh7<+{h6n}* zhAak14FFOb!@$50&j86YL7)npfq{V;RDCfpFyt{XFrt?7 zCdb->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description, small_seminarymedia.url AS small_avatar_url, small_seminarymedia.description AS small_avatar_description '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. + 'LEFT JOIN avatarpictures AS small_avatarpictures ON small_avatarpictures.seminarymedia_id = avatars.small_avatarpicture_id '. + 'LEFT JOIN seminarymedia AS small_seminarymedia ON small_seminarymedia.id = small_avatarpictures.seminarymedia_id '. 'WHERE charactertypes.seminary_id = ? AND characters.url = ?', 'is', $seminaryId, $characterUrl @@ -164,12 +166,14 @@ public function getCharacterById($characterId) { $data = $this->db->query( - 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description '. + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url, seminarymedia.url AS avatar_url, seminarymedia.description AS avatar_description, small_seminarymedia.url AS small_avatar_url, small_seminarymedia.description AS small_avatar_description '. 'FROM v_characters AS characters '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN avatars ON avatars.id = characters.avatar_id '. 'LEFT JOIN avatarpictures ON avatarpictures.seminarymedia_id = avatars.avatarpicture_id '. 'LEFT JOIN seminarymedia ON seminarymedia.id = avatarpictures.seminarymedia_id '. + 'LEFT JOIN avatarpictures AS small_avatarpictures ON small_avatarpictures.seminarymedia_id = avatars.small_avatarpicture_id '. + 'LEFT JOIN seminarymedia AS small_seminarymedia ON small_seminarymedia.id = small_avatarpictures.seminarymedia_id '. 'WHERE characters.id = ?', 'i', $characterId @@ -258,6 +262,52 @@ } + /** + * Get the superior $count Characters in the ranking. + * + * @param int $seminaryId ID of Seminary + * @param int $xps XP-value of Character + * @param int $count Count of Characters to determine + * @return array List of superior Characters + */ + public function getSuperiorCharacters($seminaryId, $xps, $count) + { + return $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. + 'FROM v_characters AS characters '. + 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'WHERE charactertypes.seminary_id = ? AND characters.xps > ? '. + 'ORDER BY characters.xps ASC '. + 'LIMIT ?', + 'idd', + $seminaryId, $xps, $count + ); + } + + + /** + * Get the inferior $count Characters in the ranking. + * + * @param int $seminaryId ID of Seminary + * @param int $xps XP-value of Character + * @param int $count Count of Characters to determine + * @return array List of inferior Characters + */ + public function getInferiorCharacters($seminaryId, $xps, $count) + { + return $this->db->query( + 'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertypes_url '. + 'FROM v_characters AS characters '. + 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. + 'WHERE charactertypes.seminary_id = ? AND characters.xps < ? '. + 'ORDER BY characters.xps DESC '. + 'LIMIT ?', + 'idd', + $seminaryId, $xps, $count + ); + } + + /** * Get Characters that solved a Quest. * diff --git a/views/html/characters/character.tpl b/views/html/characters/character.tpl index dedab4c8..74ba7cae 100644 --- a/views/html/characters/character.tpl +++ b/views/html/characters/character.tpl @@ -62,33 +62,33 @@
-

Ranking

+

    + &$rankCharacter) : ?>
  • - -

    7. Anduin

    -

    Level 27 (1500 XP)

    + + + +

    .

    +

    ( XPs)

  • +
  • - -

    8. Jaina

    -

    Level 26 (1400 XP)

    + + + +

    .

    +

    ( XPs)

  • + &$rankCharacter) : ?>
  • - -

    9. Uther

    -

    Level 25 (1300 XP)

    -
  • -
  • - -

    10. Lothar

    -

    Level 24 (1200 XP)

    -
  • -
  • - -

    11. Morris

    -

    Level 23 (1100 XP)

    + + + +

    .

    +

    ( XPs)

  • +