|
| |
por Eduardo Walmott
Uma
das grandes funcionalidades implementadas no novo Flash MX é o
SharedObject. A utilidade básica do SharedObject é permitir
o armazenamento local dos dados referentes a um usuário no sistema
deste usuário, a exemplo de um cookie, mas melhor. Neste tutorial
vamos aprender a trabalhar esta nova funcionalidade.
Se
você não consegue imaginar nenhuma boa razão para
armazenar informações de um usuário, você
não está se esforçando o suficiente. Podemos por
exemplo, usar o SharedObject (doravante denominado SO) para determinar
se um usuário visitou já seu site, permitindo que pule
automaticamente a introdução após a primeira visita.
E isto é só um exemplo simples, há uma infinidade
de novas aplicações para esta ferramenta, possíveis
de imaginar e realizar.
A
primeira coisa a fazer quando se trata de SO no Flash MX é verificar
se esta funcionalidade está habilitada no lado do cliente. Isto
implica obviamente em todas nossas novas aplicações, o
código abaixo é para verificar se o SO está habilitado
no sistema de um usuário:
function
checkSO() {
// Cria uma variável e tenta armazená-la
meuSO = SharedObject.getLocal("teste");
if (!meuSO.flush(1)) {
// SO não permitido no sistema!
// Chama a janela de ajuste
System.showSettings(1);
} else {
// SO permitido
trace("O seu sistema permite SharedObjects!");
}
}
checkSO(); |
Coloque
o código acima em um keyframe em um filme do Flash MX e rode
para certificar-se que seu sistema permite o SO antes de começarmos.
Note que o código acima verifica somente se seu sistema suporta
um SO de 1 byte, falaremos mais sobre isto neste tutorial, assim, se
você quiser adaptar para qualquer uso modifique esta propriedade.
Para
criar um novo SO nós usamos a seguinte sintaxe:
meuSO
= SharedObject.getLocal("teste"); |
Esta
mesma sintaxe é usada para carregar um SO armazenado anteriormente
no sistema do cliente. Neste exemplo "meuSO" é o nome
do objeto SO que trataremos no Flash e "teste" é o
nome do arquivo que será armazenado fisicamente na máquina
do cliente, por default este arquivo recebe a extensão ".sol".
Note que por se tratar de um arquivo que vai ser gravado no cliente
poderia conter acentos e outros caracteres, mas muitos não são
permitidos, por isso é altamente recomendável que se use
apenas caracteres comuns sem acentos. É permitido o uso de barras
(\) para determinar uma pasta de armazenamento específica.
Em
qualquer ponto do seu filme depois de criado o objeto SO e desde que
não se tenha deletado é possível gravar informações
utilizando o método "flush", que retorna um valor booleano
(true ou false) ou ainda retorna a string "pending". Quando
o método retorna true, a operação foi bem sucedida
e as informações foram gravadas, quando retorna false
ocorre o oposto, veremos o retorno "pending" logo a seguir
neste tutorial. Neste processo o arquivo físico no sistema do
cliente não é criado / alterado até que o método
flush seja explicitamente invocado. Vejamos um exemplo:
meuSO
= SharedObject.getLocal("teste");
meuSO.data.nome = "Eduardo";
valido = meuSO.flush(); |
Depois
de invocado o método flush vc pode procurar na sua máquina
o arquivo "teste.sol" criado neste exemplo.
É
possível também buscar o tamanho do arquivo SO gravado
na máquina do usuário, o retorno é em número
de bytes o método é getSize e é usado desta forma:
O
Flash MX permite que um usuário na outra ponta não só
especifique se permite ou não SharedObjects, como também,
controle o espaço em disco alocado para SharedObjects, que por
default é 100k. Se a qualquer momento da sua aplicação
você tentar escrever mais dados que o sistema do usuário
reserva, será apresentado a janela de alerta para tal procedimento.
Quando o alerta é provocado pelo método "flush"
ele retornará a string "pending" antes de enviar true
ou false. Analisando, vemos que nossa variável "valido"
no exemplo mais acima pode não retornar um valor booleano, o
que poderia causar problemas ao tentar verificar se no nosso script
a operação fosse bem sucedida (através de uma verificação
condicional, por exemplo). Mas para isso vamos tentar encontrar uma
solução.

