Criaзгo de pбginas em Dialog -
Locky_ - 26.07.2015
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 vips, msg[144];
for(new i = GetPVarInt(playerid,"inicio_lista"); i <= 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 i = GetPVarInt(playerid, "inicio_lista"); i <= GetPlayerPoolSize(); i++) {
if(!IsPlayerConnected(i)) continue; // Se nгo estiver conectado, continua o LOOP
if(PlayerVIP[i] == false) continue/ Se nгo for VIP, continua 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 i = GetPVarInt(playerid, "inicio_lista"); i < 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") + listitem, msg[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
O dйcimo comando da lista й /vips. Se comeзou do 0, e clicou na opзгo 9 (0 + 9 = 9) irб exibir
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).
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_mysql, str, sizeof(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_mysql, str, true);
if(cache_num_rows(con_mysql) > 0) {
new Nome[24], Mensagem[64], Dialog[1500];
for(new i; i < cache_num_rows(con_mysql); i++) {
cache_get_field_content(i, "user", Nome, con_mysql, 24);
cache_get_field_content(i, "Mensagem", Mensagem, con_mysql, 64);
format(Dialog, sizeof(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(playerid, DialogMsgEnviada, DIALOG_STYLE_LIST, "{FF0000}# {FFFFFF}Mensagens enviadas", Dialog, "Selecionar", "Cancelar");
}
else SendClientMessage(playerid, -1, "{FF0000}[MP] Nгo hб mensagens!");
cache_delete(en, con_mysql);
return 1;
}
//Dialog
case DialogMsgEnviada: {
if(!response) return cmd_minhasmp(playerid,"");
if(listitem >= 21) return pData[playerid][pagList] += 20, carregar_MsgEnviadas(playerid); // Recebendo +20
new query[220], Cache:info, Dialog[180], Nome[24], Mensagem[128], Data[20];
mysql_format(con_mysql, query, sizeof(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_mysql, query, true);
if(cache_num_rows(con_mysql) > 0 && 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", Mensagem, con_mysql);
cache_get_field_content(listitem, "user", Nome, con_mysql, 24);
cache_get_field_content(listitem, "data", Data, con_mysql, 20);
format(Dialog, sizeof(Dialog), "Mensagem enviada para %s em %s\nMensagem: %s", Nome, Data, Mensagem);
ShowPlayerDialog(playerid, DialogMsgRetorno, DIALOG_STYLE_MSGBOX, "{FFFF00}# {FFFFFF}Visualizando mensagem enviada:", Dialog, "Ok", "");
}
else SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro!");
cache_delete(info, con_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.
Re: Criaзгo de pбginas em Dialog -
Cleyson - 27.07.2015
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 '-'
Re: Criaзгo de pбginas em Dialog -
HardWar - 27.07.2015
Muito ъtil. +rep
Re: Criaзгo de pбginas em Dialog -
D3sconn3ct - 27.07.2015
Muito bom o tutorial parabйns
Re: Criaзгo de pбginas em Dialog -
HaRdiiZin - 27.07.2015
Уtimo tutorial, parabйns.
Re: Criaзгo de pбginas em Dialog -
pWesley - 27.07.2015
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.
Re: Criaзгo de pбginas em Dialog -
IgorLuiz - 27.07.2015
Eu estava a procura disso, Muito bom o tutorial! +rep
Re: Criaзгo de pбginas em Dialog -
PT - 29.07.2015
Irб ajudar muitos, bom trabalho Nick!
Re: Criaзгo de pбginas em Dialog -
Locky_ - 30.07.2015
Obrigado a todos!
Re: Criaзгo de pбginas em Dialog -
pWesley - 01.08.2015
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?