Реализация не автоматических значков с PHP и MySQL

StackOverflow https://stackoverflow.com/questions/3788192

  •  05-10-2019
  •  | 
  •  

Вопрос

У меня есть таблица пользователей 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 И проверьте этот путь?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top