Arquivo

Textos com Etiquetas ‘jQuery’

Upload AJAX

5, setembro, 2009 Thiago Rigo 8 comentários

Eae pessoal, hoje irei mostrar como fazer um upload simples simulando AJAX.
Quem quiser conferir como ficará o exemplo, segue o link.
E no fim do post, tem um zip com o exemplo funcionando.

Vamos lá!

Primeiro: AJAX significa Asynchronous JavaScript and XML, e consiste na idéia de se comunicar com um servidor web, sem a necessidade de recarregar a página.

Segundo: O objeto XMLHttpRequest é um objeto JavaScript que torna possível essa comunicação assíncrona.

Terceiro: O XMLHttpRequest não suporta o envio de formulário com enctype="multipart/form-data", que são utlizados para envios de arquivo. Isso ocorre porque dessa maneira os caracteres não são codificados, não permitindo assim o seu envio pelo objeto.

Então como faremos ?

Simples!

Iremos simular um upload com AJAX, utilizando um iframe.

Essa técnica é bastante utilizada, e não é complicada de se fazer.

Bom, agora que ja temos uma breve explicação, vamos ao código!

Primeiro o nosso código HTML, com o formulário para upload.

<!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=UTF-8" />
<title>UPLOAD</title>
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
</head>
<body>

<h1>Escolha o arquivo</h1>

<div style="display: none;" id="loader_img">
	<img src="img/loader.gif" alt="Carregando..." title="Carregando..." />
</div>
<div style="display: none;" id="upload_msg"></div>
<form action="do_upload.php" id="form_upload" enctype="multipart/form-data" method="post" target="upload_target">
<p>
	<label>Arquivo
		<input type="file" name="arquivo" id="arquivo" />
	</label>
</p>
<p>
	<input type="submit" name="do_action" id="do_action" value="Upload" />
</p>
</form>
<iframe id="upload_target" name="upload_target" src="#"></iframe> 

</body>
</html>

Excplicação

  1. Incluimos a jQuery no nosso documento pois iremos utilizá-la, caso voce não conheca a jQuery, neste post falo um pouco sobre ela, e apresento alguns seletores básicos.
  2. Note que temos duas divs com display:none, a div#loader_img é mostrada quando o form sofrer um submit, e a div#upload_msg é utilizada para mostrar mensagens para o usuário.
  3. O form possui um target apontando para o iframe, aqui esta a mágica! Como esta apontando para o iframe, isso indica que o formulário será processado dentro do iframe, evitando que a página seja recarregada.

Agora vamos ao nosso código JavaScript dessa página.

<script type="text/javascript">
$(document).ready(function() {
	$('#upload_target').hide();

	$('form#form_upload').submit(function() {
		$('#upload_msg').hide(500);
		$(this).hide(500, function() {
			$('#loader_img').show(500);
		});
	});
});
</script>

Explicação

  1. Linha 3, escondemos o iframe da página, pois não queremos que ele sejá visto.
  2. Linha 5, selecionamos o form, e colocamos uma função de callback para quando o form sofrer o submit.
  3. Linha 6, escondemos a div de mostrar mensagens para o usuário. Eu sei ela já esta com display:none, mas se ja foi feito um upload, ela estará visível.
  4. Linha 7, Escondemos o form, e na função de callback mostramos a imagem de carregando.

O nosso código da página ficou assim

<!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=UTF-8" />
<title>UPLOAD</title>
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
	$('#upload_target').hide();

	$('form#form_upload').submit(function() {
		$('#upload_msg').hide(500);
		$(this).hide(500, function() {
			$('#loader_img').show(500);
		});
	});
});
</script>
</head>
<body>

<h1>Escolha o arquivo</h1>

<div style="display: none;" id="loader_img">
	<img src="img/loader.gif" alt="Carregando..." title="Carregando..." />
</div>
<div style="display: none;" id="upload_msg"></div>
<form action="do_upload.php" id="form_upload" enctype="multipart/form-data" method="post" target="upload_target">
<p>
	<label>Arquivo
		<input type="file" name="arquivo" id="arquivo" />
	</label>
