La implementación de insignias no automáticas con PHP y MYSQL
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.
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?