Uma
função definida pelo evento "SharedObject.onStatus"
pode ser executada quando um valor é retornado através
do método "flush". Note que esta função
não é executada enquanto o retorno do método "flush"
permanecer "pending" (esperando a autorização
do usuário escrever em disco por exemplo), também não
é executada quando a operação "flush"
pode ser finalizada dentro do espaço em disco alocado pelo usuário.
Desta forma se o cliente permitir que seja escrito 10k em seu disco
e for solicitado escrever apenas 1k a função do "onStatus"
não será disparada.
Quando invocada esta função é criado
um objeto que indica a bem sucedida operação ou falha
na mesma. Segundo a documentação da Macromedia cada objeto
da informação possui uma propriedade de código
contendo uma string que descreve o resultado do método onStatus
e uma propriedade da classe definida por uma string que pode ser: "status",
"warning" ou "error". Veja a tabela abaixo fornecida
na documentação da MM:
code |
class |
Meaning |
SharedObject.Flush.Failed
|
Error
|
A
SharedObject.flush
command that returned "pending" has failed (the user did not allot
additional disk space for the shared object). |
SharedObject.Flush.Success
|
Status
|
A
SharedObject.flush
command that returned "pending" has been successfully completed
(the user allotted additional disk space for the shared object).
|
No exemplo
abaixo é usado o método "flush" ao invés
da propridade da classe para fazer a verificação:
molSO
= SharedObject.getLocal("mediaonline"); molSO.data.name
= "Eduardo"; efetivado = molSO.flush(100000); if (efetivado
== "pending") { molSO.onStatus = function(result){ if
(result.code == "SharedObject.Flush.Success"){ trace("Gravado
com sucesso!"); gravado = true; } else { trace("Falha
na gravação"); gravado = false; } }; } else {
gravado = efetivado; } |
Quando
nós adicionamos dados a um SO nós especificamos se queremos
manter a informação armazenada em disco através
da propriedade "data" ou apenas guardar a informação
temporariamente enquanto o usuário permanece com a sessão
aberta. Somente os SO com a propriedade "data" serão
escritos realmente em disco, SO com a propriedade "data" vazio
não será armazenado. O exemplo logo abaixo cría
um novo SO, o salva, deleta e logo a seguir o recarrega. O laço
"for..in" gera um "trace" de todos os valores que
encontrou da SO recarregada. Note que a variável "tristeSorte",
que não foi incluida a propriedade "data", depois de
recarregada não existirá, enquanto as outras persistirão.
Note também que as variáveis preservam seus tipos de dados
- Array, número, data, objeto XML, valor booleano, etc..
//Criamos
a SO globoSO = SharedObject.getLocal("clone"); //Adicionamos
uma informação que irá sofrer no mármore
do inferno globoSO.tristeSorte = "Allah, escreveu quem não
estiver na
propriedade data, será jogado ao vento! Yala!"; //Adicionamos
as informações que são 'Zuina' globoSO.data.Nazira
= "Eu vou dançar sobre o seu túmulo!"; globoSO.data.numeros
= 123; globoSO.data.objetos = new Array(4, 5, 6, 7, 8); //Gravando
em disco (Não faço a verificação neste
caso) globoSO.flush(); //Deletando a SO delete globoSO; //Carregando
a SO de volta globoSO = SharedObject.getLocal("clone");
//Procurando os valores da SO for (g in globoSO.data){ trace(g +
": " + globoSO.data[g]); } |
Uma
coisa interessante a se notar no SO é que quando você recarrega
um arquivo previamente gravado em disco faz algumas alterações
e o regrava os índices do arquivo original são sobrescritos
imediatamente, se for adicionado algum novo dado este é fundido
com os dados que estavam gravados e mantém os dados que não
foram alterados.
Agora
imagine que se deseja, após algum tempo, apagar do SO determinada
chave do índice, por esta não ser mais interessante, imaginando
uma situação prática, foi gravada uma informação
de um número de um sorteio, depois de sorteado a informação
não possui mais valor, o seu SO vai continuar com aquele número
guardado, ou na melhor das hipóteses vc vai sobrescrever este
dado. Na documentação da Macromedia não há
referência alguma sobre este assunto, mas graças a Dave
Emberton isto tornou-se possível, vamos a este exemplo baseado
no teste anterior:
//
Carregando a SO
globoSO = SharedObject.getLocal("clone"); // deletando
as informações que não interessam mais
delete globoSO.data.numeros;
delete globoSO.data.objetos;
globoOS.flush();
delete globoOS;
globoSO = SharedObject.getLocal("clone");
// Procurando os valores da SO
for (g in globoSO.data) {
trace(g + ": " + globoSO.data[g]);
} |
Nos
documentos da Macromedia também não há nenhuma
referência quanto a remover fisicamente o arquivo gravado, embora
teoriamente isto seja impossível o uso de duas técnicas
conjuntas já vistas neste tutorial conseguiu-se este feito. Primeiro,
quando nós gravamos um SO com nenhuma propriedade "data"
o arquivo não é escrito. Segundo, quando nós excluímos
um dado da propriedade "data" e reescrevemos a SO ele é
removido do arquivo fisicamente. Então ao remover-se todos os
dados da propriedade "data" e invocar o método flush,
mesmo havendo um arquivo previamente gravado em disco o Player do Flash
MX deve fazer a remoção física do arquivo, vamos
tentar então fazer isto:
globoSO
= SharedObject.getLocal("clone");
for (i in globoSO.data) {
delete globoSO.data[i];
}
globoSO.flush();
delete globoSO;
globoSO = SharedObject.getLocal("clone");
for (i in globoSO.data){
trace(i + ": " + globoSO.data[i]);
} |
Finalizando
nosso tutorial, para forçar o usuário a aceitar os SO,
como já foi visto na primeira parte deste tutorial, você
pode invocar a janela "Settings" que está presente
no menu do Player Flash MX, para isto usamos o seguinte código:
Ele
mostra uma pop up como a mostrada abaixo onde o usuário pode
definir o espaço alocado deslocando a "slidebar"
ou até mesmo não aceitar SO enquanto o checkbox "Never"
estiver marcado. É interessante ter alguma ajuda para o usuário
porque muitos não dominam o idioma inglês e por se tratar
de uma novidade muitos clientes podem ficar receosos, dificultando
o uso desta ferramenta nas suas aplicações.

Bom
galera, acho que era isso, agora é começar a bolar suas
aplicações para esta poderosa funcionalidade que a Macromedia
disponibilizou, espero ter ajudado e ter sido claro em minha explicações.
|
Devido à reformulação implementada no site, pode ser que você encontre alguns links quebrados. Por favor, ajude-nos a corrigir eventuais problemas nos informando links quebrados
|
|
|
|
|
1 comentário
|
Comentário de Gabriel | 25/5/2010 - 08:17 | http://www.fenixstudio.co.cc
Eduardo,
Seu Tutorial me ajudou muito. Obrigado.
Mas gostaria de saber em que pasta ficam os arquivos gravados pelo Shared Object. Aguardo.
Obrigado.
|
|
|
|
|