</p>
<p>
	<input type="submit" name="do_action" id="do_action" value="Upload" />
</p>
</form>
<iframe id="upload_target" name="upload_target" src="#"></iframe> 

</body>
</html>

Bom, agora falta a página de action do form, do_upload.php nela fazemos o upload e escrevos o status do upload na página, além de escondermos a div com a imagem de carregando e mostramos novamente o form.

Vamos lá

<?php

/******* CONFIGURACOES *******/

// Nome do input FILE
$inputFile = 'arquivo';

// Limitar extensoes (TRUE ou FALSE)
$limitarExt = TRUE;

// Extensoes validas
$extensoesValidas = array('.gif', '.jpg', '.jpeg', '.png', '.txt');

// Limitar tamanho (TRUE ou FALSE)
$limitarTamanho = FALSE;

// Tamanho em bytes
$tamanhoMax = 1024 * 200;

// Caminho do upload
$caminho = 'upload/';

// Sobrescrever arquivo (TRUE ou FALSE)
$sobrescrever = FALSE;

/******* FIM CONFIGURACOES *******/

$nomeArquivo 	 = $_FILES[$inputFile]['name'];
$tamanhoArquivo  = $_FILES[$inputFile]['size'];
$nomeTempArquivo = $_FILES[$inputFile]['tmp_name'];
$erroArquivo 	 = $_FILES[$inputFile]['error'];
$extArquivo 	 = strtolower(strrchr($nomeArquivo, '.'));
$msg = '';

if ( $erroArquivo == 4 ) {
	// Nenhum arquivo enviado
	$msg = 'Selecione um arquivo!';
} elseif ( $erroArquivo == 0 ) {
	// Verifica a extensao
	if ( ($limitarExt === TRUE) && (! in_array($extArquivo, $extensoesValidas)) ) {
		$msg = 'Tipo de arquivo inválido!';
	// Verifica o tamanho
	} elseif ( ($limitarTamanho === TRUE) && ($tamanhoArquivo > $tamanhoMax) ) {
		$msg = 'Arquivo muito grande!';
	// Varifica se o arquivo ja existe
	} elseif ( ($sobrescrever === FALSE) && (file_exists($caminho . $nomeArquivo)) ) {
		$msg = 'Arquivo já existe!';
	} else {
		// Se moveu o arquivo
		if ( move_uploaded_file($nomeTempArquivo, $caminho . $nomeArquivo) ) {
			$msg = 'Arquivo enviado com sucesso!';
		} else {
			$msg = 'Ocorreu um erro durante o envio do arquivo, tente novamente.';
		}
	}
} else {
	$msg = 'Ocorreu um erro durante o envio do arquivo, tente novamente.';
}

sleep(1);

$out  = <<<OUT
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
	$('#loader_img', top.document).hide();
	$('#upload_msg', top.document).html('$msg');
	$('#upload_msg', top.document).show()
	$('form#form_upload p label input:file', top.document).remove();
	$('form#form_upload label', top.document).append('<input type="file" name="arquivo" id="arquivo" />');
	$('form#form_upload', top.document).show();
</script>
OUT;

echo $out;
?>

Desenvolvi um script de upload bem completo, que voce pode usar inclusive em outros sistemas que voce esteja desenvolvendo.

Explicação

Primeiro possuimos a parte de configurações, onde voce pode configurar:

  1. O nome do input file que voce esta usando no form.
  2. Se deve-se limitar extensões para envio de arquivo.
  3. As extensões válidas.
  4. Se deve-se limitar o tamanho do arquivo enviado.
  5. O tamanho máximo permitido.
  6. O caminho do upload.
  7. Se deve-se sobrescrever o arquivo, caso ela já exista.

Não irei explicar linha por linha, pois os comentários no código ja são auto explicativos.

O script só vai até a linha 58, após isso, são realizadas operações para escrever o JavaScript que irá manipular a página, como dito anteriormente.

Linha 60, adicionei a função sleep() para caso o arquivo enviado seja muito pequeno, ou não tenha sido enviado nenhuma arquivo, haja tempo necessário para os efeitos esconderem os elementos na página.

