SPL ArrayAccess

4, julho, 2010 Thiago Rigo Sem comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading ... Loading ...

Eae! Hoje vou continuar falando sobre SPL!

Se você ainda não conhece a SPL, dê uma lida no post anterior e conheça também a interface Countable da SPL.

Bom, o assunto de hoje é a interface ArrayAccess, que apesar de simples, possibilita que uma classe seja manipulada como um array.

A ArrayAccess, obriga que a classe implemente 4 métodos, são eles:

public boolean offsetExists(mixed $offset)
public mixed offsetGet (mixed $offset)
public void offsetSet(mixed $offset, mixed $value)
public void offsetUnset(mixed $offset)

Através desses métodos, você conseguirá acessar a sua classe como se fosse um array, com algumas restrições é claro :)

Para demonstrar o uso da ArrayAccess, usarei as mesmas classes usadas do post anteriror, só adicionei a classe CarrinhoCompras onde será posteriormente implementada a ArrayAccess.

class Produto
{
	private $nome;
	private $preco;

	public function __construct($nome, $preco)
	{
		$this->nome = $nome;
		$this->preco = $preco;
	}

	/** GETTERS AND SETTERS **/
}

class Item implements Countable
{
	private $produto;
	private $quantidade;

	public function __construct(Produto $produto, $quantidade)
	{
		$this->produto = $produto;
		$this->quantidade = $quantidade;
	}

	public function count()
	{
		return $this->quantidade;
	}
}

class CarrinhoCompras
{
	private $itens;
	private $data;

	public function __construct($data)
	{
		$this->itens = array();
		$this->data = $data;
	}
}

Nesse exemplo, continuamos com nosso contexto de e-commerce, a classe Item possui um Produto e a quantidade desejada desse produto, e a classe CarrinhoCompras possui todos os Itens que estão sendo vendidos. Bem simples, apenas para demonstração :)

Agora sim, vamos ao que interessa! O atributo $itens, é um array de Itens, para acessar ele poderíamos criar um método getItens(), ou qualquer outro método que acesse esse atributo, mas aqui vou demonstrar como acessar ele através da ArrayAccess.

A classe CarrinhoCompras deve implementar a interface ArrayAccess, e implementar todos os métodos acima citados, como no exemplo abaixo.

class CarrinhoCompras implements ArrayAccess
{
	private $itens;
	private $data;

	public function __construct($data)
	{
		$this->itens = array();
		$this->data = $data;
	}

	public function offsetSet($offset, $value)
	{
		var_dump(__METHOD__);
        $this->itens[$offset] = $value;
    }

    public function offsetExists($offset)
	{
		var_dump(__METHOD__);
        return isset($this->itens[$offset]);
    }

    public function offsetUnset($offset)
	{
		var_dump(__METHOD__);
        unset($this->itens[$offset]);
    }

    public function offsetGet($offset)
	{
		var_dump(__METHOD__);
        return isset($this->itens[$offset]) ? $this->itens[$offset] : null;
    }
}

No exemplo eu coloquei var_dump(__METHOD__) dentro de cada método para que você possa ver quando cada método é chamado. Agora vamos executar alguns testes para que você possa ver a utilização da ArrayAccess.

$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);

$produto1 = new Produto('Livro Java', 88.50);
$item1 = new Item($produto1, 1);

$carrinho = new CarrinhoCompras(new DateTime());
$carrinho[0] = $item;
$carrinho[1] = $item1;

var_dump($carrinho[0]);

Fácil não? Agora a sua classe é acessível como um array! Mas agora vamos as restrições :)

// Isso não funciona!
// Apesar de a classe ser acessível como um array, ela não é um array...
// Fazendo isso, você terá como resultado um foreach de todos os atributos public
foreach ($carrinho as $c)
var_dump($c);

// Isso também não!
array_push($carrinho, 'teste');

// Isso funciona!
// Mas não como de costume...
// O indice vazio, no caso de um array, teria o mesmo comportamento
// Que array_push(), mas no caso de um objeto
// O indice é covertido para NULL
$carrinho[] = 'teste';

Você pode continuar chamando os métodos normalmente, ou seja.

// Isso funciona!
$carrinho->offsetExists(0);

Abaixo uma breve explicação de cada método.

// Chamado quando usamos isset() ou empty()
public boolean offsetExists(mixed $offset)

