From 29d1d9372f4143be220a95c543deaf0235bf53bb Mon Sep 17 00:00:00 2001 From: SirCotare Date: Thu, 31 May 2012 15:15:36 +0200 Subject: [PATCH] #1470 class files moved; some rendering improvements; --HG-- branch : gsoc2012-achievements --- .../app_achievements/_doc/Class_scheme.dia | Bin 3460 -> 3485 bytes .../app_achievements/_doc/Class_scheme.png | Bin 21888 -> 22646 bytes .../AchAchievement_class.php | 26 +++++-- .../class/AchCategory_class.php | 48 ++++++++++++ .../AchList_abstract.php} | 20 ----- .../{include => class}/AchMenu_class.php | 18 ++--- .../{include => class}/AchObjective_class.php | 6 +- .../{include => class}/AchPerk_class.php | 12 +-- .../class/AchSummary_class.php | 69 ++++++++++++++++++ .../class/RenderNodeIteraor_abstract.php | 21 ++++++ .../class/RyzomUser_class.php | 25 +++++++ .../include/AchCategory_class.php | 32 -------- .../include/AchSummary_class.php | 69 ------------------ .../include/ach_render_web.php | 53 +++++++++----- code/web/app/app_achievements/index.php | 50 +++++++++---- 15 files changed, 272 insertions(+), 177 deletions(-) rename code/web/app/app_achievements/{include => class}/AchAchievement_class.php (63%) create mode 100644 code/web/app/app_achievements/class/AchCategory_class.php rename code/web/app/app_achievements/{include/AchCommon_class.php => class/AchList_abstract.php} (52%) rename code/web/app/app_achievements/{include => class}/AchMenu_class.php (64%) rename code/web/app/app_achievements/{include => class}/AchObjective_class.php (77%) rename code/web/app/app_achievements/{include => class}/AchPerk_class.php (63%) create mode 100644 code/web/app/app_achievements/class/AchSummary_class.php create mode 100644 code/web/app/app_achievements/class/RenderNodeIteraor_abstract.php create mode 100644 code/web/app/app_achievements/class/RyzomUser_class.php delete mode 100644 code/web/app/app_achievements/include/AchCategory_class.php delete mode 100644 code/web/app/app_achievements/include/AchSummary_class.php diff --git a/code/web/app/app_achievements/_doc/Class_scheme.dia b/code/web/app/app_achievements/_doc/Class_scheme.dia index cee3d3deb7dc8fcff69c7cfbc054ab5ee11a47ff..31768b99882555e7f4475e30b97c035585546149 100644 GIT binary patch literal 3485 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