Linha 62, começamos a preparar o JavaScript para manipular a página.

Note que utilizamos os seletores dentro de top.document. Ou seja, serão selecionados elementos no documento acima do iframe, que é justamente a página.

No JavaScript

  1. Linha 66, escondemos a imagem de carregando.
  2. Linha 67, escrevemos o retorno do upload, variável $msg.
  3. Linha 68, mostramos a div#upload_msg.
  4. Linha 69, removemos o input file do form, pois o atributo value de um input file, não pode ser modificado.
  5. Linha 70, inserimos um novo input file.
  6. Linha 71, mostramos o form.

E pronto!

A idéia de funcionamento é bem simples, é selecionado o arquivo, faz o upload que é processado no iframe, e o PHP escreve o JavaScript que manipula a página.

Dica: Se voce tem o FireBug, após um upload verá que dentro do iframe, foi escrito aquele código JavaScript.

Download

Caso haja alguma dúvida, poste nos comentários.

Categories: PHP, jQuery Tags: , ,

Manipulando vários registros com PHP e MySQL

28, julho, 2009 Thiago Rigo 1 comentário

Olá, hoje irei mostrar um dica muito simples porém bem bacana e útil.

Como apagar diversos registros de uma vez, e evitar que voce ou no caso quem for utilizar seu sistema tenha que ficar apagando um por um.

Imagine se voce tivesse que apagar os seus emails um a um…
Não seria nada legal hein. Por isso é tão importante essa opção de apagar multíplos registros de uma vez.

A implementação não é nada complicada, então vamos ao que interessa!

Primeiro vamos simular uma lista de usuários com um array.

<?php
$usuarios = array(
                array(01, 'Thiago Rigo', 'thiago@thiagorigo.com'),
                array(02, 'João da Silva', 'joao@gmail.com'),
                array(03, 'Antônio Carlos', 'antonio@gmail.com'));
?>

Agora iremos criar o form e uma tabela onde serão escritos os dados.

<form action="user_actions.php" method="post">
    <div id="options-content">
        <label>Opções:</label>
        <select name="options">
            <option selected="selected" value="">Selecione uma opção</option>
            <option value="delete">Excluir</option>
        </select>
        <input type="submit" name="do_action" value="Aplicar"/>
    </div>
    <table border="1" id="users">
        <thead>
            <tr>
                <th><input type="checkbox" class="all" /></th>
                <th>Nome</th>
                <th>E-mail</th>
            </tr>
        </thead>
        <tbody>
<?php foreach ($usuarios as $usuario) {?>
            <tr class="usuario">
                <td><input type="checkbox" name="usuarios[]" value="<?php echo $usuario[0]; ?>"/></td>
                <td class="user"><?php echo $usuario[1]; ?></td>
                <td><?php echo $usuario[2]; ?></td>
            </tr>
<?php } ?>
        </tbody>
        <tfoot>
            <tr>
                <th><input type="checkbox" class="all" /></th>
                <th>Nome</th>
                <th>E-mail</th>
            </tr>
        </tfoot>
    </table>
</form>

Note que temos duas checkbox que possuem a class="all", essas checkbox serão responsáveis por aplicar a seleção a todas as checkbox com name="usuarios[]" ou
remover a seleção.
As checkbox que possue o name="usuarios[]", serão repetidas pelo foreach, e após o submit serão manipuladas pelo PHP como um array.

Agora iremos criar o comportamento de aplicar a seleção ou remover a seleção das checkbox. Para isso usaremos a jQuery.

Primeiro deverá ser importado o arquivo da jQuery no seu HTML, caso voce ainda não tenha baixado a jQuery acesse o link e faça o download.

<script type="text/javascript" src="jquery/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    // Seleciona todas checkbox
    $('.all').click(function() {
        if (this.checked == true) {
            $('input[name=usuarios[]], input.all').each(function() {
                this.checked = true;
            });
        } else {
            $('input[name=usuarios[]], input.all').each(function() {
                this.checked = false;
            });
        }
    });
});
</script>

