Catálogo de Produtos em Flash – Parte 2Olá pessoal! Nesta segunda parte, iremos desenvolver dois formulários simples: um para cadastro de categorias e outro para cadastro de produtos em nosso catálogo. Serão aplicações bem simples, para que possamos atualizar nossa base de dados com os produtos desejados, enviando também um arquivo para foto. Para desenvolver esta parte, você deve ter desenvolvido a parte da primeira coluna sobre catalogo de produtos em flash. Vejamos agora como ficará nosso formulário de cadastro de categorias quando terminarmos. Para exemplo, fiz um formulário bem simples, sem muitos estilos visuais, somente para cadastro rápido de categorias e produtos. Crie uma pasta chamada “admin”, sem aspas, para que possamos armazenar nossos arquivos de administração. Para facilitar o desenvolvimento, vamos criar outros dois arquivos que iremos utilizar em nossos formulários, ou até mesmo em outros arquivos que você necessite utilizar, caso deseje desenvolver outras aplicações a partir das que iremos criar nesta coluna. O primeiro arquivo, é um arquivo de configuração, onde iremos inicializar a configuração do Lumine e de outras variáveis e constantes que poderemos utilizar mais adiante em nossa aplicação. Segue abaixo o código do arquivo. Salve-o como “config.php” dentro da pasta “admin”: <?php
if(!defined('BASEDIR')) {
define('BASEDIR', dirname(dirname(__FILE__)));
}
require_once 'lumineado/LumineConfiguration.php';
require_once BASEDIR . '/lumine-conf.php';
$cfg = new LumineConfiguration( $lumineConfig );
?>
Nas primeiras linhas, será testado se a constante BASEDIR já está criada. Caso não esteje, iremos criar uma constante com este nome, no qual pegamos dinamicamente onde está o diretório base de nossa aplicação. Lembre que este arquivo foi salvo dentro da pasta “admin”, que está dentro da pasta raiz de nossa aplicação, então para pegarmos o diretório absoluto efetuamos uma chamada dupla à função dirname a qual recupera o nome do diretório do arquivo/pasta. A primeira chamada remove o nome do arquivo (no caso, config.php), deixando somente a pasta, a segunda, retira o nome da última pasta (no caso, admin), deixando assim somente o nome do diretório da base de nossa aplicação. Nas linhas seguintes, incluimos os arquivos de configuração. O primeiro é o de configuração do Lumine, e o segundo são as váriaveis necessárias para conexão com o banco, também utilizadas pelo Lumine. Logo em seguida, instanciamos a classe de configuração utilizando a matriz associativa, contida no arquivo lumine-conf.php, a qual contém os dados necessários para conexão com o banco. Pronto! agora sempre que quisermos utilizar as classes do Lumine, não precisamos ficar fazendo todas as vezes a configuração com o banco, e sim somente incluir o arquivo config.php para que carreguemos as configurações básicas de nossa aplicação. O segundo arquivo serve para fazermos uma simples paginação, caso tenhamos vários registros em nossa base de dados. Salve-o com o nome paginacao.php dentro da pasta admin. <?php
$pages = $total / $limit;
$vars = '&';
foreach($_GET as $key=>$value) {
if($key != 'offset') {
$vars .= $key.'='.$value.'&';
}
}
for($i=0; $i<$pages; $i++) {
$start = $i * $limit;
$exibir = $i+1;
echo '<a href="'.$_SERVER['PHP_SELF'].'?offset='.$start.$vars.'" mce_href="'.$_SERVER['PHP_SELF'].'?offset='.$start.$vars.'">'.$exibir. '</a> ';
}
?>
Na linha 3, definimos quantas páginas serão necessárias para nossa paginação. As variáveis $total e $limit vem de nossos próximos arquivos. A variável $vars irá armazenar os dados que serão utilizados para a paginação e armazenará também os dados enviados anteriormente pelo método GET. Poderíamos também pegar os dados vindos por POST ou REQUEST, porém, os dados poderiam ser muitíssimos e acabar quebrando nossa paginação, assim limitamos a quantidade de informação. Recuperamos as variáveis e colocamos na variável $vars efetuando o foreach. Posteriormente, efetuamos um loop do tipo for, indicando que deve começar de 0 e ter no máximo no número de páginas armazenado na variável $pages. Na variável $start, armazenamos o número que será enviado na URL indicando onde deve começar a paginação quando a pessoa clicar no número a ser exibido na tela. Na variável $exibir, armazenamos o número a ser exibido para o usuário na paginação. Finalmente, utilizamos o echo para exibir o conteúdo para o usuário. Pronto, nosso arquivo para efetuar a paginação está feito. Faremos agora um arquivo para cadastrarmos as categorias de nossos produtos. Salve o arquivo como categorias.php dentro da pasta admin. Não se assustem com o tamanho do código, porque a maior parte é HTML. <?php
require_once 'config.php';
Util::Import('entidades.Categoria');
// faz um switch para saber a ação escolhida
if(isset($_REQUEST['acao'])) {
$obj = new Categoria;
switch(strtolower($_REQUEST['acao'])) {
case 'salvar':
$obj->setFrom($_POST);
if($obj->validate() === true) {
$obj->save();
header("Location: ".$_SERVER['PHP_SELF']);
exit;
}
break;
case 'editar':
if($obj->get(@$_GET['id']) != 0) {
$_POST = $obj->toArray();
}
break;
case 'remover selecionados':
if(isset($_POST['lista']) && is_array($_POST['lista'])) {
foreach($_POST['lista'] as $id) {
$obj = new Categoria;
$obj->get((int)$id);
$obj->delete();
}
}
break;
}
}
?>
<!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" />
<title>Cadastro de categorias</title>
<link href="master.css" mce_href="master.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table width="450" border="0" cellpadding="2" cellspacing="1" class="borda">
<tr>
<td colspan="2" align="center"><h1>Cadastro de categorias </h1></td>
</tr>
<tr>
<td width="186" align="right">Nome da categoria: </td>
<td width="253"><input name="nome" type="text" id="nome" value="<?php echo @$_POST['nome']; ?>" /></td>
</tr>
<tr>
<td align="right"> </td>
<td><input name="acao" type="submit" id="acao" value="Salvar" />
<input type="button" name="Button" value="Cancelar" />
<input name="idcategoria" type="hidden" id="idcategoria" value="<?php echo @$_POST['idcategoria']; ?>" /></td>
</tr>
</table>
<br />
<table width="450" border="0" cellpadding="2" cellspacing="1" class="borda">
<tr>
<td colspan="3" align="center"><h1>Categorias cadastradas </h1></td>
</tr>
<tr>
<td width="20"> </td>
<td><strong>Nome da categoria </strong></td>
<td width="60"> </td>
</tr>
<?php
$lista = new Categoria;
$total = $lista->count();
$limit = 20;
$offset = (int)@$_REQUEST['offset'];
$lista->orderBy('nome asc');
$lista->limit($offset, $limit);
$lista->find();
if($total > 0) {
while($lista->fetch()) {
?>
<tr>
<td align="center"><input name="lista[]" type="checkbox" id="lista[]" value="<?php echo $lista->idcategoria; ?>" /></td>
<td><?php echo $lista->nome;?></td>
<td>[ <a href="?acao=editar&id=<?php echo $lista->idcategoria; ?>">editar</a> ] </td>
</tr>
<?php
}
?>
<tr>
<td colspan="3" align="center"><input name="acao" type="submit" id="acao" value="Remover selecionados" /></td>
</tr>
<tr>
<td colspan="3">Páginas:
<?php include("paginacao.php"); ?></td>
</tr>
<?php
} else {
?>
<tr>
<td colspan="3">Nenhuma categoria encontrada </td>
</tr>
<?php
}
?>
</table>
</form>
</body>
</html>
Os blocos mais importantes do código acima compreendem as linhas 1 até 35, onde são efetuadas as ações de adicionar, editar e remover as categorias. O segundo bloco importante compreende as linhas 74 a 112, onde listamos as categorias previamente cadastradas, para podermos editá-las ou removê-las. Para saber qual ação tomar nas linhas 1-35, primeiramente verificamos se a variável $_REQUEST['acao'] foi enviada. Ela pode ser enviada tanto por POST como por GET, por isso utilizamos a REQUEST. Em seguida, iniciamos um SWITCH, o qual testa o valor informado dentro da variável $_REQUEST['acao']. Nas instruções CASE, notamos 3 valores possíveis: salvar, editar e remover selecionados. No bloco salvar, pegamos o valores enviados através do formulário, e colocamos dentro de um objeto categoria, setado na linha 8, através do método setFrom, que recupera os valores da matriz associativa $_POST e os coloca dentro do objeto. Após isso, testamos para ver se os valores foram colocados corretamente, na linha 12, com o método validate. Para ajustar corretamente suas regras de validação, visite a documentação de Lumine para criar o seu arquivo de validação personalizado. Se o objeto passar corretamente pela validação, o método save será chamado. Caso a variável idcategoria estiver com algum valor, ele será passado para o objeto, então a instrução SQL update será executada no objeto, pois ele possui uma chave primária e contém um valor, do contrário, o registro será inserido com os valores no banco. No bloco editar, recuperamos o valores do objeto no banco de dados e colocamos na matriz associativa e super-global $_POST, desta forma, os valores também aparecerão no formulário, porque se notarmos nos elementos do formulário, os valores estão sendo colocados dinamicamente através desta matriz. Finalmente, na parte de edição dos objetos, no bloco remover selecionados, verificamos se está setado e se existe uma lista de ID’s na matriz $_POST, chamado de $_POST['lista']. Esta lista é contruída quando algum elemento do tipo checkbox no formulário for selecionado, na lista de edição / remoção. Ela é criada por que os elementos checkbox tem a propriedade name setada como lista[]. Note que há colchetes após o sufixo lista. Isto faz com que seja gerada uma matriz dentro da matriz $_POST. Assim podemos executar um laço do tipo foreach (para cada…), recuperando assim os ID’s selecionados para remoção. Das linhas 76-84, recuperamos os registros no banco de dados para montarmos nossa lista de edição / remoção. Notem que nos elementos dentro do HTML, utilizamos o próprio objeto criado para exibirmos os valores para o usuário. Isso ocorre porque a cada chamada de $lista->fetch(), os valores são atualizados para o próximo registro encontrado. Assim, podemos fazer um laço do tipo WHILE, porque quando não houver mais registros para ser exibido, o método fetch retorna false, assim o laço será interrompido.
Sei que são muitas linhas para estudar, mas vocês verão que é bem fácil o seu desenvolvimento, ainda mais utilizando Lumine, evita um bom trabalho com instruções SQL. Abaixo temos o código para inserção de produtos. Salve-o como produtos.php dentro da pasta admin: <?php
require_once 'config.php';
Util::Import('entidades.Produto');
// faz um switch para saber a ação escolhida
if(isset($_REQUEST['acao'])) {
$obj = new Produto;
switch(strtolower($_REQUEST['acao'])) {
case 'salvar':
if($obj->get(@$_POST['data_cadastro']) == 0) {
$obj->data_cadastro = time();
}
$obj->setFrom($_POST);
// se a pessoa enviou um arquivo
if(is_uploaded_file($_FILES['foto']['tmp_name'])) {
// coloca o nome do arquivo no objeto
$obj->foto = $_FILES['foto']['name'];
// coloca o arquivo na pasta de imagens
// lembre-se do chmod 0777 na pasta
move_uploaded_file($_FILES['foto']['tmp_name'], '../imagens/'.$_FILES['foto']['name']);
// muda as permissões do arquivo
chmod('../imagens/'.$_FILES['foto']['name'], 0777);
}
// se passar na validação
if($obj->validate() === true) {
// salva o produto
$obj->save();
header("Location: ".$_SERVER['PHP_SELF']);
exit;
}
break;
case 'editar':
if($obj->get(@$_GET['id']) != 0) {
$_POST = $obj->toArray();
}
break;
case 'remover selecionados':
if(isset($_POST['lista']) && is_array($_POST['lista'])) {
foreach($_POST['lista'] as $id) {
$obj = new Produto;
$obj->get((int)$id);
$obj->delete();
// remove a foto do produto
@unlink('../imagens/'.$obj->foto);
}
}
break;
}
}
?>
<!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" />
<title>Cadastro de produto</title>
<link href="master.css" mce_href="master.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1">
<table width="450" border="0" cellpadding="2" cellspacing="1" class="borda">
<tr>
<td colspan="2" align="center"><h1>Cadastro de produtos </h1></td>
</tr>
<tr>
<td width="186" align="right">Nome do produto: </td>
<td width="253"><input name="nome" type="text" id="nome" value="<?php echo @$_POST['nome']; ?>" /></td>
</tr>
<tr>
<td align="right">Categoria:</td>
<td><select name="categoria" id="categoria">
<option value="">-- selecione</option>
<?php echo Util::buildOptions('entidades.Categoria', 'idcategoria','nome', @$_POST['categoria']); ?>
</select>
</td>
</tr>
<tr>
<td align="right">Valor:</td>
<td><input name="valor" type="text" id="valor" value="<?php echo @$_POST['valor']; ?>" /></td>
</tr>
<tr>
<td align="right" valign="top">Descrição:</td>
<td><textarea name="descricao" cols="35" rows="6" id="descricao"><?php echo @$_POST['descricao']; ?></textarea></td>
</tr>
<tr>
<td align="right">Foto:</td>
<td><input name="foto" type="file" id="foto" /></td>
</tr>
<tr>
<td align="right">É um produto destaque:</td>
<td><select name="destaque" id="destaque">
<option value="0"<?php if(@$_POST['destaque'] == '0') echo 'selected="selected"'; ?>>não</option>
<option value="1"<?php if(@$_POST['destaque'] == '1') echo 'selected="selected"'; ?>>sim</option>
</select>
</td>
</tr>
<tr>
<td align="right"> </td>
<td><input name="acao" type="submit" id="acao" value="Salvar" />
<input type="button" name="Button" value="Cancelar" />
<input name="idproduto" type="hidden" id="idproduto" value="<?php echo @$_POST['idproduto']; ?>" /></td>
</tr>
</table>
<br />
<table width="450" border="0" cellpadding="2" cellspacing="1" class="borda">
<tr>
<td colspan="3" align="center"><h1>Produtos cadastrados </h1></td>
</tr>
<tr>
<td width="20"> </td>
<td><strong>Nome do produto</strong></td>
<td width="60"> </td>
</tr>
<?php
$lista = new Produto;
$total = $lista->count();
$limit = 20;
$offset = (int)@$_REQUEST['offset'];
$lista->orderBy('nome asc');
$lista->limit($offset, $limit);
$lista->find();
if($total > 0) {
while($lista->fetch()) {
?>
<tr>
<td align="center"><input name="lista[]" type="checkbox" id="lista[]" value="<?php echo $lista->idproduto; ?>" /></td>
<td><?php echo $lista->nome;?></td>
<td>[ <a href="?acao=editar&id=<?php echo $lista->idproduto; ?>">editar</a> ] </td>
</tr>
<?php
}
?>
<tr>
<td colspan="3" align="center"><input name="acao" type="submit" id="acao" value="Remover selecionados" /></td>
</tr>
<tr>
<td colspan="3">Páginas:
<?php include("paginacao.php"); ?></td>
</tr>
<?php
} else {
?>
<tr>
<td colspan="3">Nenhum produto encontrado </td>
</tr>
<?php
}
?>
</table>
</form>
</body>
</html>
O cadastro de produtos é praticamente igual ao cadastro de categorias, exceto por detalhes a mais: o envio de fotos e o relacionamento com a tabela de categorias. Nas linhas 13 a 22, fazemos o upload da imagem e referenciamos o nome do arquivo dentro do objeto de produto. Para que esta parte funcione corretamente, não esqueça de criar uma pasta chamada imagens no mesmo nível da pasta admin e não dentro, como mostra a imagem abaixo: Outro detalhe importante, é que o PHP deve ter direito de escrita na pasta imagens. Para isto, utilize o comando de permissões do seu gerenciador FTP (também conhecido por CHMOD). Mude as permissões para que o grupo public (público) tenha direito de escrita nesta pasta. Outro detalhe a mais que tem neste formulário de cadastro, é a presença do método estático da classe Util que acompanha o pacote Lumine. Ele gera, na linha 77, os elementos options de um elemento select baseado nos registro encontrados de uma determinada classe. Util::buildOptions(‘entidades.Categorias’, ‘idcategoria’,'nome’, @$_POST['categoria']); O primeiro parâmetro é o nome da classe ou o objeto que deseja recuperar os valores. Caso você deseje passar objetos como parâmetro, não esqueça de ter executado o método find antes. O segundo o parâmetro, é o nome do campo que será usado para preencher o atributo value de um elemento option. O terceiro, o que será exibido para o usuário. O quarto, é o valor que será comparado com o segundo para saber se o elemento terá a propriedade selected ou não. Abaixo um exemplo do resultado: <option value=”6″>Artigos para presentes</option>
Sei que ficou um pouco extensa esta coluna, mas nela estão todos os códigos necessários para o simples administrador de produtos e categorias para nosso exemplo. Na próxima coluna, iremos exibir os produtos cadastrados em uma interface em Flash. @braços e fique com Deus! Autor: Hugo Ferreira da Silva – Administrador do Portal MXSTUDIO Qualquer dúvida envie um e-mail para hugo@mxstudio.com.br ou acesse nosso fórum |
Tags Marcadas:







ShareThis