[Tutorial] Criaзгo de pбginas em Dialog
#1

Criaзгo de Pбginas em Dialog

A utilizaзгo de pбginas em Dialog, й muito ъtil em casos de vocк querer resultados melhor organizados, e usar menos strings enormes para exibir tantos resultados e as vezes nem conseguindo exibir todos eles.
Para poder criar, й necessбrio usar variaveis. Pode se usar 2, uma para ficar guardado quando iniciou o нtem, e outra para guardar o prуximo нtem (que serб usado para a prуxima pбgina).


Forma Dinamica

Dinamica й quando vocк precisa filtrar os resultados para serem mostrado na lista. Serб necessбrio filtrar na exibiзгo da Dialog e quando clicou em algum нtem da Dialog.

Exemplo: Quero fazer uma lista de jogadores, que sгo VIP, usando uma dialog de listagem.

Lembrando que, os ids comeзam em 0, e terminam no mбximo de slots (ou no caso ultimo id conectado);
Terei que filtrar os resultados, para obter apenas aqueles que sгo VIP;
Terei que contar quantos tem, para quando atingir um certo nъmero, guardar o resultado para a prуxima pбgina.
Lembrando de tudo isso, vamos aos cуdigos


PHP код:
new bool:PlayerVIP[MAX_PLAYERS]; // False nгo й VIP & True й VIP
// Um comando bбsico
CMD:vervips(playerid) {
    
SetPVarInt(playerid,"inicio_lista",0);
    
abrir_listaVips(playerid);
    return 
1;
}
// Nas dialogs
if(dialogid == DialogVips) {
    if(!
response) return DeletePVar(playerid,"inicio_lista"),DeletePVar(playerid,"proxima_lista"); // Apaga as informaзхes
    
if(listitem >= 10) {// Onde estб para abrir a prуxima lista
        
SetPVarInt(playerid,"inicio_lista",GetPVarInt(playerid,"proxima_lista")); //Agora vai iniciar da onde parou
        
abrir_listaVips(playerid);
        return 
1;
    } 
    new 
vipsmsg[144];
    for(new 
GetPVarInt(playerid,"inicio_lista"); <= GetPlayerPoolSize(); i++) { // LOOP novamente para checar em qual jogador clicou
        
if(!IsPlayerConnected(i)) continue;
        if(
PlayerVIP[i] == false) continue;
        if(
listitem == vips) {
            
format(msg,sizeof(msg),"vocк clicou no vip id %i",i);
            
SendClientMessage(playerid,-1,msg);
            break;
        }        
        
vips++;
    }
    
DeletePVar(playerid,"inicio_lista");
    
DeletePVar(playerid,"proxima_lista");
    return 
1;
}
// Stock
abrir_listaVips(playerid) {
    new 
vips,str[1000];
    for(new 
GetPVarInt(playerid"inicio_lista"); <= GetPlayerPoolSize(); i++) {
        if(!
IsPlayerConnected(i)) continue; // Se nгo estiver conectado, continua o LOOP
        
if(PlayerVIP[i] == false) continue/ Se nгo for VIPcontinua o LOOP
        
if(vips >= 10) { // Jб mostrou 10 VIPs, agora irб aparecer o 'prуxima pбgina' na lista
            
strcat(str,"{FFFF00}Prуxima Lista");
            
SetPVarInt(playerid,"proxima_lista",i);
            break; 
// Para o LOOP
        
}
        
format(str,sizeof(str),"%sPlayer ID %i\n",str,i);
        
vips++; //Contando os VIPs
    
}
    
ShowPlayerDialog(playerid,DialogVips,DIALOG_STYLE_LIST,"VIPs",str,"Ok","Cancelar");


Й Confuso? nгo. Entenda melhor agora:

Ao usar o comando /vervips, foi iniciado um LOOP a partir do jogador id 0.
Й checado se o ID estб conectado, e se й VIP.
Se for VIP e estiver conectado, irб contar, e adicionar na string.
Se passar de 10 VIPs, irб adicionar a opзгo na Dialog "Prуxima Pбgina", e irб parar o LOOP.
Assim irб mostrar a Dialog conforme vocк queria.

Ao clicar no jogador, irб aparecer a mensagem "vocк clicou no vip id **"
Ao clicar em 'prуxima pбgina' vocк irб ver a prуxima pбgina, mostrando a partir do ID que iria mostrar.

Vamos supor que os ids 0,1,2,4,5,7,8,10,11,12,14,16,18 sгo VIPs. Na primeira lista, mostrou:
Код:
Player ID 0
Player ID 1
Player ID 2
Player ID 4
Player ID 5
Player ID 7
Player ID 8
Player ID 10
Player ID 11
Player ID 12
Prуxima pбgina
Cliquei em prуxima pбgina, e agora mostrou
Код:
Player ID 14
Player ID 16
Player ID 18
Pareceu tudo ok


Forma estбtica
Esta forma й quando as variaveis nгo precisam ser filtradas. Isto й mais usado quando sгo definidos as variaveis jб no servidor.

Exemplo: Lista de comandos.

PHP код:
new Comandos[][] = {
    
"/oi""/bem""/mp""/relato""/ajuda""/admins""/ir""/carros""/motos""/vips"
"/morrer""/armas""/comandos""/status""/tele""/casas""/duelar""/abrir""/entrar"
};
// Stock
exibir_listaComandos(playerid) {
    new 
str[1000], cmds;
    for(new 
GetPVarInt(playerid"inicio_lista"); sizeof(Comandos); i++) {
        if(
cmds >= 10) {
            
SetPVarInt(playerid"proxima_lista",i);
            
strcat(str,"{FFFF00}Prуxima lista");
            break;
        }
        
cmds++;
        
format(str,sizeof(str), "%s%s\n",str,Comandos[i]);
    }
    
ShowPlayerDialog(playerid,DialogComandos,DIALOG_STYLE_LIST,"Comandos",str,"Ok","Cancelar");
    return 
1;
}
//Comando bбsico
CMD:comandos(playerid) {
    
SetPVarInt(playerid"inicio_lista"0);
    
exibir_listaComandos(playerid);
    return 
1;
}
// Dialog
if(dialogid == DialogComandos) {
    if(!
response) return DeletePVar(playerid,"inicio_lista"),DeletePVar(playerid,"proxima_lista");
    if(
listitem >= 10) { // Clicou em prуxima
        
SetPVarInt(playerid,"inicio_lista",GetPVarInt(playerid,"proxima_lista"));
        
exibir_listaComandos(playerid);
        return 
1;
    }
    new 
cmd GetPVarInt(playerid,"inicio_lista") + listitemmsg[144];
    
format(msg,144,"{a9c4e4}Comando: %s",Comandos[cmd]);
    
SendClientMessage(playerid,-1,msg);
    
DeletePVar(playerid,"inicio_lista");
    
DeletePVar(playerid,"proxima_lista");
    return 
1;

De forma estбtica, й sу pensar um pouco. Tudo jб estб definido em ordem, logo os resultados irгo aparecer da maneira e ordem que vocк os definiu.

O primeiro comando da lista й /oi. se comeзou do 0 e clicou na opзгo 0 (0 + 0 = 0) e irб exibir
Код:
Comando: /oi
O dйcimo comando da lista й /vips. Se comeзou do 0, e clicou na opзгo 9 (0 + 9 = 9) irб exibir
Код:
Comando: /vips
O ъltimo comando da lista й /entrar. Se comeзou do 10, e clicou na opзгo 9 (10 + 9 = 19) irб exibir (pois apуs o comando /vips foi mostrado 'prуxima pбgina' e assim comeзou do 10 em diante).
Код:
Comando: /entrar
Assim tudo estб Ok!

MySQL
Em MySQL os resultados ficam ainda mais fбceis, pois ele prуprio jб tem um sistema de limitar os resultados.

Consulta:
PHP код:
SELECT FROM usuarios LIMIT 0,30 
Serгo 30 resultados, estб mostrando como se fosse uma pбgina do inicio 0...
PHP код:
SELECT FROM usuarios LIMIT 30,30 
Serгo 30 resultados, e estб mostrando da onde parou anteriormente.

Mas й possнvel fazer isso com as dialogs? Sim, da mesma maneira. Podemos utilizar 1 var.

(Retirado do FS Sistema de Mensagem Privada em MySQL)
PHP код:
carregar_MsgEnviadas(playerid) {
    new 
str[250], Cache:en;
    
mysql_format(con_mysqlstrsizeof(str), "SELECT `mp_msgs`.`Mensagem`,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20"pData[playerid][mID], pData[playerid][pagList]); // Consulta, limitando de 0 a 20 inicialmente.. O valor recebe +20 quando clicado em 'prуxima pбgina'
    
en mysql_query(con_mysqlstrtrue);
    if(
cache_num_rows(con_mysql) > 0) {
        new 
Nome[24], Mensagem[64], Dialog[1500];
        for(new 
icache_num_rows(con_mysql); i++) {
            
cache_get_field_content(i"user"Nomecon_mysql24);
            
cache_get_field_content(i"Mensagem"Mensagemcon_mysql64);
            
format(Dialogsizeof(Dialog), "%s%s: %s%s\r\n"Dialog,Nome,Mensagem,(strlen(Mensagem) >= 63) ? ("...") : (""));
        }
        if(
cache_num_rows(con_mysql) >= 20// Se houver 20 registros
            
strcat(Dialog"\r\n{FFFF00}Prуxima Pбgina"); //Opзгo prуxima pбgina
        
ShowPlayerDialog(playeridDialogMsgEnviadaDIALOG_STYLE_LIST"{FF0000}# {FFFFFF}Mensagens enviadas"Dialog"Selecionar""Cancelar");
    }
    else 
SendClientMessage(playerid, -1"{FF0000}[MP] Nгo hб mensagens!");
    
cache_delete(encon_mysql);
    return 
1;
}
//Dialog
        
case DialogMsgEnviada: {
            if(!
response) return cmd_minhasmp(playerid,"");
            if(
listitem >= 21) return pData[playerid][pagList] += 20carregar_MsgEnviadas(playerid); // Recebendo +20
            
new query[220], Cache:infoDialog[180], Nome[24], Mensagem[128], Data[20];
            
mysql_format(con_mysqlquerysizeof(query), "SELECT `mp_msgs`.*,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20",pData[playerid][mID], pData[playerid][pagList]); // Consulta 
            
info mysql_query(con_mysqlquerytrue);
            if(
cache_num_rows(con_mysql) > && listitem cache_num_rows(con_mysql)) { // Se o valor de resultados for maior que 0 & a opзгo clicada й menor que o nъmero de resultados encontrados
                
cache_get_field_content(listitem"Mensagem"Mensagemcon_mysql);
                
cache_get_field_content(listitem"user"Nomecon_mysql24);
                
cache_get_field_content(listitem"data"Datacon_mysql20);
                
format(Dialogsizeof(Dialog), "Mensagem enviada para %s em %s\nMensagem: %s"NomeDataMensagem);
                
ShowPlayerDialog(playeridDialogMsgRetornoDIALOG_STYLE_MSGBOX"{FFFF00}# {FFFFFF}Visualizando mensagem enviada:"Dialog"Ok""");
            }
            else 
SendClientMessage(playerid, -1"{FF0000}Ocorreu um erro!");
            
cache_delete(infocon_mysql);
            return 
1;
        } 
Pense assim. Vamos imaginar o seguinte, que vocк recebeu 30 mensagens. Exibirгo 20 na primeira pбgina, correto?
A opзгo 21, й 'Prуxima Pбgina', entгo ao clicar, irб exibir da mensagem 20 a 30 e no caso apenas 10 mensagens... Ou seja, as 30 mensagens foram exibidas, 20 em uma pбgina, em 10 em outra.

OBS: 21 pois adiciona 2 linhas a mais (\r\n) pois os resultados foram de 0 a 19, entгo na logica a opзгo para prуxima pagina seria a 20.


Veja mais como funciona no script: Aqui

Esta lуgica й semelhante usada em scripts PHP, para organizaзгo de pбgina. Vocк deve possuir um conhecimento em MySQL antes de tentar pensar em criar algo do tipo.

A intenзгo do tуpico nгo й dar cуdigos prontos, e sim encina-los a obter tal lуgica para criar sistemas/organizaзхes melhores de sistema.

Caso vocк queira algo semelhante para gerar em dialogs com STYLE_MSGBOX, veja isto. A lуgica apresentada acima й apenas funcional em STYLE_LIST/TABLIST/TABLIST_HEADERS.

Espero que tenham gostado, dъvidas sу comentar, e sugestхes de melhorias sгo aceitas.
Reply
#2

O assunto й um pouco confuso, mais vocк soube explicar bem..

Й muito ъtil, eu mesmo aprendi algumas coisas que nгo usava..

Bom trabalho Nicolas
Ainda nгo da pra te rep '-'
Reply
#3

Muito ъtil. +rep
Reply
#4

Muito bom o tutorial parabйns
Reply
#5

Уtimo tutorial, parabйns.
Reply
#6

Eu lembro de ter pedido um tutorial a respeito. Agradeзo por postб-lo. Agora fica um pouco mais esclarecido para eu produzir meus sistemas.
Reply
#7

Eu estava a procura disso, Muito bom o tutorial! +rep
Reply
#8

Irб ajudar muitos, bom trabalho Nick!
Reply
#9

Obrigado a todos!
Reply
#10

Uma pergunta, tem como ao invйs de criar um list item pra passar a pбgina, utilizar os botхes do dialogo? Se tiver teria como citar um exemplo?
Reply


Forum Jump:


Users browsing this thread: 6 Guest(s)