Domanda

Ho tavolo users degli utenti, dove memorizzare le informazioni come post_count e così via. Voglio avere ~ 50 scudetti e che sta per essere ancora di più in futuro.

Quindi, voglio avere una pagina in cui membro del sito potrebbe andare a prendere il distintivo, non gli dà automaticamente come in SO. E dopo che fa clic su un pulsante chiamato smth come "Take 'Made 10 messaggi' badge" il sistema controlla se ha inviato 10 messaggi e non ha già questo distintivo, e se va bene, dargli il badge e l'inserto nella nuova tabella ID del badge e user_id che gli Stati non ce la faceva due volte.

Ma ho tanti scudetti, quindi ne ho veramente bisogno di mettere così tanti se di per verificare la presenza di tutti i badge? Quale sarebbe il tuo suggerimento su questo? Come posso rendere più ottimale se è ancora possibile?

Grazie.

È stato utile?

Soluzione

ottimale sarebbe IMHO il seguente:

avere un oggetto per l'utente con funzioni che attributi specifici dell'utente ritorno / metriche che si inizializzare con il corretto ID utente (probabilmente vuole rendere questo un Singleton / static per alcuni elementi ...):

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

hanno un oggetto distintivo che viene inizializzato con un ID / chiave e carica le dipendenze dal database:

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

allora si potrebbe avere una classe che controlla l'assegnazione dei lotti (si può anche farlo all'interno utente ...) e controlla le dipendenze e le stampe delle dipendenze non sono riusciti ecc ...

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

è possibile estendere a questa classe se si dispone di lotti molto personalizzati che richiedono calcoli strani.

Spero ti ho portato sulla strada giusta. ANDP non testata robably pieno di errori di sintassi. benvenuti nel mondo della programmazione orientata agli oggetti. ancora voglia di fare questo?

Altri suggerimenti

Forse gettare le informazioni in una tabella e verificare contro questo? Se si basa sul numero di posti, hanno campi per badge_name e post_count e verificare in questo modo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top