dei3LTa;xE^`A(t zj=HArn65J*3Xc|7cOy<^EJkYCp7P`qO6#&jN@z7TxnM!|VcE_>^{UmsWqsG-!3Y14 zcQ9LjrqKrjo$YC_XmO_;&23xw%zG+@nhrYmc8RXNx0u@hGi&mEx7ugt6c5=Tsdzg` zrm@2h&oZbOZ63*w;gl`l^yuik05DT+dbIEpdnW3x4RfwNk7xM*=fZe7HDT(~Q@4*t zD-3%2sG~Ex!)=!y28IEp;NM5O^?javH~k4|_>_JNfo$~BvUzJ^O7_-&spRea_er{0`4t>j@A3 zV;rnqL<{gXqGZtdf!EC5t1r1f&b{@u1-EWy<2ezgB234wHn*p z8H$NtL5-Dzmu?&QU&`?rdoQa-*rNjk(W5zJEF~?6QhHTGGfm`Hx*_EeX!`wBgfnnZ zocsu5F@E%6hght&rEZ)A%z(8&_m4s<5^A&o>>o*6gugIPCbKN%9vK@DKKjRtFf!uR zh&*+V8bP+{8<4C(0B9>#k~rvGkH)C~vG1U#1TvqQLcE6LEG$GT{A|pT&Xtose!V+N z3)w87>`z3c+8spAl>CvQnD~Q73$Ke35NoW=CrOIDtRSkn={LiF?srF)5MQSa z?pEErsyQ9&|7KmJAlC45ZBF)dC4u7upM~PUZ{_*>N@0iQ?6(^`Q=()W1khYJm zIf^=6pR?9~qKm}SL&$b-TP`QakKWSxOkCe<0 cU8A#I-W_Lo(m{vvTL8Fw+wfNDP5Wp63t-s8Z2$lO delta 16066 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 Le^=dbdHR0<0>Nt> diff --git a/code/web/app/app_achievements/include/AchAchievement_class.php b/code/web/app/app_achievements/class/AchAchievement_class.php similarity index 63% rename from code/web/app/app_achievements/include/AchAchievement_class.php rename to code/web/app/app_achievements/class/AchAchievement_class.php index 532d6c160..9fc920dda 100644 --- a/code/web/app/app_achievements/include/AchAchievement_class.php +++ b/code/web/app/app_achievements/class/AchAchievement_class.php @@ -8,9 +8,10 @@ private $tie_cult; private $image; private $name; + private $template; - function AchAchievement(&$data,$lang,$user) { - global $db; + function AchAchievement(&$data) { + global $DBc,$_USER; $this->id = $data['aa_id']; $this->parent = $data['aa_parent']; @@ -20,16 +21,16 @@ $this->tie_cult = $data['aa_tie_cult']; $this->image = $data['aa_image']; $this->name = $data['aal_name']; - $this->done = $data['']; + $this->template = $data['aal_template']; #echo $this->id; - $res = $db->sqlQuery("SELECT * FROM ach_perk LEFT JOIN (ach_perk_lang) ON (apl_lang='".$lang."' AND apl_perk=ap_id) LEFT JOIN (ach_player_perk) ON (app_perk=ap_id AND app_player='".$user."') WHERE ap_achievement='".$this->id."' AND ap_parent IS NULL"); + $res = $DBc->sqlQuery("SELECT * FROM ach_perk LEFT JOIN (ach_perk_lang) ON (apl_lang='".$_USER->getLang()."' AND apl_perk=ap_id) LEFT JOIN (ach_player_perk) ON (app_perk=ap_id AND app_player='".$_USER->getID()."') WHERE ap_achievement='".$this->id."' AND ap_parent IS NULL"); #MISSING: or parent is done $sz = sizeof($res); for($i=0;$i<$sz;$i++) { #echo "Z"; - $tmp = new AchPerk($res[$i],$lang,$user); + $tmp = new AchPerk($res[$i],$this); #echo var_export($tmp,true); @@ -88,5 +89,20 @@ function getValueOpen() { return $this->nodes[$this->child_open[0]]->getValue(); } + + function getTemplate($insert = array()) { + if($this->template == null) { + return implode(";",$insert); + } + else { + $tmp = $this->template; + $match = array(); + preg_match_all('#\[([0-9]+)\]#', $this->template, $match); + foreach($match[0] as $key=>$elem) { + $tmp = str_replace("[".$match[1][$key]."]",$insert[$key],$tmp); + } + return $tmp; + } + } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements/class/AchCategory_class.php b/code/web/app/app_achievements/class/AchCategory_class.php new file mode 100644 index 000000000..995cb6a2a --- /dev/null +++ b/code/web/app/app_achievements/class/AchCategory_class.php @@ -0,0 +1,48 @@ +id = $id; + + $res = $DBc->sqlQuery("SELECT * FROM ach_achievement LEFT JOIN (ach_achievement_lang) ON (aal_lang='".$_USER->getLang()."' AND aal_achievement=aa_id) WHERE aa_category='".$this->id."' AND aa_parent IS NULL AND (aa_tie_race IS NULL OR aa_tie_race='".$_USER->getParam('race')."') AND (aa_tie_cult IS NULL OR aa_tie_cult='".$cult."') AND (aa_tie_civ IS NULL OR aa_tie_civ='".$civ."') ORDER by aal_name ASC"); + #MISSING: or parent is done + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + #echo "Y"; + $tmp = new AchAchievement($res[$i]); + #echo var_export($tmp,true); + if($tmp->hasOpen()) { + $this->child_open[] = sizeof($this->nodes); + } + if($tmp->hasDone()) { + $this->child_done[] = sizeof($this->nodes); + } + + $this->nodes[] = $tmp; + } + + $res = $DBc->sqlQuery("SELECT count(*) FROM ach_achievement WHERE aa_tie_cult IS NOT NULL"); + $this->ties_cult = $res[0]['anz']; + + $res = $DBc->sqlQuery("SELECT count(*) FROM ach_achievement WHERE aa_tie_civ IS NOT NULL"); + $this->ties_civ = $res[0]['anz']; + } + + function getID() { + return $this->id; + } + + function isTiedCult() { + return ($this->ties_cult > 0); + } + + function isTiedCiv() { + return ($this->ties_civ > 0); + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/include/AchCommon_class.php b/code/web/app/app_achievements/class/AchList_abstract.php similarity index 52% rename from code/web/app/app_achievements/include/AchCommon_class.php rename to code/web/app/app_achievements/class/AchList_abstract.php index e2200c5c5..707aef425 100644 --- a/code/web/app/app_achievements/include/AchCommon_class.php +++ b/code/web/app/app_achievements/class/AchList_abstract.php @@ -1,24 +1,4 @@ nodes); - } - - function getChild($i) { - return $this->nodes[$i]; - } - - function isEmpty() { - return (sizeof($this->nodes) == 0); - } - - function getChildren() { - return $this->nodes; - } - } - abstract class AchList extends RenderNodeIterator { protected $child_done = array(); protected $child_open = array(); diff --git a/code/web/app/app_achievements/include/AchMenu_class.php b/code/web/app/app_achievements/class/AchMenu_class.php similarity index 64% rename from code/web/app/app_achievements/include/AchMenu_class.php rename to code/web/app/app_achievements/class/AchMenu_class.php index 041b492fe..a432dbdb7 100644 --- a/code/web/app/app_achievements/include/AchMenu_class.php +++ b/code/web/app/app_achievements/class/AchMenu_class.php @@ -2,24 +2,24 @@ class AchMenu extends RenderNodeIterator { var $open; - function AchMenu($open = false,$lang = 'en') { - global $db; + function AchMenu($open = false) { + global $DBc,$_USER; $this->open = $open; $tmp = array(); $tmp['ac_id'] = 0; $tmp['ac_parent'] = null; - $tmp['acl_name'] = get_translation('ach_summary',$lang); + $tmp['acl_name'] = get_translation('ach_summary',$_USER->getLang()); $tmp['ac_image'] = ""; $tmp['ac_order'] = -1; $this->nodes[] = new AchMenuNode($tmp,$open,$lang); - $res = $db->sqlQuery("SELECT * FROM ach_category LEFT JOIN (ach_category_lang) ON (acl_lang='".$lang."' AND acl_category=ac_id) WHERE ac_parent IS NULL ORDER by ac_order ASC, acl_name ASC"); + $res = $DBc->sqlQuery("SELECT * FROM ach_category LEFT JOIN (ach_category_lang) ON (acl_lang='".$_USER->getLang()."' AND acl_category=ac_id) WHERE ac_parent IS NULL ORDER by ac_order ASC, acl_name ASC"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { - $this->nodes[] = new AchMenuNode($res[$i],$open,$lang); + $this->nodes[] = new AchMenuNode($res[$i],$open); } } @@ -46,8 +46,8 @@ private $image; private $order; - function AchMenuNode(&$data,$open,$lang) { - global $db; + function AchMenuNode(&$data,$open) { + global $DBc,$_USER; $this->id = $data['ac_id']; $this->parent = $data['ac_parent']; @@ -56,11 +56,11 @@ $this->order = $data['ac_order']; $this->open = ($this->id == $open); - $res = $db->sqlQuery("SELECT * FROM ach_category LEFT JOIN (ach_category_lang) ON (acl_lang='".$lang."' AND acl_category=ac_id) WHERE ac_parent='".$this->id."' ORDER by ac_order ASC, acl_name ASC"); + $res = $DBc->sqlQuery("SELECT * FROM ach_category LEFT JOIN (ach_category_lang) ON (acl_lang='".$_USER->getLang()."' AND acl_category=ac_id) WHERE ac_parent='".$this->id."' ORDER by ac_order ASC, acl_name ASC"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { - $this->nodes[] = new AchMenuNode($res[$i],$open,$lang); + $this->nodes[] = new AchMenuNode($res[$i],$open); } } diff --git a/code/web/app/app_achievements/include/AchObjective_class.php b/code/web/app/app_achievements/class/AchObjective_class.php similarity index 77% rename from code/web/app/app_achievements/include/AchObjective_class.php rename to code/web/app/app_achievements/class/AchObjective_class.php index d8a596b8c..2f36fad01 100644 --- a/code/web/app/app_achievements/include/AchObjective_class.php +++ b/code/web/app/app_achievements/class/AchObjective_class.php @@ -9,8 +9,8 @@ private $done; private $progress; - function AchObjective(&$data,$lang,$user) { - global $db; + function AchObjective(&$data) { + global $DBc,$_USER; $this->id = $data['ao_id']; $this->perk = $data['ao_perk']; @@ -23,7 +23,7 @@ $this->progress = $this->value; if(!$this->isDone()) { - $res = $db->sqlQuery("SELECT count(*) as anz FROM ach_player_atom,ach_atom WHERE apa_atom=atom_id AND atom_objective='".$this->id."' AND apa_player='".$user."'"); + $res = $DBc->sqlQuery("SELECT count(*) as anz FROM ach_player_atom,ach_atom WHERE apa_atom=atom_id AND atom_objective='".$this->id."' AND apa_player='".$_USER->getId()."'"); $this->progress = $res[0]['anz']; } } diff --git a/code/web/app/app_achievements/include/AchPerk_class.php b/code/web/app/app_achievements/class/AchPerk_class.php similarity index 63% rename from code/web/app/app_achievements/include/AchPerk_class.php rename to code/web/app/app_achievements/class/AchPerk_class.php index 30adff2e6..e6896e249 100644 --- a/code/web/app/app_achievements/include/AchPerk_class.php +++ b/code/web/app/app_achievements/class/AchPerk_class.php @@ -7,20 +7,20 @@ private $name; private $done; - function AchPerk(&$data,$lang,$user) { - global $db; + function AchPerk(&$data,&$parent) { + global $DBc,$_USER; $this->id = $data['ap_id']; - $this->parent = $data['ap_parent']; + $this->parent = $parent; $this->achievement = $data['ap_achievement']; $this->value = $data['ap_value']; $this->name = $data['apl_name']; $this->done = $data['app_date']; - $res = $db->sqlQuery("SELECT * FROM ach_objective LEFT JOIN (ach_objective_lang) ON (aol_lang='".$lang."' AND aol_objective=ao_id) LEFT JOIN (ach_player_objective) ON (apo_objective=ao_id AND apo_player='".$user."') WHERE ao_perk='".$this->id."'"); + $res = $DBc->sqlQuery("SELECT * FROM ach_objective LEFT JOIN (ach_objective_lang) ON (aol_lang='".$_USER->getLang()."' AND aol_objective=ao_id) LEFT JOIN (ach_player_objective) ON (apo_objective=ao_id AND apo_player='".$_USER->getID()."') WHERE ao_perk='".$this->id."'"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { - $this->nodes[] = new AchObjective($res[$i],$lang,$user); + $this->nodes[] = new AchObjective($res[$i]); } } @@ -41,7 +41,7 @@ } function getName() { - return $this->name; + return $this->parent->getTemplate(explode(";",$this->name)); } function objDrawable() { diff --git a/code/web/app/app_achievements/class/AchSummary_class.php b/code/web/app/app_achievements/class/AchSummary_class.php new file mode 100644 index 000000000..5a4c5b5b9 --- /dev/null +++ b/code/web/app/app_achievements/class/AchSummary_class.php @@ -0,0 +1,69 @@ +menu = $menu; + + //read all recent perks of user + //make distinct achievement list + + $res = $DBc->sqlQuery("SELECT DISTINCT aa_id,ach.*,(SELECT aal_name FROM ach_achievement_lang WHERE aal_lang='".$_USER->getLang()."' AND aal_achievement=ach.aa_id) as aal_name FROM ach_achievement as ach,ach_perk,ach_player_perk WHERE ap_achievement=aa_id AND app_player='".$_USER->getID()."' AND app_perk=ap_id ORDER by app_date DESC LIMIT 0,".($size-1)); + + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $tmp = new AchAchievement($res[$i]); + + $this->child_done[] = sizeof($this->nodes); + $this->nodes[] = $tmp; + } + } + + function getSummary() { + if(!is_array($this->stats)) { // only load if needed + //now we have to find the # of perks for each main menu entry + //and also sum up how many have been completed + $this->stats = array(); // [][name,done,total] + + $tmp = $this->menu->getChildren(); + foreach($tmp as $elem) { + if($elem->getID() == 0) { + continue; // skip summary page + } + $res = $this->sumStats($elem); + $this->stats[] = array($elem->getName(),$res[0],$res[1]); + } + } + + return $this->stats; + } + + private function sumStats(&$node) { + global $DBc,$_USER; + + $done = 0; + $total = 0; + + //read for current ID + //sum + $res = $DBc->sqlQuery("SELECT count(ap_id) as anz FROM ach_perk,ach_achievement,ach_player_perk WHERE aa_category='".$node->getID()."' AND ap_achievement=aa_id AND app_player='".$_USER->getID()."' AND app_perk=ap_id"); + $done += $res[0]["anz"]; + + $res = $DBc->sqlQuery("SELECT count(ap_id) as anz FROM ach_perk,ach_achievement WHERE aa_category='".$node->getID()."' AND ap_achievement=aa_id"); + $total += $res[0]["anz"]; + + $tmp = $node->getChildren(); + foreach($tmp as $elem) { + $res = $this->sumStats($elem); + $done += $res[0]; + $total += $res[1]; + } + + return array($done,$total); + + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/class/RenderNodeIteraor_abstract.php b/code/web/app/app_achievements/class/RenderNodeIteraor_abstract.php new file mode 100644 index 000000000..87ac9b460 --- /dev/null +++ b/code/web/app/app_achievements/class/RenderNodeIteraor_abstract.php @@ -0,0 +1,21 @@ +nodes); + } + + function getChild($i) { + return $this->nodes[$i]; + } + + function isEmpty() { + return (sizeof($this->nodes) == 0); + } + + function getChildren() { + return $this->nodes; + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/class/RyzomUser_class.php b/code/web/app/app_achievements/class/RyzomUser_class.php new file mode 100644 index 000000000..e2ac7ed7e --- /dev/null +++ b/code/web/app/app_achievements/class/RyzomUser_class.php @@ -0,0 +1,25 @@ +data = $data; + } + + function getID() { + return 1; + } + + function getLang() { + return $this->data['lang']; + } + + function isIG() { + return $this->data['ig']; + } + + function getParam($p) { + return $this->data[$p]; + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/include/AchCategory_class.php b/code/web/app/app_achievements/include/AchCategory_class.php deleted file mode 100644 index a18f523af..000000000 --- a/code/web/app/app_achievements/include/AchCategory_class.php +++ /dev/null @@ -1,32 +0,0 @@ -id = $id; - - $res = $db->sqlQuery("SELECT * FROM ach_achievement LEFT JOIN (ach_achievement_lang) ON (aal_lang='".$lang."' AND aal_achievement=aa_id) WHERE aa_category='".$this->id."' AND aa_parent IS NULL ORDER by aal_name ASC"); - #MISSING: or parent is done - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - #echo "Y"; - $tmp = new AchAchievement($res[$i],$lang,$user); - #echo var_export($tmp,true); - if($tmp->hasOpen()) { - $this->child_open[] = sizeof($this->nodes); - } - if($tmp->hasDone()) { - $this->child_done[] = sizeof($this->nodes); - } - - $this->nodes[] = $tmp; - } - } - - function getID() { - return $this->id; - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/include/AchSummary_class.php b/code/web/app/app_achievements/include/AchSummary_class.php deleted file mode 100644 index 836642f82..000000000 --- a/code/web/app/app_achievements/include/AchSummary_class.php +++ /dev/null @@ -1,69 +0,0 @@ -menu = $menu; - - //read all recent perks of user - //make distinct achievement list - - $res = $db->sqlQuery("SELECT DISTINCT aa_id,ach.*,(SELECT aal_name FROM ach_achievement_lang WHERE aal_lang='".$lang."' AND aal_achievement=ach.aa_id) as aal_name FROM ach_achievement as ach,ach_perk,ach_player_perk WHERE ap_achievement=aa_id AND app_player='".$user."' AND app_perk=ap_id ORDER by app_date DESC LIMIT 0,".($size-1)); - - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $tmp = new AchAchievement($res[$i],$lang,$user); - - $this->child_done[] = sizeof($this->nodes); - $this->nodes[] = $tmp; - } - } - - function getSummary($lang,$user) { - if(!is_array($this->stats)) { // only load if needed - //now we have to find the # of perks for each main menu entry - //and also sum up how many have been completed - $this->stats = array(); // [][name,done,total] - - $tmp = $this->menu->getChildren(); - foreach($tmp as $elem) { - if($elem->getID() == 0) { - continue; // skip summary page - } - $res = $this->sumStats($elem,$user); - $this->stats[] = array($elem->getName(),$res[0],$res[1]); - } - } - - return $this->stats; - } - - private function sumStats(&$node,$user) { - global $db; - - $done = 0; - $total = 0; - - //read for current ID - //sum - $res = $db->sqlQuery("SELECT count(ap_id) as anz FROM ach_perk,ach_achievement,ach_player_perk WHERE aa_category='".$node->getID()."' AND ap_achievement=aa_id AND app_player='".$user."' AND app_perk=ap_id"); - $done += $res[0]["anz"]; - - $res = $db->sqlQuery("SELECT count(ap_id) as anz FROM ach_perk,ach_achievement WHERE aa_category='".$node->getID()."' AND ap_achievement=aa_id"); - $total += $res[0]["anz"]; - - $tmp = $node->getChildren(); - foreach($tmp as $elem) { - $res = $this->sumStats($elem,$user); - $done += $res[0]; - $total += $res[1]; - } - - return array($done,$total); - - } - } -?> \ No newline at end of file diff --git a/code/web/app/app_achievements/include/ach_render_web.php b/code/web/app/app_achievements/include/ach_render_web.php index 6aead3225..6a8f05a06 100644 --- a/code/web/app/app_achievements/include/ach_render_web.php +++ b/code/web/app/app_achievements/include/ach_render_web.php @@ -1,7 +1,21 @@ sqlQuery("SELECT sum(ap_value) as anz FROM ach_perk,ach_player_perk WHERE ap_id=app_perk AND app_player='".$_USER->getID()."'"); + + $html = "

 ".$res[0]['anz']."