// Chamado quando usamos empty()
// NOTA: Só é chamado quando ArrayAccess::offsetExists() retorna true
public mixed offsetGet (mixed $offset)

// Chamado quando usamos $obj['index'] = 'teste'
public void offsetSet(mixed $offset, mixed $value)

// Chamado quando usamos unset()
// NOTA: Fazendo casting para (unset) não chama esse método
public void offsetUnset(mixed $offset)

É isso, espero que tenham gostado!
Não esqueçam de comentar e de ler a documentação, RTFM.

http://br3.php.net/manual/pt_BR/class.arrayaccess.php

Categories: PHP, SPL Tags: , ,

SPL Countable

3, julho, 2010 Thiago Rigo Sem comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading ... Loading ...

Eae pessoal!!!

Hoje venho falar de um assunto muito interessante, SPL. :P

Pra quem não conhece, a SPL, é uma biblioteca com diversas classe e interfaces para PHP, que vão desde estruturas de dados, implementações de Design patterns, Iterators, Exceptions e funções diversas.

Nesse post, falarei de uma das interfaces, a Countable que é extremamente simples, porém muito útil!

Antes de ir direto ao assunto, usarei o exemplo abaixo para demonstrar o uso da interface dentro de um contexto de e-commerce.

class Produto
{
    private $nome;
    private $preco;

    public function __construct($nome, $preco)
    {
        $this->nome = $nome;
        $this->preco = $preco;
    }

    /** GETTERS AND SETTERS **/
}

class Item
{
    private $produto;
    private $quantidade;

    public function __construct(Produto $produto, $quantidade)
    {
        $this->produto = $produto;
        $this->quantidade = $quantidade;
    }
}

Nesse exemplo, temos a classe Produto e a classe Item, a Item recebe como parâmetro no
construtor uma instância de Produto e a quantidade desejada desse produto.

Agora se você quer saber a quantidade de produtos que um item possui você pode fazer algo assim?

$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);
echo count($item);

Até poderia, mas não seria o resultado esperado. O resultado desse count() seria 1. E agora?

É claro que você poderia criar um método getQuantidade(), ou resolver de alguma outra forma, idéias não faltam :)

Mas com a SPL você pode sim realizar o código acima e obter o resultado esperado!!!

Vamos lá!

Basta que a classe Item implemente a Countable como no exemplo abaixo.


class Item implements Countable
{
    private $produto;
    private $quantidade;

    public function __construct(Produto $produto, $quantidade)
    {
        $this->produto = $produto;
        $this->quantidade = $quantidade;
    }

    public function count()
    {
        return $this->quantidade;
    }
}

A interface Countable, obriga você implementar um método count(), mas ai você deve estar se perguntando: “Tá mas onde esta a graça nisso?”. Eu respondo, execute novamente o código abaixo.

$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);
echo count($item);

Agora sim! O resultado será 5, isso acontece porque sua classe implementou a interface Countable, e agora o PHP sabe que ele pode chamar o método count() da sua classe quando você utilizar a função count() nativa.

É isso, espero que tenham gostado e até a próxima.

http://br3.php.net/manual/pt_BR/countable.count.php

Categories: PHP, SPL Tags: , ,

ScreenCast CrudIgniter – Basics

23, maio, 2010 Thiago Rigo 14 comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Nenhum voto ainda.)
Loading ... Loading ...

Eae pessoal!

Hoje vou falar sobre CrudIgniter, esse é o primeiro cast de vários que vou fazer, mostrando desde o básico até o avançado de CrudIgniter.

Nesse cast, ensino como gerar a sua aplicação em minutos, e nos próximos irei ensinar a customizar os templates, criar seus próprios templates e até criar as suas próprias funcionalidades.
Espero que gostem e até a próxima!

PS: Assistam em HD porque aí fica muito mais fácil de entender as letras.

CrudIgniter – Basics from Thiago Rigo on Vimeo.

Design Pattern – Singleton

9, maio, 2010 Thiago Rigo 2 comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading ... Loading ...

Olá pessoal! Hoje venho falar um pouco sobre design patterns, para começar hoje irei falar sobre o Singleton.

No screencast eu explico oque é, para que serve e como se implementa Singleton em php!

Bom vamos ao screencast. Ah, se vocês gostaram, não entenderam nada ou ficaram com alguma dúvida comentem :)

Download dos arquivos

Até a próxima!!!