Explicação: Ao clicar em qualquer uma das duas checkbox com class="all", verificamos se ela foi selecionada ou não.

Caso tenha sido selecionada, selecionamos todas as checkbox name="usuarios[]" e tambem a outra checkbox class="all" que não foi clicada.

Caso não tenha sido selecionada, removemos a seleção de todas as checkbox name="usuarios[]" e tambem da outra checkbox class="all" que não foi clicada.

Agora iremos criar uma validação no formulário, evitando que ele seja submetido sem que tenha sido selecionado ao menos um usuário, e escolhida uma opção.

// Valida opções
$('input:submit').click(function() {
    var selectedOpt = $('select option:selected').val();
    var checkedBox  = $('input[name=usuarios[]]:checked').length;

    if (selectedOpt == '') {
        alert('Selecione uma opção!');
        return false;
    } else {
        if (checkedBox == 0) {
            alert('Selecione um usuário!');
            return false;
        }
        return confirm('Tem certeza que deseja apagar esse(s) usuário(s)?');
    }
});

Explicação: Ao clicar no botão de submit guardamos em variáveis o value do option selecionado e a quantidade de name="usuarios[]" selecionados.

Primeiro verificamos se foi escolhida uma opção, caso não da um alert().

Se foi selecionado uma opção, esta opção é o excluir, pois é a única que existe. Então verificamos se foi selecionado pelo menos um name="usuarios[]", caso não da um alert(), caso sim pergunta se o voce realmente deseja excluir esse ou esses usuários.

Com a parte de validação JavaScript pronta, agora só falta a página user_actions.php, que será responsável por receber as requisições e realizar as devidas ações.

<?php
if (isset($_POST['do_action']) && isset($_POST['usuarios']) && ($_POST['options'] != null)) {

    switch ($_POST['options']) {
        case 'delete':
            $sql = 'DELETE FROM tabela WHERE ';
        break;
    }

    foreach ( $_POST['usuarios'] as $usuario ) {
        $sql .= "(id = {$usuario}) OR ";
    }

    echo substr($sql, 0, -4);
}

Está pronto!

Aqui como é apenas um exemplo eu só estou escrevendo a query, mas depois voce pode conectar no seu banco de dados e executar a query sem problemas.
Como voce pode ver, não é nada complicado, e ajuda bastante para quem for utilizar o sistema.

Para adicionar outras opções é bem simples! Por exemplo, uma ação de editar.

Primeiro: Voce teria que adicionar mais um option no seu select.

<div id="options-content">
    <label>Opções:</label>
    <select name="options">
        <option selected="selected" value="">Selecione uma opção</option>
        <option value="delete">Excluir</option>
        <option value="edit">Editar</option>
    </select>
    <input type="submit" name="do_action" value="Aplicar"/>
</div>

Segundo: Adicionar um elseif na validação JavaScript

// Valida opções
$('input:submit').click(function() {
    var selectedOpt = $('select option:selected').val();
    var checkedBox  = $('input[name=usuarios[]]:checked').length;

    if (selectedOpt == '') {
        alert('Selecione uma opção!');
        return false;
    } else if (selectedOpt == 'edit') {
        if (checkedBox == 0) {
            alert('Selecione um usuário!');
            return false;
        }
    } else {
        if (checkedBox == 0) {
            alert('Selecione um usuário!');
            return false;
        }
    return confirm('Tem certeza que deseja apagar esse(s) usuário(s)?');
    }
});

Terceiro: Adicionar mais um case no switch. Mas no caso de editar, voce teria que escrever o form para o usuario do sistema poder editar o registro.

Como seria muito extenso criar a parte de editar nesse mesmo post, quem sabe num próximo :P

Espero que seja útil para voce!

Categories: MySQL, PHP, jQuery Tags: , ,

jQuery – Seletores [Parte 1]

2, julho, 2009 Thiago Rigo 1 comentário

jQueryOlá, hoje darei início a uma série de artigos explicando e exemplificando o seletor da jQuery.

Nesta primeira parte explicarei os seletores básicos, e mostrarei exemplo de todos.

No fim do post tem um .zip com todos os exemplos organizados para download.