"; + + return $html; } function ach_render_menu(&$menu,$sub = 0) { @@ -160,9 +174,6 @@ $perk = $ach->getChild($elem); $html .= "
".$perk->getName()." ( ".date('d.m.Y',$perk->getDone())." ) ".$perk->getValue()."
"; } - /*if($perk->objDrawable()) { - $html .= "
".ach_render_obj_list($perk->getChildren()); - }*/ return $html; } @@ -254,13 +265,15 @@ function ach_render_obj_value(&$obj) { $html = ""; - if($obj->isdone()) { - $col = "#71BE02"; + if($obj->getName() != null) { + if($obj->isdone()) { + $col = "#71BE02"; + } + else { + $col = "#999999"; + } + $html .= "
".$obj->getName()."
"; } - else { - $col = "#999999"; - } - $html .= "
".$obj->getName()."
"; $html .= ach_render_progressbar($obj->getProgress(),$obj->getValue(),350); @@ -276,12 +289,12 @@ "; if(($prog/$val) > 0.85) { - $html .= " ".$prog." / ".$val." "; + $html .= " ".nf($prog)." / ".nf($val)." "; } $html .= " "; if(($prog/$val) <= 0.85) { - $html .= " ".$prog." / ".$val." "; + $html .= " ".nf($prog)." / ".nf($val)." "; } $html .= " @@ -290,12 +303,16 @@ return $html; } - function ach_render_summary_header($lang) { - return "
".get_translation('ach_summary_header',$lang)."
"; + function ach_render_summary_header() { + global $_USER; + + return "
".get_translation('ach_summary_header',$_USER->getLang())."
"; } - function ach_render_summary_footer($lang,&$summary,$user) { - $nodes = $summary->getSummary($lang,$user); + function ach_render_summary_footer(&$summary) { + global $_USER; + + $nodes = $summary->getSummary(); $html = ""; $sum_done = 0; @@ -323,10 +340,10 @@ } $html = "

