Реализация не автоматических значков с PHP и MySQL
Вопрос
У меня есть таблица пользователей users
, где я храним информацию, как post_count
и так далее. Я хочу иметь ~ 50 значков, и это будет даже больше, чем в будущем.
Итак, я хочу иметь страницу, где может пойти и принять значок, а не автоматически давать ему так. И после того, как он нажимает кнопку, называемую SMTH, например, «riew» сделал 10 сообщений «Значок». Система проверяет, если он разместил 10 сообщений и не имеет этого значка, и если все в порядке, дайте ему значок и вставить в новую Таблица идентификатора значка и user_id этот член не мог взять его дважды.
Но у меня так много значков, поэтому мне действительно нужно положить так много, если бы проверить на всех значках? Что было бы ваше предложение по этому поводу? Как я могу сделать его более оптимальным, если это даже возможно?
Спасибо.
Решение
Оптимальный был бы имхо то следующее:
Имейте объект для пользователя с функциями, которые возвращают пользовательские атрибуты / метрики, которые вы инициализируете с правильным идентификатором пользователя (вы, вероятно, хотите сделать этот синглтон / статичный для некоторых элементов ...):
<?
class User {
public function initUser($id) {
/* initialise the user. maby load all metrics now, or if they
are intensive on demand when the functions are called.
you can cache them in a class variable*/
}
public function getPostCount() {
// return number of posts
}
public function getRegisterDate() {
// return register date
}
public function getNumberOfLogins() {
// return the number of logins the user has made over time
}
}
?>
Имейте объект значка, который инициализирован с идентификатором / ключом и загрузки зависимостей из вашей базы данных:
<?
class Badge {
protected $dependencies = array();
public function initBadge($id) {
$this->loadDependencies($id);
}
protected function loadDependencies() {
// load data from mysql and store it into dependencies like so:
$dependencies = array(array(
'value' => 300,
'type' => 'PostCount',
'compare => 'greater',
),...);
$this->dependencies = $dependencies;
}
public function getDependencies() {
return $this->dependencies;
}
}
?>
Тогда у вас может быть класс, который контролирует награждение партий (вы также можете сделать это внутри пользователя ...) и проверяет зависимости и отпечатки неудачных зависимостей и т. Д.
<?
class BadgeAwarder {
protected $badge = null;
protected $user = null;
public function awardBadge($userid,$badge) {
if(is_null($this->badge)) {
$this->badge = new Badge; // or something else for strange freaky badges, passed by $badge
}
$this->badge->initBadge($badge);
if(is_null($this->user)) {
$this->user = new User;
$this->user->initUser($userid);
}
$allowed = $this->checkDependencies();
if($allowed === true) {
// grant badge, print congratulations
} else if(is_array($failed)) {
// sorry, you failed tu full fill thef ollowing dependencies: print_r($failed);
} else {
echo "error?";
}
}
protected function checkDependencies() {
$failed = array();
foreach($this->badge->getDependencies() as $depdency) {
$value = call_user_func(array($this->badge, 'get'.$depdency['type']));
if(!$this->compare($value,$depdency['value'],$dependency['compare'])) {
$failed[] = $dependency;
}
}
if(count($failed) > 0) {
return $failed;
} else {
return true;
}
}
protected function compare($val1,$val2,$operator) {
if($operator == 'greater') {
return ($val1 > $val2);
}
}
}
?>
Вы можете распространяться на этот класс, если у вас очень пользовательские партии, которые требуют странных расчетов.
Надеюсь, я привел вас на правильный путь. непроверенный Andp обозначает ошибку синтаксиса. Добро пожаловать в мир объектно-ориентированного программирования. Все еще хочу сделать это?
Другие советы
Может быть, бросить информацию в стол и проверьте на этом? Если он основан на количестве постов, имеют поля для badge_name
а также post_count
И проверьте этот путь?