Design Pattern – Singleton from Thiago Rigo on Vimeo.

CrudIgniter lançado

26, abril, 2010 Thiago Rigo 18 comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading ... Loading ...

Eae pessoal!!!!!!!
Depois de tanto tempo sem postar nada, eu finalmente venho com uma novidade fantástica!!!
Já tem algum tempo que eu venho trabalhando num projeto, um software que gera código para o CodeIgniter, o software roda no console, e baseado no seu banco de dados gera a sua aplicação toda :P

Não vou entrar em muitos detalhes agora, mas em breve farei screencasts e artigos mostrando como utilizar, adicionar funcionalidades personalizadas, customizar os templates, enfim tudo!

O CrudIgniter está hospedado no Google code, neste link.

É só baixar e aproveitar, no download está toda a documentação também.

Espero que o CrudIgniter ajude muita gente! E que ele possa crescer bastante.

Divulguem!!!

E claro, comentem :P

Upload AJAX

5, setembro, 2009 Thiago Rigo 8 comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 3,67 de 5)
Loading ... Loading ...

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: , ,

Evitando erros no IF

26, agosto, 2009 Thiago Rigo Sem comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Nenhum voto ainda.)
Loading ... Loading ...

Um erro que é difícil de se detectar e bem fácil de se ocorrer é na hora  de verificar a expressão dentro de um comando IF.

Imagine o seguinte código:

<?php
$a = 10;
if ( $a = 10 ) {
	echo 10;
}

Ele será executado normalmente, e com certeza te dará um bom trabalho para encontrar o erro, não é o caso, pois aqui temos apenas o IF, mas imagine que tenha diversas outras linhas e até outras opções no IF.

Esse tipo de erro, pode ocorrer por um simples erro de digitação, ou sem querer você apagou um sinal de igual = e não percebeu.

Por isso, é bom utilizar a variável que você deseja comparar na frete do valor.

<?php
$a = 10;
if ( 10 = $a ) {
	echo 10;
}

Dessa forma, pode até parecer meio desorganizado, mas se por acaso você esquecer de colocar um sinal de igual =, isso irá gerar um erro no PHP, facilitando assim, a detecção do problema.

Escrevendo dessa forma, 10 seria atribuído a variável $a, e seria avaliado como true, logo seria escrito 10 na tela.

<?php
$a = 10;
if ( $a = 10 ) {
	echo 10;
}

Já escrevendo assim, ocorreria um erro de parse no PHP.

<?php
$a = 10;
if ( 10 = $a ) {
	echo 10;
}

Dica removida do livro PHP CookBook 2 edição.
Espero que a dica seja útil para você!

Categories: PHP Tags:

PHP – Autoload

31, julho, 2009 Thiago Rigo Sem comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 1,00 de 5)
Loading ... Loading ...

Olá, agora falarei um pouco sobre um recurso muito útil do PHP, o Autoload.

Oque é?

O recurso de Autoload nos permite carregar classes ou interfaces que não foram previamente carregadas.

Quando temos diversas classes ou interfaces em uma aplicação, no começo de cada arquivo que necessite do uso de algumas delas, teriamos de fazer includes e requires para cada uma.
O autoload faz justamente este trabalho de forma muito mais fácil, pois não temos que fazer um include ou require para cada classe ou interface manualmente.

Vamos a um exemplo utilizando classes.

Imagine que voce tenha um diretório chamado classes, e nesse diretório voce guarde todas as suas classes, e dentre as classes da sua aplicação, voce tenhas as classes: Pessoa e Cliente. Seguindo este padrão teríamos o seguinte código de autoload.

function __autoload($classe)
{
    require "classes/{$classe}.php";
}

// A classe cliente será carregada pelo __autoload();
$cliente = new Cliente();

// A classe Pessoa será carregada pelo __autoload();
$pessoa = new Pessoa();

Obs: A função autoload recebe um único parâmetro, o nome da classe ou interface que voce necessita carregar.

Agora um exemplo utilizando interface.

Continuando com o diretório classes, mas agora tambem temos um diretório interface, no diretório interface temos a interface IPessoa e a classe Pessoa, implementa essa interface, logo tambem teremos que carregar essa interface.

function __autoload($classe)
{
	$diretorios = array('class', 'interface');

	foreach ( $diretorios as $diretorio ) {

		if ( file_exists($diretorio . '/' . $classe . '.php') ) {
			require $diretorio . '/' . $classe . '.php';
			break;
		}
	}

}