-

".get_translation('ach_summary_stats',$lang)."
+
".get_translation('ach_summary_stats',$_USER->getLang())."
- + ".$html."
".get_translation('ach_summary_stats_total',$lang)."
".ach_render_progressbar($sum_done,$sum_total,450)."
".get_translation('ach_summary_stats_total',$_USER->getLang())."
".ach_render_progressbar($sum_done,$sum_total,450)."
"; diff --git a/code/web/app/app_achievements/index.php b/code/web/app/app_achievements/index.php index c3f44a8a8..858380bd1 100644 --- a/code/web/app/app_achievements/index.php +++ b/code/web/app/app_achievements/index.php @@ -13,7 +13,10 @@ require_once('conf.php'); // Ask to authenticate user (using ingame or session method) and fill $user with all information ryzom_app_authenticate($user, false); -if($user['ig']) { +require_once("class/RyzomUser_class.php"); +$_USER = new RyzomUser($user); + +if($_USER->isIG()) { require_once("include/ach_render_ig.php"); } else { @@ -21,20 +24,21 @@ else { } require_once("include/ach_render_common.php"); -require_once("include/AchCommon_class.php"); -require_once("include/AchMenu_class.php"); -require_once("include/AchSummary_class.php"); -require_once("include/AchCategory_class.php"); +require_once("class/RenderNodeIteraor_abstract.php"); +require_once("class/AchList_abstract.php"); -require_once("include/AchAchievement_class.php"); -require_once("include/AchPerk_class.php"); -require_once("include/AchObjective_class.php"); +require_once("class/AchMenu_class.php"); +require_once("class/AchSummary_class.php"); +require_once("class/AchCategory_class.php"); +require_once("class/AchAchievement_class.php"); +require_once("class/AchPerk_class.php"); +require_once("class/AchObjective_class.php"); // Update user acces on Db //$db = ryDB::getInstance(APP_NAME); -$db = ryDB::getInstance(APP_NAME); +$DBc = ryDB::getInstance(APP_NAME); /*$db->setDbDefs('test', array('id' => SQL_DEF_INT, 'num_access' => SQL_DEF_INT)); $num_access = $db->querySingleAssoc('test', array('id' => $user['id'])); @@ -49,11 +53,14 @@ $c = _t('access', $num_access['num_access']).'
';*/ #$c = var_export($user,true); $c = "
+ + + $open = $menu->getOpenCat(); if($open != 0) { - $cat = new AchCategory($open,1,$user['lang']); + if($_REQUEST['cult']) { + $cult = mysql_real_escape_string($_REQUEST['cult']); + } + else { + $cult = $_USER->getParam('cult'); + } + + if($_REQUEST['civ']) { + $civ = mysql_real_escape_string($_REQUEST['civ']); + } + else { + $civ = $_USER->getParam('civ'); + } + $cat = new AchCategory($open,$cult,$civ); } else { - $cat = new AchSummary($menu,1,8,$user['lang']); - $c .= ach_render_summary_header($user['lang']); + $cat = new AchSummary($menu,8); + $c .= ach_render_summary_header(); } $c .= ach_render_category($cat); if($open == 0) { - $c .= ach_render_summary_footer($user['lang'],$cat,1); + $c .= ach_render_summary_footer($cat,1); } $c .= "
".ach_render_yubopoints(1)."
"; #$_REQUEST['mid'] = 1; - $menu = new AchMenu($_REQUEST['cat'],$user['lang']); + $menu = new AchMenu($_REQUEST['cat']); $c .= ach_render_menu($menu); @@ -67,22 +74,35 @@ $c .= "
"; -echo ryzom_app_render("achievements", $c, $user['ig']); +echo ryzom_app_render("achievements", $c, $_USER->isIG()); ?>