Criação de Páginas em Dialog
A utilização de páginas em Dialog, é muito útil em casos de você querer resultados melhores organizados, e usar menos strings enormes para exibir tantos resultados e as vezes nem conseguir exibir todos eles.
Para poder criar, é necessário usar variáveis. Pode se usar 2, uma para ficar salvo quando iniciado o ítem, e outro 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 mostrados na lista. Será necessário filtrar na exibição da Dialog e quando clicar em algum ítem da Dialog.
Exemplo: Quero fazer uma lista de jogadores, que são VIP, usando uma caixa de diálogo de listagem.
Lembrando que, os ids começam em 0, e terminam no máximo de slots (ou no caso de 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, salve o resultado para a próxima página.
Lembrando de tudo isso, vamos aos cуdigos
PHP como:
Й 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, vá adicionar a opção na caixa de diálogo "Próxima página", e vá 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:
Код:
Próxima página
Cliquei na próxima página, e agora mostrei
Код:
Pareceu tudo ok
Forma esttica
Esta forma й quando as variaveis nгo precisam ser filtradas. Isto é mais usado quando são definidos como variáveis já no servidor.
Exemplo: Lista de comandos.
PHP como:
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 define.
O primeiro comando da lista é /oi. se comeзou do 0 e clicou na opзгo 0 (0 + 0 = 0) e irб exibir
Код:
Код:
Код:
MySQL
Em MySQL os resultados ficam ainda mais fáceis, pois ele prуprio jб tem um sistema de limitar os resultados.
Consulta:
PHP como:
Mas é possível fazer isso com os diálogos? Sim, da mesma maneira. Podemos usar 1 var.
(Retirado do FS Sistema de Mensagem Privada em MySQL)
PHP como:
/
Pense assim. Vamos imaginar o seguinte, que você recebeu 30 mensagens. Exibiçã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 diálogos 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.
A utilização de páginas em Dialog, é muito útil em casos de você querer resultados melhores organizados, e usar menos strings enormes para exibir tantos resultados e as vezes nem conseguir exibir todos eles.
Para poder criar, é necessário usar variáveis. Pode se usar 2, uma para ficar salvo quando iniciado o ítem, e outro 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 mostrados na lista. Será necessário filtrar na exibição da Dialog e quando clicar em algum ítem da Dialog.
Exemplo: Quero fazer uma lista de jogadores, que são VIP, usando uma caixa de diálogo de listagem.
Lembrando que, os ids começam em 0, e terminam no máximo de slots (ou no caso de 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, salve o resultado para a próxima página.
Lembrando de tudo isso, vamos aos cуdigos
PHP como:
- Código:
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;
}
- Código:
// 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;
}
- Código:
// 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, vá adicionar a opção na caixa de diálogo "Próxima página", e vá 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:
Код:
- Código:
ID do jogador 0
ID do jogador 1
ID do jogador 2
ID do jogador 4
ID do jogador 5
ID do jogador 7
ID do jogador 8
ID do jogador 10
ID do jogador 11
ID do jogador 12
Próxima página
Cliquei na próxima página, e agora mostrei
Код:
- Código:
Identificação do jogador 14
Identificação do jogador 16
ID do jogador 18
Pareceu tudo ok
Forma esttica
Esta forma й quando as variaveis nгo precisam ser filtradas. Isto é mais usado quando são definidos como variáveis já no servidor.
Exemplo: Lista de comandos.
PHP como:
- Código:
new Comandos[][] = {
"/oi", "/bem", "/mp", "/relato", "/ajuda", "/admins", "/ir", "/carros", "/motos", "/vips",
"/morrer", "/armas", "/comandos", "/status", "/tele", "/casas", "/duelar", "/abrir", "/entrar"
};
- Código:
// 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;
}
- Código:
//Comando bбsico
CMD:comandos(playerid) {
SetPVarInt(playerid, "inicio_lista", 0);
exibir_listaComandos(playerid);
return 1;
}
- Código:
// 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 define.
O primeiro comando da lista é /oi. se comeзou do 0 e clicou na opзгo 0 (0 + 0 = 0) e irб exibir
Код:
- Código:
Comando: /oi
O dйcimo comando da lista й /vips. Se você fizer 0, e clicar na opção 9 (0 + 9 = 9) irá exibir
Код:
- Código:
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).
Код:
- Código:
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 como:
- Código:
SELECT * FROM usuarios LIMIT 0,30
Serгo 30 resultados, estб mostrando como se fosse uma pбgina do inicio 0...
PHP como:
SELECT * FROM usuarios LIMIT 30,30
Serгo 30 resultados, e estб mostrando da onde parou anteriormente.
Mas é possível fazer isso com os diálogos? Sim, da mesma maneira. Podemos usar 1 var.
(Retirado do FS Sistema de Mensagem Privada em MySQL)
PHP como:
- Código:
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;
}
/
- Código:
/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. Exibiçã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 diálogos 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.
Creditos: Locky_