diff --git a/includes/class.achievement.php b/includes/class.achievement.php index d2c56c8c..0609dc4c 100644 --- a/includes/class.achievement.php +++ b/includes/class.achievement.php @@ -13,9 +13,9 @@ class AchievementList extends BaseType protected $setupQuery = 'SELECT *, id AS ARRAY_KEY FROM ?_achievement WHERE [filter] [cond] GROUP BY Id ORDER BY `orderInGroup` ASC'; protected $matchQuery = 'SELECT COUNT(1) FROM ?_achievement WHERE [filter] [cond]'; - public function __construct($conditions) + public function __construct($conditions, $applyFilter = false) { - parent::__construct($conditions); + parent::__construct($conditions, $applyFilter); // post processing while ($this->iterate()) diff --git a/includes/class.filter.php b/includes/class.filter.php index 143ec2bf..4c41d1f3 100644 --- a/includes/class.filter.php +++ b/includes/class.filter.php @@ -251,4 +251,157 @@ abstract class Filter abstract protected function createSQLForValues($vl); } + +class AchievementListFilter extends Filter +{ + protected function createSQLForCriterium($cr) + { + if ($r = $this->createSQLForCommunity($cr)) + return $r; + + switch ($cr[0]) + { + case 2: // gives a reward [y|n] + return 'reward_loc0 '.($this->int2Bool($cr[1]) ? '<>' : '=').' \'\''; + case 3: // reward text [str] + return 'reward_loc'.User::$localeId.' LIKE \'%'.Util::sqlEscape($cr[2]).'%\''; + // case 4: // location [int] + // return ''; // no plausible locations parsed yet + case 5: // first in series [y|n] + return $this->int2Bool($cr[1]) ? '(series <> 0 AND (series & 0xFFFF0000) = 0)' : '(series & 0xFFFF0000) <> 0'; + case 6: // last in series [y|n] + return $this->int2Bool($cr[1]) ? '(series <> 0 AND (series & 0xFFFF) = 0)' : '(series & 0xFFFF) <> 0'; + case 7: // part of series [y|n] + return 'series '.($this->int2Bool($cr[1]) ? '<>' : '=').' 0'; + case 9: // Id [op] [int] + return 'id '.$this->int2Op($cr[1]).' '.intVal($cr[2]); + case 10: // Icon [str] + return 'iconString LIKE \'%'.Util::sqlEscape($cr[2]).'%\''; + // case 11: // Related Event [int] + // return ''; // >0:holidayId; -2323:any; -2324:none + case 18: // flags (staff only) + if (User::isInGroup(U_GROUP_STAFF)) + return 'flags &'.(1 << max($cr[1] - 1, 0)) ; + default: + return '1'; + } + } + + protected function createSQLForValues($vl) + { + $parts = []; + + // name ex: +description, +rewards + if (isset($vl['na'])) + { + if (isset($vl['ex']) && $vl['ex'] == 'on') + $parts[] = '(name_loc'.User::$localeId.' LIKE "%'.Util::sqlEscape($vl['na']).'%" OR description_loc'.User::$localeId.' LIKE "%'.Util::sqlEscape($vl['na']).'%" OR reward_loc'.User::$localeId.' LIKE "%'.Util::sqlEscape($vl['na']).'%")'; + else + $parts[] = 'name_loc'.User::$localeId.' LIKE "%'.Util::sqlEscape($vl['na']).'%"'; + } + + // points min + if (isset($vl['minpt'])) + $parts[] = 'points >= '.intVal($vl['minpt']); + + // points max + if (isset($vl['maxpt'])) + $parts[] = 'points <= '.intVal($vl['maxpt']); + + // faction (side) + if (isset($vl['si'])) + { + if ($vl['si'] == 3) // both + $parts[] = 'faction = '.intVal($vl['si']); + else if ($vl['si'] > 0) // faction, inclusive both + $parts[] = '(faction = 3 OR faction = '.intVal($vl['si']).')'; + else if ($vl['si'] < 0) // faction, exclusive both + $parts[] = 'faction = '.intVal(-$vl['si']); + + } + + return $parts; + } +} + + +// missing filter: "Available to Players" +class ItemsetListFilter extends Filter +{ + protected function createSQLForCriterium($cr) + { + if ($r = $this->createSQLForCommunity($cr)) + return $r; + + switch ($cr[0]) + { + case 2: // Id + return 'id '.$this->int2Op($cr[1]).' '.intVal($cr[2]); + case 3: // pieces [int] + return '(IF(item1 > 0, 1, 0) + IF(item2 > 0, 1, 0) + IF(item3 > 0, 1, 0) + IF(item4 > 0, 1, 0) + IF(item5 > 0, 1, 0) + + IF(item6 > 0, 1, 0) + IF(item7 > 0, 1, 0) + IF(item8 > 0, 1, 0) + IF(item9 > 0, 1, 0) + IF(item10 > 0, 1, 0)) ' .$this->int2Op($cr[1]).' '.intVal($cr[2]); + case 4: // bonustext [str] + return 'bonusText_loc'.User::$localeId.' LIKE \'%'.Util::sqlEscape($cr[2]).'%\''; + case 5: // heroic [y|n] + return 'heroic = '.($cr[1] == 1 ? '1' : '0'); + case 6: // related event [int] + $hId = intVal($cr[1]); // >0:holidayId; -2323:any; -2324:none + if ($hId == -2323) + return 'holidayId <> 0'; + + if ($hId == -2324) + $hId = 0; + + return 'holidayId = '.$hId; + // case 12: // available to players [y|n] + // return ''; // ugh .. scan loot, quest and vendor templates and write to ?_itemset + default: + return '1'; + } + } + + protected function createSQLForValues($vl) + { + $parts = []; + + //string (extended) + if (isset($vl['na'])) + $parts[] = 'name_loc'.User::$localeId.' LIKE "%'.Util::sqlEscape($vl['na']).'%"'; + + // quality [list] + if (isset($vl['qu'])) + $parts[] = 'quality IN ('.implode(', ', (array)$vl['qu']).')'; + + // type + if (isset($vl['ty'])) + $parts[] = 'type IN ('.implode(', ', (array)$vl['ty']).')'; + + // itemLevel min + if (isset($vl['minle'])) + $parts[] = 'minLevel >= '.intVal($vl['minle']); + + // itemLevel max + if (isset($vl['maxle'])) + $parts[] = 'maxLevel <= '.intVal($vl['maxle']); + + // reqLevel min + if (isset($vl['minrl'])) + $parts[] = 'i.reqLevel <= '.intVal($vl['minle']); + + // reqLevel max + if (isset($vl['maxrl'])) + $parts[] = 'i.reqLevel <= '.intVal($vl['maxle']); + + // class + if (isset($vl['cl'])) + $parts[] = 'classMask & '.$this->list2Mask($vl['cl'] - 1); + + // tag + if (isset($vl['ta'])) + $parts[] = 'contentGroup = '.$vl['ta']; + + return $parts; + } +} + ?> diff --git a/includes/class.quest.php b/includes/class.quest.php index 77264d01..bcaf4530 100644 --- a/includes/class.quest.php +++ b/includes/class.quest.php @@ -93,7 +93,7 @@ class QuestList extends BaseType while ($this->iterate()) { - $set = array( + $data[$this->id] = array( 'category' => $this->cat1, 'category2' => $this->cat2, 'id' => $this->id, @@ -114,13 +114,13 @@ class QuestList extends BaseType $choices[] = [$this->curTpl['RewardChoiceItemId'.$i], $this->curTpl['RewardChoiceItemCount'.$i]]; if ($rewards) - $set['itemrewards'] = $rewards; + $data[$this->id]['itemrewards'] = $rewards; if ($choices) - $set['itemchoices'] = $choices; + $data[$this->id]['itemchoices'] = $choices; if ($this->curTpl['RewardTitleId']) - $set['titlereward'] = $this->curTpl['RewardTitleId']; + $data[$this->id]['titlereward'] = $this->curTpl['RewardTitleId']; // todo reprewards .. accesses QuestFactionReward.dbc } diff --git a/pages/achievement.php b/pages/achievement.php index 8f07b25c..86e122a3 100644 --- a/pages/achievement.php +++ b/pages/achievement.php @@ -56,7 +56,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) if ($acv->error) $smarty->notFound(Lang::$achievement['achievement']); - $pageData['path'] = []; + $pageData['path'] = []; $pageData['title'] = [ucfirst(Lang::$achievement['achievement'])]; // create page title and path @@ -75,17 +75,18 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) $acv->addRewardsToJscript($pageData); $pageData['page'] = $acv->getDetailedData()[$id]; $acv->reset(); + // infobox content switch ($acv->getField('faction')) { case 0: - $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$game['alliance'].''; + $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$game['si'][SIDE_ALLIANCE].''; break; case 1: - $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$game['horde'].''; + $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$game['si'][SIDE_HORDE].''; break; default: // case 3 - $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$main['both']; + $pageData['page']['infoBox'][] = Lang::$main['side'].': '.Lang::$game['si'][SIDE_BOTH]; } // todo: crosslink with charactersDB to check if realmFirsts are still available @@ -98,7 +99,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) ['id', $id, '!'] ); $saList = new AchievementList($conditions); - $pageData['page']['saData'] = $saList->getListviewData(); + $pageData['page']['saData'] = $saList->getListviewData(); $pageData['page']['saParams'] = array( 'id' => 'see-also', 'name' => '$LANG.tab_seealso', @@ -116,7 +117,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) if (!empty($refs)) { $coList = new AchievementList(array(['id', $refs])); - $pageData['page']['coData'] = $coList->getListviewData(); + $pageData['page']['coData'] = $coList->getListviewData(); $pageData['page']['coParams'] = array( 'id' => 'criteria-of', 'name' => '$LANG.tab_criteriaof', @@ -149,7 +150,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) { // hide hidden criteria for regular users (really do..?) // if (($crt['complete_flags'] & ACHIEVEMENT_CRITERIA_FLAG_HIDDEN) && User::$perms > 0) - // continue; + // continue; // alternative display option $displayMoney = $crt['complete_flags'] & ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER; @@ -328,10 +329,10 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) if ($acv->getField('series')) { $pageData['page']['series'] = array( - array( - 'id' => $id, - 'name' => $acv->names[$id], - 'parent' => $acv->getField('series') >> 16, + array( + 'id' => $id, + 'name' => $acv->names[$id], + 'parent' => $acv->getField('series') >> 16, ) ); $tmp = $pageData['page']['series'][0]; diff --git a/pages/achievements.php b/pages/achievements.php new file mode 100644 index 00000000..13df13db --- /dev/null +++ b/pages/achievements.php @@ -0,0 +1,136 @@ + true, + 96 => [14861, 14862, 14863], + 97 => [14777, 14778, 14779, 14780], + 95 => [165, 14801, 14802, 14803, 14804, 14881, 14901, 15003], + 168 => [14808, 14805, 14806, 14921, 14922, 14923, 14961, 14962, 15001, 15002, 15041, 15042], + 169 => [170, 171, 172], + 201 => [14864, 14865, 14866], + 155 => [160, 187, 159, 163, 161, 162, 158, 14981, 156, 14941], + 81 => true, + 1 => array ( + 130 => [140, 145, 147, 191], + 141 => true, + 128 => [135, 136, 137], + 122 => [123, 124, 125, 126, 127], + 133 => true, + 14807 => [14821, 14822, 14823, 14963, 15021, 15062], + 132 => [178, 173], + 134 => true, + 131 => true, + 21 => [152, 153, 154] + ) +); + +$valid = false; +switch (count($cats)) +{ + case 0: + $valid = true; + case 1: + $valid = !$cats[0] || isset($validCats[$cats[0]]); + break; + case 2: + $valid = $cats[0] == 1 ? isset($validCats[$cats[0]][$cats[1]]) : isset($validCats[$cats[0]]) && in_array($cats[1], $validCats[$cats[0]]); + break; + case 3: + $valid = $cats[0] == 1 ? isset($validCats[$cats[0]][$cats[1]]) && in_array($cats[2], $validCats[$cats[0]][$cats[1]]) : false; + break; +} +if (!$valid) + $smarty->error(); + +if (!$smarty->loadCache($cacheKey, $pageData)) +{ + // include child categories if current category is empty + $condition = !$cats[0] ? null : (int)end($cats); + $acvList = new AchievementList($condition ? [['category', $condition]] : [], true); + if (!$acvList->matches) + { + $curCats = $catList = [$condition]; + while ($curCats) + { + $curCats = DB::Aowow()->SelectCol('SELECT Id FROM ?_achievementCategory WHERE parentCategory IN (?a)', $curCats); + $catList = array_merge($catList, $curCats); + } + $acvList = new AchievementList($catList ? [['category', $catList]] : [], true); + } + + // recreate form selection + $filter['query'] = isset($_GET['filter']) ? $_GET['filter'] : NULL; + $filter['setCr'] = $acvList->filterGetSetCriteria(); + $filter = array_merge($acvList->filterGetForm(), $filter); + + // create page title and path + if (is_array($cats)) + { + $catrows = DB::Aowow()->Select('SELECT * FROM ?_achievementcategory WHERE id IN (?a)', + $cats + ); + + foreach ($catrows as $cat) + { + $path[] = $cat['id']; + $title[] = Util::localizedString($cat, 'name'); + } + array_unshift($title, ucFirst(Lang::$achievement['achievements'])); + } + + // fill g_items, g_titles, g_achievements + $acvList->addGlobalsToJscript($pageData); + $acvList->addRewardsToJScript($pageData); + + // listview content + $pageData['data'] = $acvList->getListviewData(); + $pageData['params'] = ['tabs' => false]; + + // if we are have different cats display field + if ($acvList->hasDiffCategories()) + $pageData['params']['visibleCols'] = "$['category']"; + + // create note if search limit was exceeded + if ($acvList->matches > $AoWoWconf['sqlLimit']) + $pageData['params']['note'] = '$'.sprintf(Util::$filterResultString, 'LANG.lvnote_achievementsfound', $acvList->matches, $AoWoWconf['sqlLimit']); + + if ($acvList->filterGetError()) + $pageData['params']['_errors'] = '$1'; + + $smarty->saveCache($cacheKey, $pageData); +} + + +$page = array( + 'tab' => 0, // for g_initHeader($tab) + 'subCat' => $pageParam ? '='.$pageParam : '', + 'title' => implode(" - ", $title), + 'path' => "[".implode(", ", $path)."]", + 'reqJS' => array( + array('path' => 'template/js/filters.js', 'conditional' => false), + ), +); + +// sort for dropdown-menus +asort(Lang::$game['si']); + +$smarty->updatePageVars($page); +$smarty->assign('filter', $filter); +$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$achievement)); +$smarty->assign('mysql', DB::Aowow()->getStatistics()); +$smarty->assign('lvData', $pageData); +$smarty->display('achievements.tpl'); + +?> diff --git a/pages/classes.php b/pages/classes.php new file mode 100644 index 00000000..275eaa82 --- /dev/null +++ b/pages/classes.php @@ -0,0 +1,37 @@ +loadCache($cacheKey, $pageData)) +{ + $classes = new CharClassList(); + + $pageData = array( + 'file' => 'class', + 'data' => $classes->getListviewData(), + 'params' => array( + 'tabs' => false + ) + ); + + $smarty->saveCache($cacheKey, $pageData); +} + + +$page = array( + 'tab' => 0, // for g_initHeader($tab) + 'title' => ucFirst(Lang::$game['classes']), + 'path' => "[0, 12]", +); + +$smarty->updatePageVars($page); +$smarty->assign('lang', Lang::$main); +$smarty->assign('mysql', DB::Aowow()->getStatistics()); +$smarty->assign('lvData', $pageData); +$smarty->display('generic-no-filter.tpl'); + +?> diff --git a/pages/currencies.php b/pages/currencies.php new file mode 100644 index 00000000..b84de3f6 --- /dev/null +++ b/pages/currencies.php @@ -0,0 +1,52 @@ +error(); + +if (isset($cat)) +{ + $path[] = $cat; // should be only one parameter anyway + array_unshift($title, Lang::$currency['cat'][$cat]); +} + +if (!$smarty->loadCache($cacheKey, $pageData)) +{ + $money = new CurrencyList(isset($cat) ? array(['category', (int)$cat]) : []); + + $pageData = array( + 'file' => 'currency', + 'data' => $money->getListviewData(), + 'params' => array( + 'tabs' => false + ) + ); + + $money->addGlobalsToJscript($pageData); + + $smarty->saveCache($cacheKey, $pageData); +} + + +$page = array( + 'tab' => 0, // for g_initHeader($tab) + 'title' => implode(" - ", $title), + 'path' => "[".implode(", ", $path)."]" +); + +$smarty->updatePageVars($page); +$smarty->assign('lang', Lang::$main); +$smarty->assign('mysql', DB::Aowow()->getStatistics()); +$smarty->assign('lvData', $pageData); +$smarty->display('generic-no-filter.tpl'); + +?> diff --git a/pages/events.php b/pages/events.php index e9c3c990..c1f81abf 100644 --- a/pages/events.php +++ b/pages/events.php @@ -49,10 +49,10 @@ if (!$smarty->loadCache($cacheKey, $pageData)) $pageData = array( 'file' => 'event', - 'data' => $events->getListviewData(), - 'deps' => $deps, + 'data' => $events->getListviewData(), + 'deps' => $deps, 'calendar' => false, // todo: fix it Felix! - 'params' => array( + 'params' => array( 'tabs' => '$myTabs' ) ); diff --git a/pages/itemsets.php b/pages/itemsets.php new file mode 100644 index 00000000..c4c48d2c --- /dev/null +++ b/pages/itemsets.php @@ -0,0 +1,65 @@ +loadCache($cacheKey, $pageData)) +{ + $itemsets = new ItemsetList([], true); // class selection is via filter, nothing applies here + + $itemsets->addGlobalsToJscript($pageData); + + // recreate form selection + $filter['query'] = isset($_GET['filter']) ? $_GET['filter'] : NULL; + $filter['setCr'] = $itemsets->filterGetSetCriteria(); + $filter = array_merge($itemsets->filterGetForm(), $filter); + + if (isset($filter['cl'])) + $path[] = $filter['cl']; + + // listview content + $pageData['data'] = $itemsets->getListviewData(); + $pageData['params'] = ['tabs' => false]; + + // create note if search limit was exceeded + if ($itemsets->matches > $AoWoWconf['sqlLimit']) + $pageData['params']['note'] = '$'.sprintf(Util::$filterResultString, 'LANG.lvnote_itemsetsfound', $itemsets->matches, $AoWoWconf['sqlLimit']); + + if ($itemsets->filterGetError()) + $pageData['params']['_errors'] = '$1'; + + $smarty->saveCache($cacheKey, $pageData); +} + + +$page = array( + 'tab' => 0, // for g_initHeader($tab) + 'subCat' => $pageParam ? '='.$pageParam : '', + 'title' => ucFirst(Lang::$game['itemsets']), + 'path' => json_encode($path, JSON_NUMERIC_CHECK), + 'reqJS' => array( + array('path' => 'template/js/filters.js', 'conditional' => false), + array('path' => '?data=weight-presets', 'conditional' => false), + ) +); + +// sort for dropdown-menus +asort(Lang::$itemset['notes'], SORT_NATURAL); +asort(Lang::$game['cl']); + +$smarty->updatePageVars($page); +$smarty->assign('filter', $filter); +$smarty->assign('lang', array_merge(Lang::$main, Lang::$game, Lang::$itemset, Lang::$item)); +$smarty->assign('mysql', DB::Aowow()->getStatistics()); +$smarty->assign('lvData', $pageData); +$smarty->display('itemsets.tpl'); + +?> diff --git a/pages/races.php b/pages/races.php new file mode 100644 index 00000000..891ea837 --- /dev/null +++ b/pages/races.php @@ -0,0 +1,37 @@ +loadCache($cacheKey, $pageData)) +{ + $races = new CharRaceList(array(['side', 0, '!'])); // only playable + + $pageData = array( + 'file' => 'race', + 'data' => $races->getListviewData(), + 'params' => array( + 'tabs' => false + ) + ); + + $smarty->saveCache($cacheKey, $pageData); +} + + +$page = array( + 'tab' => 0, // for g_initHeader($tab) + 'title' => ucFirst(Lang::$game['races']), + 'path' => "[0, 13]", +); + +$smarty->updatePageVars($page); +$smarty->assign('lang', Lang::$main); +$smarty->assign('mysql', DB::Aowow()->getStatistics()); +$smarty->assign('lvData', $pageData); +$smarty->display('generic-no-filter.tpl'); + +?> diff --git a/pages/title.php b/pages/title.php index b926933b..b9a01360 100644 --- a/pages/title.php +++ b/pages/title.php @@ -58,7 +58,7 @@ if (!$smarty->loadCache($cacheKeyPage, $pageData)) $pageData['page']['questParams'] = array( 'id' => 'reward-from-quest', 'name' => '$LANG.tab_rewardfrom', - 'hiddenCols' => "$['side']", + 'hiddenCols' => "$['experience', 'money']", 'visibleCols' => "$['category']" ); break; diff --git a/template/achievement.tpl b/template/achievement.tpl new file mode 100644 index 00000000..e04e16e8 --- /dev/null +++ b/template/achievement.tpl @@ -0,0 +1,167 @@ +{include file='header.tpl'} + +
+
+
+{if !empty($announcements)} + {foreach from=$announcements item=item} + {include file='bricks/announcement.tpl' an=$item} + {/foreach} +{/if} + + + + + +{strip}{*************** CHAIN ​​OF ACHIEVEMENTS ***************} + {if isset($lvData.page.series)} + + + + {/if} + {/strip}{*************** / CHAIN ​​OF ACHIEVEMENTS ***************} + + + + +
{$lang.quickFacts}
+
    + {if $lvData.page.points}
  • {$lang.points}: {$lvData.page.points}
  • {/if} + {foreach from=$lvData.page.infoBox item=info} +
  • {$info}
  • + {/foreach} + {*
  • Location: {$lvData.page.location}
  • todo: need to be parsed first *} +
+
{$lang.series}
+ + {section name=i loop=$lvData.page.series} + + + + + {/section} +
{$smarty.section.i.index+1}. + {if ($lvData.page.series[i].id == $lvData.page.id)} + {$lvData.page.series[i].name} + {else} + + {/if} +
+
{$lang.screenshots}
{$lang.videos}
+ + + +
+ +
+ + + + + {$lang.link}{$lang.link} + WowheadWowhead +

{$lvData.page.name}

+ + {$lvData.page.description} + + {if !empty($lvData.page.criteria)}

{$lang.criteria}{if $lvData.page.count} – {$lang.requires} {$lvData.page.count} {$lang.outOf} {$lvData.page.total_criteria}{/if}

{/if} + +
+ + {strip} + {foreach from=$lvData.page.criteria item=cr name=criteria} + + + {* for reference and standard entries *} + {if !isset($cr.icon) && (isset($cr.link) || $cr.standard)} +
  •  
+ {/if} + +
+ + {* If the first column is over (it may be a greater element) *} + {if $smarty.foreach.criteria.index+1 == round(count($lvData.page.criteria) / 2)} +
+ {if isset($cr.link)}{$cr.link.text|escape:"html"}{if isset($cr.link.count) && $cr.link.count > 1} ({$cr.link.count}){/if}{/if} + + {* STANDARD TEXT *} + {if isset($cr.extra_text)} {$cr.extra_text}{/if} + {if $user.roles > 0} [{$cr.id}]{/if} +
+
+
+ + {/if} + {/foreach} + {/strip} +
+
+ + {strip} + + {/strip} + + +
+ + {* for items *} + {if $lvData.page.itemReward} +

{$lang.rewards}

+ {$lang.itemReward} + + {foreach from=$lvData.page.itemReward item=i name=item key=id} + + {/foreach} + + +
{$i.name}
+ {/if} + + {* for titles *} + {if $lvData.page.titleReward} +

{$lang.gains}

+
    + {foreach from=$lvData.page.titleReward item=i} +
  • {$i}
  • + {/foreach} +
+ {/if} + +

{$lang.related}

+ +
+ +
+
+ + +{include file='bricks/contribute.tpl'} + +
+
+ +{include file='footer.tpl'} \ No newline at end of file diff --git a/template/achievements.tpl b/template/achievements.tpl new file mode 100644 index 00000000..892e100b --- /dev/null +++ b/template/achievements.tpl @@ -0,0 +1,74 @@ +{include file='header.tpl'} + +
+
+
+ +{if !empty($announcements)} + {foreach from=$announcements item=item} + {include file='bricks/announcement.tpl' an=$item} + {/foreach} +{/if} + + + +
+
+ + + + + + + + + + +
{$lang.name}: + + + + +
  
+
{$lang.side}:   + + + +
   {$lang.points}:   -
+
+
{$lang.addFilter}
+
{$lang.match}:
+ +
+ +
+ + +
{$lang.refineSearch}
+
+
+
+ + + +
+ + +
+
+
+ +{include file='footer.tpl'} \ No newline at end of file diff --git a/template/bricks/contrib_0.tpl b/template/bricks/contrib_0.tpl new file mode 100644 index 00000000..b22c3b1f --- /dev/null +++ b/template/bricks/contrib_0.tpl @@ -0,0 +1,120 @@ +{if $user.id > 0} + + + +{else} + + + +{/if} diff --git a/template/bricks/contrib_2.tpl b/template/bricks/contrib_2.tpl new file mode 100644 index 00000000..52e9800c --- /dev/null +++ b/template/bricks/contrib_2.tpl @@ -0,0 +1,120 @@ +{if $user.id > 0} + + + +{else} + + + +{/if} diff --git a/template/bricks/contrib_3.tpl b/template/bricks/contrib_3.tpl new file mode 100644 index 00000000..17edad85 --- /dev/null +++ b/template/bricks/contrib_3.tpl @@ -0,0 +1,128 @@ +{if $user.id > 0} + + + + + +{else} + + + + + +{/if} diff --git a/template/bricks/contrib_6.tpl b/template/bricks/contrib_6.tpl new file mode 100644 index 00000000..859bd2b3 --- /dev/null +++ b/template/bricks/contrib_6.tpl @@ -0,0 +1,120 @@ +{if $user.id > 0} + + + +{else} + + + +{/if} \ No newline at end of file diff --git a/template/bricks/contrib_8.tpl b/template/bricks/contrib_8.tpl new file mode 100644 index 00000000..860a3b49 --- /dev/null +++ b/template/bricks/contrib_8.tpl @@ -0,0 +1,120 @@ +{if $user.id > 0} + + + +{else} + + + +{/if} diff --git a/template/bricks/contribute.tpl b/template/bricks/contribute.tpl new file mode 100644 index 00000000..c9e8a714 --- /dev/null +++ b/template/bricks/contribute.tpl @@ -0,0 +1,18 @@ +
+

{$lang.contribute}

+
+
+
+
+{include file="bricks\contrib_`$user.locale`.tpl"} +
+
+ +
diff --git a/template/itemsets.tpl b/template/itemsets.tpl new file mode 100644 index 00000000..469655b6 --- /dev/null +++ b/template/itemsets.tpl @@ -0,0 +1,105 @@ +{include file='header.tpl'} + +
+
+
+ +{if !empty($announcements)} + {foreach from=$announcements item=item} + {include file='bricks/announcement.tpl' an=$item} + {/foreach} +{/if} + + + +
+
+
+
Quality:
clear +
+ +
+ +
+
Type:
clear +
+ +
+ + + + + + + + + + + + + + +
{$lang.name}:  
Level:   - + + + +
   Required level:   -
+
Class: + + + + + +
   Tag:   +
+
+ +
+
{$lang.addFilter}
+
{$lang.match}:
+ +
+ +
+
{$lang.refineSearch}
+ +
+
+
+ + + +
+ + +
+
+
+ +{include file='footer.tpl'}