Question

J'ai la users table des utilisateurs, où je stocke des informations telles que post_count et ainsi de suite. Je veux avoir ~ 50 badges et il va être encore plus que cela à l'avenir.

, je veux donc avoir une page où membre du site pourrait aller prendre le badge, pas lui donner automatiquement comme dans SO. Et après, il clique sur un bouton appelé smth comme « Take 'Made 10 messages de badge » les système vérifie s'il a posté 10 messages et n'a pas ce badge déjà, et si elle est ok, donnez-lui le badge et l'insérer dans la nouvelle id tableau et user_id de l'insigne que membre ne pouvait pas prendre deux fois.

Mais j'ai tant de badges, donc ai-je vraiment besoin de mettre tant de si pour vérifier de tous les badges? Quelle serait votre suggestion à ce sujet? Comment puis-je le rendre plus optimale si elle est possible?

Merci.

Était-ce utile?

La solution

optimale serait à mon humble avis la suivante:

ont un objet pour l'utilisateur avec des fonctions que les attributs de spécifiques de l'utilisateur de retour / paramètres que vous initialisez avec l'identifiant d'utilisateur approprié (vous avez probablement envie de faire ce un singleton / statique pour certains éléments ...):

<?
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
 }
}
?>

ont un objet badge qui est initialisés avec un id dépendances / clés et charges à partir de votre base de données:

<?
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;
 }
}
?>

vous pourriez alors une classe qui contrôle l'attribution des lots (vous pouvez aussi le faire à l'intérieur de l'utilisateur ...) et vérifie les dépendances et les impressions ont échoué dépendances etc ...

  <?
        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);
    }
    }
        }
        ?>

vous pouvez étendre à cette classe si vous avez des lots très personnalisés qui nécessitent des calculs étranges.

espère que je vous ai fait sur la bonne voie. etp est non testé robably pleine d'erreurs de syntaxe. bienvenue dans le monde de la programmation orientée objet. veux toujours le faire?

Autres conseils

Peut-être jeter les informations dans une table et vérifier contre cela? Si elle est basée sur le nombre de postes, ont des champs pour badge_name et post_count et vérifier cette façon?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top