Escolar Documentos
Profissional Documentos
Cultura Documentos
www.criarweb.com
Autores do manual
Este manual foi criado pelos seguintes colaboradores de Criarweb.com:
Pablo Lecce
http://www.rhosting.com.ar
(3 captulos)
Andrs Fernndez
http://www.disegnocentell.com.ar
(1 captulo)
Damin Surez
http://www.cabezaderaton.com.ar
(1 captulo)
}
}
if (!this.xmlhttp && typeof XMLHttpRequest!='undefined') {
this.xmlhttp = new XMLHttpRequest();
if (!this.xmlhttp){
this.failed = true;
}
}
}
return this.xmlhttp ;
}
function recebeid(_pagina,valorget,valorpost,camada){
ajax=objetus(_pagina);
if(valorpost!=""){
ajax.open("POST", _pagina+"?"+valorget+"&tempo="+new Date().getTime(),true);
} else {
ajax.open("GET", _pagina+"?"+valorget+"&tempo="+new Date().getTime(),true);
}
ajax.onreadystatechange=function() {
if (ajax.readyState==1){
document.getElementById(camada).innerHTML = "<img src='loadingcircle.gif' align='center'> Aguarde por favor...";
}
if (ajax.readyState==4) {
if(ajax.status==200)
{document.getElementById(capa).innerHTML = ajax.responseText;}
else if(ajax.status==404)
{
capa.innerHTML = "O endereo no existe";
}
else
{
camada.innerHTML = "Error: ".ajax.status;
}
}
}
if(valorpost!=""){
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.send(valorpost);
} else {
ajax.send(null);
}
}
</script>
_pagina por onde lhe passo a url da pgina que desejo carregar
valorget por onde lhe passo as variveis get que desejo passar
valorpost por onde lhe passo as variveis post que desejo passar
camada onde indico o DIV ou a camada onde se carregar a pgina que se solicite
mediante a funo.
DESMEMBRANDO A FUNO
Envio por GET ou por POST?
Primeiramente, mediante o seguinte cdigo
if(valorpost!=""){
} else {
A funo determina o mtodo que usar o objeto AJAX para enviar as variveis pgina.
Como voc sabe, se se envia por mtodo POST isto se faz de forma diferente a quando se
envia mediante GET.
Adicionalmente, sucede que se voc enviar mediante GET e houver variveis POST, as mesmas
no sero passadas. Por isso, a utilidade deste condicional saber se h variveis POST que
devem ser passadas, configurar o mtodo a POST e seno deix-lo em GET.
A seguinte parte do cdigo basicamente verifica os estados. Enquanto a pgina est sendo
chamada carrega uma imagem de carregando, embora se possa substitu-la por uma frase se
desejar.
E uma vez que recebe os resultados, os carrega na camada.
Finalmente, a outra parte importante da funcion
Mediante o seguinte condicional, se complementa o primeiro condicional, enviando os daos da
solicitude mediante POST ou GET segunda corresponda, com cdigo adequado para ajax.send.
if(valorpost!=""){
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.send(valorpost);
} else {
ajax.send(null);
Enviar mediante POST e GET usando uma s funo AJAX - Exemplos de uso
O exemplo mais simples para passar valores mediante GET. Para isso, por exemplo, se voc
Manual Ajax prtico - Workshop Ajax: http://www.criarweb.com/ajax/
Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
E a segunda que no tag do boto, deve-se incluir com um onclick a funo e escrever as
variveis a passar de um modo particular para que se possa pegar.
Aqui um exemplo:
<input name="Submit" type="submit" value="Enviar"
onClick="recebeid('http://www.meusite.com/minhapagina.php',
'variavelgetenviada=enviaste get','variavelpostenviada1='+
Meuformulario.campoparaavariavelpostenviada1.value+'
&variavelpostenviada2='+Meuformulario.campoparaavariavelpostenviada2.value+
'','minhacamada')" >
2)Todos os websites de programao que ensinam a fazer combos relacionados, j seja com
Javascript puro ou com Ajax.
E bom, uma pouco para adicionar, eu tambm, mais lenha a este tema recorrente, e outro
pouco porque um bom exemplo de que s vezes melhor no usar Ajax e sim ferramentas
similares, mais simples e que obtm o mesmo resultado. Por isso, deixo este exemplo, no qual
o evento onchange de um combo dispara uma consulta ao servidor, obtm a resposta que este
lhe devolve e a mostra em tela sem atualizar a pgina, ou seja, de maneira assncrona, e, o
mais importante, sem usar Ajax, s utilizando DOM Javascript, algo que alguns chamam RPC
Javascript ou Chamada a Procedimento Remoto em Javascript.
Este o exemplo e este o cdigo utilizado:
<?php
if(isset($_GET['p'])){
switch($_GET['sel']){
case '1':
$ret=array('Final del Juego','Rayuela','El Seor de los Anillos');
break;
case '2':
$ret=array('rock','new age');
break;
case '3':
$ret=array('espaol','php','javascript');
break;
default:
echo 'document.getElementById("pp").innerHTML="<select name=\"dos\" id=\"dos\"></select>";';
exit;
}
$html='<select name=\"dos\" id=\"dos\">';
foreach($ret as $v)
$html.='<option value=\"'.$v.'\">'.$v.'</option>';
$html.='</select>';
echo 'document.getElementById("pp").innerHTML="'.$html.'";';
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>test</title>
<script>
function adjs(url){
oldsc=document.getElementById("old_sc");
if(oldsc)
document.getElementsByTagName('body')[0].removeChild(oldsc);
sc=document.createElement('script');
sc.id="old_sc";
sc.src=url+'&'+Math.random();
document.getElementsByTagName('body')[0].appendChild(sc);
}
</script>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<select name="uno" id="uno" onchange="adjs('?p&sel='+this.value)">
<option value="0">seleccionar</option>
<option value="1">libros</option>
Manual Ajax prtico - Workshop Ajax: http://www.criarweb.com/ajax/
Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
<option value="2">msica</option>
<option value="3">lenguaje</option>
</select>
<div id="pp"><select name="dos" id="dos">
</select></div>
</form>
</body>
</html>
O que faz a mesma incluir um novo elemento script na pgina, cujo atributo src a rota ao
arquivo de processo no servidor.
Simples e totalmente compatvel com todos os navegadores modernos, e, graas a que
mediante uma comprobao elimina os scripts includos em outras chamadas, com um
consumo mnimo de recursos.
Outra vantagem frente ao nosso amigo XMLHttpRequest, parte de sua simplicidade, que
pode trabalhar com arquivos que estejam em outro domnio sem ter que apelar a nenhum
truque.
Artigo por Andrs Fernndez
Temos um formulrio com um campo tipo file, o qual nos permitir enviar o arquivo a
nosso servidor PHP. A resposta do servidor se far no IFRAME, ator principal desta
novela.
O script executado em nosso server a causa do action do formulrio o encarregado de
copiar o arquivo temporrio em um espao fsico dentro do mesmo.
Logo, com um pouco de ajuda de JS imprimiremos uma mensagem correspondente ao
estado final de nosso script.
um simples formulrio HTML com um campo FILE e um marco flutuante iframe denominado
iframeUpload. Quando enviamos o arquivo ao servidor executaremos o script
controlUpload.php e a resposta do server se far em nosso iframe j que apontamos ao
mesmo dentro da etiqueta target na declarao form.
PHP:
// Script Que copia o arquivo temporrio subido ao servidor em um diretorio.
echo '<p>Nome Temporario: '.$_FILES['fileUpload']['tmp_name'].'</p>';
echo '<p>Nome no Server: '.$_FILES['fileUpload']['name'].'</p>';
echo '<p>Tipo de Arquivo: '.$_FILES['fileUpload']['type'];
$tipo = substr($_FILES['fileUpload']['type'], 0, 5);
// Definimos Diretorio onde se salva o arquivo
$dir = 'archs/';
// Tentamos Subir Arquivo
// (1) Comprovamos que existe o nome temporario do arquivo
if (isset($_FILES['fileUpload']['tmp_name'])) {
// (2) - Comprovamos que se trata de um arquivo de imagem
if ($tipo == 'image') {
// (3) Por ultimo se tenta copiar o arquivo ao servidor.
if (!copy($_FILES['fileUpload']['tmp_name'], $dir.$_FILES['fileUpload']['name']))
echo '<script> alert("Erro ao Subir o Arquivo");</script>';
}
else echo 'O Arquivo que se tenta subir NAO E do tipo Imagem.';
}
else echo 'O Arquivo nao chegou ao Servidor.';
Manual Ajax prtico - Workshop Ajax: http://www.criarweb.com/ajax/
Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Quando se executa o script, este tenta resgatar os dados do arquivo a subir. Para isso se vale
do array global de PHP $_FILES. Se no estiver muito familiarizado recomendo que leia esta
seo do manual oficial para entender seu funcionamento e suas particularidades.
Nas primeiras linhas apresentamos o nome do arquivo temporrio gerado por nosso motor
PHP, o segundo o nome real do arquivo e o terceiro o tipo de arquivo.
Se estes valores estiverem definidos evidentemente o arquivo chegou ao server. Estas linhas
mais adiante no as utilizaremos; agora s as usamos para realizar o seguimento do script.
Atribumos a $tipo o tipo de arquivo para poder controlar que seja uma imagem. Cortam-se os
primeiros 5 caracteres e se tudo for correto $tipo ter o valor image. Se no for uma imagem
ter o valor distinto. Este controle se pode fazer de diversas formas; ns utilizamos esta.
Logo, tentamos copiar o arquivo temporrio em forma definitiva em algum setor fsico em
nosso servidor. Verifica-se em forma aninhada definio de nome temporrio de arquivo, tipo
de arquivo e se o motor concretizou a cpia.
Neste exemplo o faremos na pasta archs/.
Se est tudo bem podemos passar ao segundo passo.
Neste link podemos provar o script. Podemos ver os arquivos subidos ao server neste link.
Esclarecimentos:
H que definir permisses de escritura de PHP no diretrio a copiar o arquivo. Em nosso caso
a pasta archs.
Armando o Circo
Comecemos a modificar um pouco os arquivos anteriores.
Em primeiro lugar vamos eliminar o boto submit Enviar e vamos disparar o formulrio com
uma ordem em JS.
JavaScript:
onchange="javascript: submit()"
No final do arquivo agregamos uma linha que nos dirige a um simples script que nos mostra os
arquivos subidos ao server; mais que nada para que possa corroborar a funcionalidade.
HTML:
<a href="verArquivos.php">Ver Arquivos</a>
10
controlUpload2.php | Ver
J comea a parecer a um verdadeiro AJAX FILE UPLOAD!
Finalmente um simples Script
Com estas ltimas modificaes teremos a base final para poder implementar nosso FILE
UPLOAD com um comportamento muito similar a gmail.
Vamos conter o formulrio em um div com id formUpload.
HTML:
<div id="formUpload">
Ao arquivo upload3.php, parte do formulrio de envio vamos agreg-lhe uma simples funo
resultadoUpload (estado, file) realizada em JS que, dependendo do cdigo que nos 'envie'
controlUpload.php nas variveis estado e file (agora vemos como ...) imprimir em tal div uma
mensagem de resposta tentativa de subida.
JavaScript:
function resultadoUpload(estado, file) {
var link = '<br /><br /><a href="upload3.php">Subir Arquivo</a> - <a href="verArquivos.php">Ver Imagens</a>';
if (estado == 0)
var mensagem = 'O Arquivo <a href="archs/' + file + '" target="_blank">' + file + '</a> foi subido ao servidor
corretamente' + link;
if (estado == 1)
var mensagem = 'Erro ! - O arquivo nao chegou ao servidor' + link;
if (estado == 2)
var mensagem = 'Erro ! - So se permitem Arquivos tipo Imagem' + link;
if (estado == 3)
var mensagem = 'Erro ! - Nao se pode copiar Arquivo. Possivel problema de permissoes em server' + link;
document.getElementById('formUpload').innerHTML=mensagem;
11
Este site tem uma boa descrio do conjunto de funes getElementBy*. De qualquer forma,
com um pouco de sua grande astcia, voc poder encontrar muitos exemplos de seu
funcionamento.
Agora s resta modificar controlUpload.php para que em vez de executar uma janela alert ()
(como no exemplo anterior) simplesmente execute o cdigo JavaScript para chamar funo
resultadoFile () enviando os dados correspondentes tentativa de subida do arquivo.
O ponto chamativo como acessamos desde o iframe oculto funo que se encontra na
pgina que o contm. Utilizamos a palavra reservada de JS parent.
JavaScript:
<script>parent.resultadoUpload(estado, file);</script>
Finalizando
Este humilde tutorial ficou mais longo do que gostaria. Vou continuar trabalhando para
melhorar o funcionamento e evoluir. Fica pendente uma barra de progresso (a creio que no
podemos escapar de AJAX) e outras formas de aplicao.
Tomem todo o cdigo como um guia para desenvolver esta pequena aplicao. Faltam muitos
controles de erros, de segurana, etc. O cdigo fonte apresentado no idntico aos arquivos
que se podem baixar; isto simplesmente por uma questo de prolixidade.
Desculpem minha desordem semntica e gramatical; como a maioria, sou atrevido por jogar o
papel de tutor. Nada mais longe de meus fins. Simplesmente o que quero ajudar assim como
me foi ajudado.
Artigo por Damin Surez
12