Na jQuery é utilizado o seletor para selecionar os elementos que desejamos manipular, assim como no CSS.

Para demonstrar os seletores, irei utilizar a função css() da jQuery, que é utilizada para manipular o style dos elementos. Para todos os elementos que forem selecionados, irei aplicar uma borda de 5px sólida e vermelha.

Introdução

Existem duas sintaxes básicas do seletor da jQuery.

$(seletores)

jQuery(seletores)

O $ nada mais é do que um atalho para a função jQuery. Ele é o mais utilizado, o único problema, é quando se trabalha com diversas bibliotecas JavaScript, onde pode haver conflitos, por isso nesses casos é utilizada a função jQuery ao invés de $.

Outro ponto muito importante, é executar o JavaScript somente quando a árvore DOM estiver pronta (no caso de você querer manipular os elementos da página). Por isso utilizamos a função ready(), que quando passamos ao seletor o document, que representa a página, as operações nele contidas, só serão executadas quando a árvore DOM estiver pronta.

Podemos fazer isso de duas formas.

$(document).ready(function() {
// seu código vai aqui
});

$(function() {
// seu código vai aqui
});

A segunda opção é um atalho para a primeira.

Vamos lá.

Seletor – ID

Nesse exemplo, será selecionada a div#segundo, pois a cerquilia # é usada para indicar um ID.

JS

$(document).ready(function() {
$('#segundo').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - ID</h3>

<div id="primeiro">DIV #primeiro</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>
</div>

Seletor – Tag

Nesse exemplo, serão selecionados todos os p(parágrafo), pois estamos utilizando o seletor de TAGs.

JS

$(document).ready(function() {
$('p').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - Tag</h3>

<div id="primeiro">DIV #primeiro</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>

<p>Eu sou alterado!!!</p>
</div>

Seletor – Classe

Nesse exemplo, serão selecionados todos os elementos que possuírem a classe .branco, pois o ponto final . indica que é uma classe.

JS

$(document).ready(function() {
$('.branco').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - Classe</h3>

<div id="primeiro" class="branco">DIV #primeiro .branco</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>

<p class="branco">P .branco</p>
</div>

Seletor – Múltiplas classes

Nesse exemplo, serão selecionados todos os elementos que possuírem as duas classes .branco e .big, se o elemento possuir apenas uma das classes, esse não será selecionado.

Obs: Note que no seletor não há espaço entre uma classes e outra, se colocado o espaço, esse será considerado um seletor hierárquico, que veremos num próximo post.

JS

$(document).ready(function() {
$('.branco.big').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - Múltiplas classes</h3>

<div id="primeiro" class="branco big">DIV #primeiro .branco .big</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>

<p class="branco">P .branco</p>
</div>

Seletor – *

Nesse exemplo, serão selecionados todos os elementos que estão dentro da div#exemplo, pois o asterisco * indica para selecionar todos os elementos, e no caso utilizamos depois o seletor de ID para selecionarmos a div#exemplo isso indica que serão selecionados todos os elementos dentro dessa div.

Obs: Se você não colocar o segundo seletor, e deixar apenas o asterisco, serão selecionados todos os elementos da página.

JS

$(document).ready(function() {
$('*', '#exemplo').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - *</h3>

<div id="primeiro" class="branco big">DIV #primeiro .branco .big</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>

<p class="branco">P .branco</p>
</div>

Seletor – Múltiplos seletores

Nesse exemplo, serão selecionados diversos elementos, assim como no CSS que é permitido selecionar diversos elementos separando eles por "vírgula ,", a jQuery também nos proporciona esse tipo de seletor.

JS

$(document).ready(function() {
$('p.branco, #primeiro, #segundo').css('border', '5px solid red');
});

HTML

<div id="exemplo">
<h3>Seletor - Múltiplos seletores</h3>

<div id="primeiro" class="branco big">DIV #primeiro .branco .big</div>

<div>DIV</div>

<div id="segundo">DIV #segundo</div>

<p class="branco">P .branco</p>
</div>

Download

Espero que tenham gostado.

Categories: jQuery Tags: ,