// A classe cliente será carregada pelo __autoload();
$cliente = new Cliente();

// A classe Pessoa será carregada pelo __autoload();
$pessoa = new Pessoa();

Aqui temos um autoload um pouco mais completo. Primeiro definimos um array com os diretórios onde podem estar as classes ou interfaces da aplicação, depois utilizamos um foreach para percorrer o array e verificar se a classe ou interface existe, caso exista carregamos na memória e utilizamos o comando break para evitar que continue buscando.

Como podem ver, o recurso de autoload é muito simple e facilita muito.
Até a próxima!

Categories: PHP Tags:

Manipulando vários registros com PHP e MySQL

28, julho, 2009 Thiago Rigo 1 comentário
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (2 votos, média: 3,00 de 5)
Loading ... Loading ...

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: , ,

MySQL – Event

10, julho, 2009 Thiago Rigo 5 comentários
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 1,00 de 5)
Loading ... Loading ...

EVENT é uma nova funcionalidade muito interessante e útil, presente a partir do MySQL 5.1.6. Com os EVENTS você pode por exemplo agendar tarefas para serem executadas toda quarta-feira às 14:00hs, ou também um EVENT único, que será executado somente um vez.

Os EVENTS são utilizados para qualquer tipo de tarefa que envolva, agendamento e diversas operações no banco de dados.

A primeira coisa a fazer para poder utilizar EVENTS, é checar se o seu event_scheduler está habilitado. Para isso rode o seguinte comando:


SHOW PROCESSLIST;

Este comando irá mostrar todos os processos que estão rodando no MySQL. Verifique se existe o processo event_scheduler rodando. Caso não esteja, é necessário habilitá-lo com o seguinte comando:

Obs: Lembrando que como qualquer variável global é necessário ter super privilégios para habilitá-la ou desabilitá-la.


SET GLOBAL event_scheduler = 1;

Após habilitá-lo, execute novamenete:


SHOW PROCESSLIST;

E veja se agora o event_scheduler está habilitado.

A sintaxe de criação de EVENT é muito simples.

CREATE EVENT [ IF NOT EXISTS ] event_name
ON SCHEDULE schedule
[ ON COMPLETION [ NOT ] PRESERVE ]
[ ENABLED | DISABLED ]
[ COMMENT 'comment' ]
DO sql_statement;

Agora vamos começar criando um simples EVENT que á cada segundo irá inserir um novo registro do tipo TIMESTAMP na tabela test.test_event.

Primeiro vamos criar a tabela.

USE test;

CREATE TABLE test.test_event
(agora TIMESTAMP);

Agora vamos ao EVENT.

CREATE EVENT addTime
ON SCHEDULE EVERY 1 SECOND
DO
INSERT INTO test.test_event VALUES(NOW());

Após 5 segundos execute um SELECT:


SELECT * FROM test_event;

Para remover um EVENT utilize o comando DROP:


DROP EVENT addTime;

Neste exemplo vimos que o EVENT continuaria rodando até que fosse desabilitádo o event_scheduler ou fosse utilizado o comando DROP EVENT. Porém, podemos agendar também o horário de início e o horário de término do EVENT.

Vamos apenas modificar o nosso EVENT.

Obs: É importante que você tenha excluído o EVENT através do comando DROP.

CREATE EVENT addTime
ON SCHEDULE EVERY 1 SECOND
STARTS CURRENT_TIMESTAMP + INTERVAL 30 SECOND
ENDS CURRENT_TIMESTAMP + INTERVAL 35 SECOND
ON COMPLETION NOT PRESERVE
DO
INSERT INTO test.test_event VALUES(NOW());

Esse EVENT irá começar 30 segundos após ser criado, e a cada segundo irá adicionar um registro na tabela até que seja tingido o tempo de término, que é exatamente 5 segundos após começar a ser executado. Ao término ele será automaticamente excluído.

Se você quiser ver os EVENTS que estão armazenados no banco, basta utilizar o comando:


SHOW EVENTS;

Esse comando irá retornar todos os EVENTS que já foram criado. Todos os EVENTS criado vão para a tabela mysql.event, logo você também pode utilizar o SELECT.


SELECT * FROM mysql.event;

É isso aí!

Categories: MySQL Tags: ,