Frage

Ich habe Benutzer Tabelle users, wo ich Informationen speichern, wie post_count und so weiter. Ich möchte ~ 50 Abzeichen haben, und es ist noch mehr als in der Zukunft, dass sein würde.

Also, ich möchte eine Seite haben, wo Mitglied der Website gehen und das Abzeichen nehmen, nicht automatisch geben ihm es in SO. Und nachdem er einen Knopf namens smth wie „Take‚Made 10 Beiträge‘Abzeichen“ klickt prüft das System, ob er 10 Beiträge geschrieben hat und diese Abzeichen nicht bereits haben, und wenn es ist in Ordnung, geben Sie ihm das Abzeichen und Einsatz in den neuen Tabelle der Abzeichen von id und user_id, dass Mitglied es nicht zweimal nehmen kann.

Aber ich habe so viele Abzeichen, so brauche ich wirklich so viele zu setzen, wenn die für alle Ausweise zu überprüfen? Was wäre Ihr Vorschlag auf das sein? Wie kann ich es optimal machen, wenn es überhaupt möglich ist?

Danke.

War es hilfreich?

Lösung

optimal wäre IMHO die folgende:

hat ein Objekt für den Benutzer mit Funktionen, die Rückkehr benutzerspezifische Attribute / Metriken, dass Sie mit dem richtigen Benutzer-ID initialisieren (Sie wahrscheinlich für einige Elemente dieses ein Singleton / static wollen zu machen ...):

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

hat ein Abzeichen-Objekt, das mit einer ID / Schlüssel und laden Abhängigkeiten aus Ihrer Datenbank initialisiert wird:

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

, dann könnten Sie eine Klasse, die steuert die Vergabe von Chargen (Sie es auch im Inneren Benutzer tun kann ...) und prüft, Abhängigkeiten und Drucke fehlgeschlagen Abhängigkeiten 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);
    }
    }
        }
        ?>

Sie können auf diese Klasse erweitern, wenn Sie sehr individuelle Chargen, die seltsame Berechnungen erfordern.

hoffen, dass ich Sie auf dem richtigen Weg gebracht. ungetestet undp robably voller Syntaxfehler. Willkommen in der Welt der objektorientierten Programmierung. noch wollen dies zu tun?

Andere Tipps

Vielleicht die Informationen in eine Tabelle werfen und prüfen Sie dagegen? Wenn es von der Anzahl der Beiträge basiert, haben Felder für badge_name und post_count und auf diese Weise überprüfen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top