Pregunta

Tengo users tabla de usuarios, donde almaceno información como post_count y así sucesivamente. Quiero tener ~ 50 insignias y va a ser aún más que eso en el futuro.

Por lo tanto, quiero tener una página en miembro del sitio web podría ir y tomar la insignia, no de forma automática la dé, al igual que en el SO. Y después de que hace clic en un botón llamado Smth como "Take 'Made 10 puestos' insignia" el sistema comprueba si se ha publicado 10 mensajes y no tiene esta placa ya, y si está bien, darle la insignia y se insertan en el nuevo tabla de ID de la tarjeta de identificación y user_id ese miembro no podía tomarlo dos veces.

Pero tengo tantas insignias, por lo que lo que realmente necesita para poner tantos si es consultar a todas las insignias? ¿Cuál sería su sugerencia al respecto? ¿Cómo puedo hacer que sea más óptimo si es aún posible?

Gracias.

¿Fue útil?

Solución

óptima sería mi humilde opinión la siguiente:

tiene un objeto para el usuario con funciones específicas que los atributos de usuario de retorno / métricas que inicializar con el identificador de usuario adecuada (que probablemente quieren hacen de este un producto único / interferencias en algunos elementos ...):

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

tiene un objeto distintivo que se inicializa con un ID / clave y carga dependencias de su base de datos:

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

entonces usted podría tener una clase que controla la adjudicación de lotes (también puede hacerlo en el interior de usuario ...) y comprueba las dependencias y las impresiones no pudieron dependencias 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);
    }
    }
        }
        ?>

se puede extender a esta clase si tiene lotes muy personalizados que requieren cálculos extraños.

Espero que te traje en el camino correcto. y p no probado robably llena de errores de sintaxis. bienvenido al mundo de la programación orientada a objetos. Todavía quieres hacer esto?

Otros consejos

Tal vez lanzar la información en una tabla y comprobar contra de eso? Si se basa en el número de puestos, tienen campos para badge_name y post_count y comprobar de esta manera?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top