<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>HUFERSIL.WEBDEVELOPER - Soluções em desenvolvimento Web - Tecnologia - TI</title>
<description>PHP, Lumine Framework e afins</description>
<link>http://www.revistaphp.com.br</link>
<language>pt-br</language><item>
<title><![CDATA[Criando um catálogo de produtos com Lumine e CodeIgniter - Parte 3]]></title>
<description><![CDATA[<p>Hoje veremos:</p>
<blockquote> 	Como organizar nossos diret&oacute;rios<br />
Criar uma tela de login para a parte administrativa
<p>&nbsp;</p>
</blockquote> <!-- more -->
<h2>Como organizar nossos diret&oacute;rios</h2>
<p>Nesta aplica&ccedil;&atilde;o, iremos criar uma &aacute;rea administrativa e uma &aacute;rea publica.</p>
<p>A parte administrativa, iremos chamar de <b>admin</b>. A p&uacute;blica, de <b>site</b>.</p>
<p>Tudo que est&aacute; dentro da pasta &quot;application&quot; n&atilde;o poder&aacute; ser acessado externamente quando o sistema estiver em produ&ccedil;&atilde;o. Portanto, as imagens, arquivos CSS e JavaScript dever&atilde;o estar <b>fora</b> da pasta &quot;application&quot;. Ent&atilde;o, criaremos uma pasta para podermos armazenar estes tipos de arquivo.</p>
<p>Tendo isto em mente, crie a seguinte estrutura de diret&oacute;rios:</p>
<ul>
    <li>c:\www\vitrine\<b>assets</b></li>
    <li>c:\www\vitrine\<b>assets\css</b></li>
    <li>c:\www\vitrine\<b>assets\imagens</b></li>
    <li>c:\www\vitrine\<b>assets\js</b></li>
    <li>c:\www\vitrine\application\<b>views\admin</b></li>
    <li>c:\www\vitrine\application\<b>views\site</b></li>
</ul>
<p>Para cada controller criada, seja administativa ou p&uacute;blica, iremos tamb&eacute;m criar um diret&oacute;rio na &aacute;rea correspondente para podermos armazenar as <b>visualiza&ccedil;&otilde;es de comportamento</b>. Cada m&eacute;todo dentro de uma controller &eacute; um comportamento, e ficar&aacute; extremamente mais simples de manter o sistema se criarmos um arquivo <em>view</em> para cada m&eacute;todo.</p>
<p>Seguindo esta linha de racioc&iacute;nio, criaremos mais um diret&oacute;rio:</p>
<ul>
    <li>c:\www\vitrine\application\<b>views\admin\login</b></li>
</ul>
<p>Como podemos ver facilmente, este diret&oacute;rio armazenar&aacute; os arquivos de visualiza&ccedil;&atilde;o da controller &quot;login&quot; da parte administrativa.</p>
<p>Para facilitarmos o desenvolvimento, vamos criar um  &quot;template principal&quot; para a parte administrativa. As visualiza&ccedil;&otilde;es de comportamento de cada m&eacute;todo ser&atilde;o, na verdade, trechos menores que ir&atilde;o ser incorporados dentro do template principal. Em outras palavras, <b>vamos fazer um &quot;include&quot; do trecho a ser visualizado dentro do template principal.</b> Este template principal j&aacute; ter&aacute; as partes mais importantes, como topo, rodap&eacute;, menu principal de navega&ccedil;&atilde;o, etc. As visualiza&ccedil;&otilde;es ter&atilde;o somente o &quot;miolo&quot;, que ser&atilde;o incorporadas ao template.</p>
<p>Antes de criarmos o template, abaixo o arquivo CSS usado para o admin. Salve o arquivo em <b>assets/css/admin.css</b></p>
<pre class="brush: css">
@CHARSET &quot;UTF-8&quot;;
/*************************************/
/* Tela de Login
/*************************************/
* {
	margin: 0px;
	padding: 0px;
	font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
	font-size: 11px;
	font-weight: normal;
	font-style: normal;
}
.login-box {
	margin-top: 200px;
	width: 450px;
	margin-left: auto;
	margin-right: auto;
	border: 1px solid #999999;
	padding: 5px;
	border-radius: 5px;
}
.login-box p {
	clear: both;
	padding-bottom: 5px;
}
.login-box label {
	display: block;
	float: left;
	width: 120px;
	padding-top: 2px;
	padding-right: 10px;
	text-align: right;
}
.login-box #btnLogin {
	margin-left: 160px;
	padding: 4px;
}
.login-box h1 {
	border-radius: 5px;
	font-size: 14px;
	font-weight: bold;
	color: #555555;
	margin-bottom: 10px;
	background-color: #EFEFEF;
	padding: 4px 4px 4px 25px;
	background-image: url(&quot;http://www.iconfinder.com/ajax/download/png/?id=36090&amp;s=16&quot;);
	background-position: 3px center;
	background-repeat: no-repeat;
}
.login-box .erro{
	padding: 4px;
	background-color: #FFFF55;
	color: #FF0000;
	font-weight: bold;
	margin-bottom: 10px;
}
</pre>
<p>Nosso arquivo de template por enquanto ser&aacute; bem simples, para poder facilitar nossos estudos. Vamos criar uma estrutura b&aacute;sica e fazer a verifica&ccedil;&atilde;o de exist&ecirc;ncia do arquivo que ser&aacute; incluido. Salve este arquivo em <b>application/views/admin/template.php</b>:</p>
<pre class="brush: php">
	&lt;!DOCTYPE html&gt;
	&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Sistema de Gerenciamento de Conteudo&lt;/title&gt;
		&lt;meta charset=&quot;UTF-8&quot; /&gt;
		
		&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot;  href=&quot;&lt;?php echo base_url('assets/css/admin.css'); ?&gt;&quot; /&gt;
		
	&lt;/head&gt;
	&lt;body&gt;

	&lt;?php 
	// o arquivo de template a ser incluido foi informado?
	if(!empty($_template)){
		// procuramos ele a partir deste arquivo
		$_template = dirname(__FILE__) . '/' . $_template;
		// se existir, fazemos o include
		if(file_exists($_template)){
			include $_template;
			
		// se nao existir, enviamos uma mensagem
		} else {
			echo 'Template &quot;', $_template, '&quot; n&atilde;o existe!';
		}

	// se nao informou, enviamos uma mensagem
	} else {
		echo 'Template nao informado!';
	}
	?&gt;

	&lt;/body&gt;
	&lt;/html&gt;
</pre>
<p>Pronto! Agora nossas visualiza&ccedil;&otilde;es de comportamento (views) da &aacute;rea administrativa ser&atilde;o bem mais simples!</p>
<p>Vamos agora criar nossa visualiza&ccedil;&atilde;o da tela de login. Salve o arquivo em <b>application/views/admin/login/index.php</b></p>
<pre class="brush: php">
&lt;form action=&quot;&lt;?php echo site_url('admin/login/do_login'); ?&gt;&quot; method=&quot;post&quot;&gt;
	&lt;div class=&quot;login-box&quot;&gt;
		&lt;h1&gt;Efetue seu login&lt;/h1&gt;
		&lt;?php 
		// pegando o segmento de informacao na URL
		switch($this-&gt;uri-&gt;segment(4)){
			case 'informe_seus_dados':
				echo '&lt;div class=&quot;erro&quot;&gt;Usu&aacute;rio ou senha em branco&lt;/div&gt;';
			break;
			case 'usuario_nao_encontrado':
				echo '&lt;div class=&quot;erro&quot;&gt;Nenhum usu&aacute;rio encontrado com as credenciais informadas&lt;/div&gt;';
			break;
		}
		?&gt;
		&lt;p&gt;
			&lt;label for=&quot;email&quot;&gt;E-mail&lt;/label&gt;
			&lt;input type=&quot;email&quot; value=&quot;&quot; id=&quot;email&quot; name=&quot;email&quot; /&gt;
		&lt;/p&gt;
		&lt;p&gt;
			&lt;label for=&quot;senha&quot;&gt;Senha&lt;/label&gt;
			&lt;input type=&quot;password&quot; value=&quot;&quot; id=&quot;senha&quot; name=&quot;senha&quot; /&gt;
		&lt;/p&gt;
		
		&lt;input type=&quot;submit&quot; value=&quot;Efetuar Login&quot; id=&quot;btnLogin&quot; name=&quot;btnLogin&quot; /&gt;
	&lt;/div&gt;
&lt;/form&gt;
</pre>
<p>Note que para este arquivo fizemos somente o formul&aacute;rio de login sem a necessidade de outras informa&ccedil;&otilde;es, como topo, rodap&eacute;, etc, pois estas informa&ccedil;&otilde;es j&aacute; est&atilde;o no arquivo <b>template.php</b>. Bem mais simples, n&atilde;o?.</p>
<p>Agora que j&aacute; criamos nosso arquivo de visualiza&ccedil;&atilde;o principal (template.php) e login (login/index.php), vamos criar nossa controller para podermos fazer o login no sistema.</p>
<p>Para isso, crie uma controller chamada <b>login.php</b> com o conte&uacute;do abaixo:</p>
<pre class="brush: php">
&lt;?php
/**
* Controller para efetuar o login e logout do sistema administrativo.
*
* @author Hugo Ferreira da Silva
* @link http://www.hufersil.com.br
*
*/
class Login extends AdminController {
	/**
	 * Carrega a visualiza&ccedil;&atilde;o de login
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	public function index(){
		$this-&gt;display('login/index');
	}
	
	/**
	 * Efetua a valida&ccedil;&atilde;o do usu&aacute;rio no sistema e efetua o login do mesmo.
	 * 
	 * Caso as credenciais estejam corretas, gravamos as informa&ccedil;&otilde;es de login
	 * na sess&atilde;o.
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	public function do_login(){
		// nova instancia de usuario
		$user = new Usuario();
		
		// pegamos as informa&ccedil;&otilde;es do formulario.
		$user-&gt;email = $this-&gt;input-&gt;post('email');
		$user-&gt;senha = $this-&gt;input-&gt;post('senha');
		
		// se uma informa&ccedil;&atilde;o ficou em branco,
		// redirecionamos para a tela de login
		if(empty($user-&gt;email) || empty($user-&gt;senha)){
			redirect('admin/login/index/informe_seus_dados');
		}
		
		// colocamos a senha em md5
		$user-&gt;senha = md5($user-&gt;senha);
		
		// faz a consulta obtendo o numero de resultados
		$total = $user-&gt;find(true);
		
		// se n&atilde;o encontrou nada
		if( $total == 0 ){
			redirect('admin/login/index/usuario_nao_encontrado');
		}
		
		// se encontrou, colocamos os dados do usuario na sess&atilde;o
		$_SESSION['usuario'] = $user-&gt;toArray();
		
		// redirecionamos o usuario para a tela de produtos.
		redirect('admin/produtos/index');
	}
	
	/**
	 * Efetua o logout do usuario
	 * 
	 * Limpa os dados da se&ccedil;&atilde;o e envia o usu&aacute;rio para a tela de login
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	public function do_logout(){
		$_SESSION = array();
		redirect('admin/login/index');
	}
}
</pre>
<p>Salve este arquivo como <b>application/controllers/admin/login.php</b></p>
<p>Se tudo foi seguido corretamente, ao acessar a URL <a href="http://localhost/vitrine/admin/login/index">http://localhost/vitrine/admin/login/index</a> voc&ecirc; dever&aacute; ver a tela abaixo:</p>
<p><img alt="" src="lumine-ci-login.png" /></p>
<p>Para praticar, tente fazer a controller de produtos com um m&eacute;todo <b>index</b> e uma visualiza&ccedil;&atilde;o simples.</p>
<p>Na pr&oacute;xima mat&eacute;ria vamos fazer a controller de usu&aacute;rios.</p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Sex, 03 de fevereiro de 2012 - as 11h12]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/criando_catalogo_produtos_lumine_codeigniter_parte_3</link>
</item>
<item>
<title><![CDATA[Criando um catálogo de produtos com Lumine e CodeIgniter - Parte 2]]></title>
<description><![CDATA[<p>&nbsp;Dando continuidade <a href="http://www.hufersil.com.br/post/criando_catalogo_produtos_lumine_codeigniter">ao post anterior</a>, vamos ver hoje como:</p>
<div style="margin-left: 40px; ">Configurar a base do CodeIgniter</div>
<div style="margin-left: 40px; ">Criar uma controller base</div>
<div style="margin-left: 40px; ">Criar uma controller base de administra&ccedil;&atilde;o</div>
<div style="margin-left: 40px; ">&nbsp;</div>
<!-- more -->
<div>Para n&atilde;o estender muito o tutorial e ficar complicado, a tela de login vamos deixar para o pr&oacute;ximo post, juntamente sobre como configurar as &quot;Views&quot; de nosso projeto.</div>
<h2>Configurar a base do CodeIgniter</h2>
<p>Para torar as URL's mais amig&aacute;veis, vamos tirar o &quot;index.php&quot;.<br />
&Eacute; necess&aacute;rio que o ModRewrite do Apache esteja ativo.<br />
Crie um arquivo chamado &quot;.htaccess&quot; na pasta raiz do projeto (c:\www\vitrine).<br />
Coloque o conte&uacute;do abaixo dentro deste arquivo:</p>
<p class="both">&nbsp;</p>
<pre class="brush: text">
RewriteEngine On

RewriteCond $1 !^(index\.php|images|css|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$2 [L]<font face="Arial, Verdana, sans-serif"><span style="white-space: normal;"> </span></font></pre>
<p>Com isto, toda requisi&ccedil;&atilde;o feita para o servidor que n&atilde;o possua um arquivo ou pasta existente ser&aacute; redirecionada para o CodeIgniter tratar.</p>
<p>A segunda coisa que iremos fazer, ser&aacute; configurar a URL base do nosso projeto.<br />
Abra o arquivo &quot;application/config/config.php&quot;.</p>
<p>Altere a linha:</p>
<pre class="brush: php">
$config['index_page'] = 'index.php';

// para

$config['index_page'] = '';</pre>
<p>Com isto, o segmento &quot;index.php&quot; n&atilde;o ser&aacute; mais apresentado quando formos construir URL's internas com a fun&ccedil;&otilde;es de cria&ccedil;&atilde;o de link do CodeIgniter.</p>
<p>Agora, precisamos colocar no arquivo &quot;application/config/autoload.php&quot; quais bibliotecas iremos carregar por padr&atilde;o.</p>
<p>Ele nos permite indicar v&aacute;rios tipos de arquivos, mas por enquanto, vamos nos atentar somente &agrave; algumas bibliotecas que j&aacute; vem com o CI.</p>
<p>Abra o arquivo mencionado e procure pela linha:</p>
<pre class="brush: php">
$autoload['libraries'] = array('');
// e troque para 
$autoload['libraries'] = array('uri');
</pre>
<p>A biblioteca URI nos d&aacute; acesso aos &quot;segmentos&quot; formados pelo endere&ccedil;o acessado pelo usu&aacute;rio.<br />
Exemplo: quando acessamos a URL:<br />
http://www.hufersil.com.br/post/nome_do_post<br />
<br />
Voc&ecirc; pode recuper&aacute;-la com o CodeIgniter desta forma:</p>
<pre class="brush: php">
echo $this-&gt;uri-&gt;segment(1); // exibir&aacute; &quot;post&quot;;
echo $this-&gt;uri-&gt;segment(2); // exibir&aacute; &quot;nome_do_post&quot;;
</pre>
<p>Entre outras fun&ccedil;&otilde;es &uacute;teis que veremos durantes os tutoriais. Voc&ecirc; pode conferir a lista de m&eacute;todos na <a href="http://codeigniter.com/user_guide/libraries/uri.html">documenta&ccedil;&atilde;o do CodeIgniter</a>.</p>
<p>Depois, procure:</p>
<pre class="brush: php">
$autoload['helper'] = array('');
// e troque para 
$autoload['helper'] = array('url');
</pre>
<p>Este &quot;helper&quot; na verdade &eacute; um conjunto de fun&ccedil;&otilde;es de auxilio na cria&ccedil;&atilde;o de URL's.<br />
Voc&ecirc; tamb&eacute;m pode ver melhor quais s&atilde;o estes m&eacute;todos na documenta&ccedil;&atilde;o do CodeIgniter (http://codeigniter.com/user_guide/helpers/url_helper.html)</p>
<p>A &uacute;ltima coisa que precisamos configurar no momento &eacute; a &quot;rota&quot; padr&atilde;o do CI.<br />
Como vamos come&ccedil;ar primeiro pelo admin, vamos configurar a rota padr&atilde;o sendo a nossa tela de autentica&ccedil;&atilde;o. <br />
Para isto, abra o arquivo &quot;application/config/routes.php&quot;.</p>
<p>Procure pela linha:</p>
<pre class="brush: php">
$route['default_controller'] = &quot;welcome&quot;;

// e troque para

$route['default_controller'] = &quot;admin/login/index&quot;;
</pre>
<p>Isto far&aacute; com que o CodeIgniter procure na pasta &quot;admin&quot; uma controller chamda &quot;login&quot; e acesse o m&eacute;todo &quot;index&quot;.</p>
<p>Pronto! A configura&ccedil;&atilde;o b&aacute;sica do CI est&aacute; montada!</p>
<p>Agora podemos avan&ccedil;ar um pouco mais.</p>
<h2>Criar uma controller base</h2>
<p>A controller que vem com o CodeIgniter &eacute; bem b&aacute;sica.<br />
Para melhorarmos o nosso trabalho, vamos criar a nossa pr&oacute;pria controller base <strong>extendendo a controller base do CI</strong>.</p>
<p>Por padr&atilde;o, quando queremos que o CodeIgniter carregue nossas implementa&ccedil;&otilde;es ao inv&eacute;s das implementa&ccedil;&otilde;es dele, criamos nossas classes com o prefixo &quot;MY_&quot;.<br />
Este prefixo tamb&eacute;m pode ser alterado no arquivo de configura&ccedil;&atilde;o (application/config/config.php), mas por enquanto vamos deixar o padr&atilde;o.</p>
<p>O que queremos &eacute; &quot;criar nossa controller base&quot;, extendendo a classe CI_Controller (que &eacute; base padr&atilde;o de todas as controllers do CI).<br />
Ent&atilde;o, para isso, crie um arquivo chamado &quot;MY_Controller.php&quot; dentro da pasta &quot;application/core&quot;. Sua estrutura dever&aacute; ser:<br />
<strong>C:\www\vitrine\application\core\MY_Controller.php</strong></p>
<p>Agora, implemente a classe abaixo (nos coment&aacute;rios est&atilde;o as responsabilidades de cada m&eacute;todo implementado):</p>
<pre class="brush: php">
/**
 * Controller base para as implementa&ccedil;&otilde;es de nosso Catalogo de Produtos
 * 
 * @author Hugo Ferreira da Silva
 * @link http://www.hufersil.com.br
 *
 */
class MY_Controller extends CI_Controller {

	/**
	 * Indica se a sess&atilde;o j&aacute; foi iniciada
	 * @var boolean
	 */
	protected static $sessionStarted = false;

	/**
	 * Indica o arquivo de layout padr&atilde;o
	 * @var string
	 */
	protected $layoutFile = 'template.php';
	
	/**
	 * Dados para serem enviados para o template
	 * @var array
	 */
	protected $data = array();
	
	/**
	 * Construtor
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	public function __construct(){
		// chamamos o construtor pai
		parent::__construct();
		
		// carregamos a configuracao de Lumine
		// o CI j&aacute; cria a instancia
		$this-&gt;load-&gt;library('Lumine_ApplicationContext');
		
		// se a sess&atilde;o ainda n&atilde;o foi iniciada
		if(!self::$sessionStarted){
			// iniciamos e marcamos como iniciada
			session_start();
			self::$sessionStarted = true;
		}
	}
	
	/**
	 * Adiciona um valor para ser enviado para o template
	 * 
	 * @param string $key Nome da chave
	 * @param mixed $value Valor a ser enviado
	 * @author Hugo Ferreira da Silva
	 */
	public function assign($key, $value){
		$this-&gt;data[$key] = $value;
	}
	
	/**
	 * Renderiza uma view.
	 * 
	 * @link http://codeigniter.com/user_guide/general/views.html
	 * 
	 * @param string $tpl Nome do template &quot;miolo&quot;.
	 * @param boolean $return Indica se vamos renderizar na tela (false) ou retornar o resultado como string (true) 
	 * @author Hugo Ferreira da Silva
	 * @return string Resultado da renderiza&ccedil;&atilde;o
	 */
	public function display($tpl, $return = false){
		// so para garantir que a extensao sempre existir&aacute;
		$tpl = preg_replace('@\.php$@i', '', $tpl) . '.php';
		$tpl = (empty($this-&gt;uriSession) ? '' : trim($this-&gt;uriSession, '/') . '/') . $tpl;
		$this-&gt;assign('_template', $tpl);
		
		return $this-&gt;load-&gt;view($this-&gt;layoutFile, $this-&gt;data, $return);
	}
}
</pre>
<p>E esta ser&aacute; nossa controller base.<br />
Estes pequenos m&eacute;todos far&atilde;o uma grande diferen&ccedil;a enquanto estivermos trabalhando com nossas controllers finais.</p>
<h2>Criar uma controller base de administra&ccedil;&atilde;o</h2>
<p>A controller base nos fornece comportamentos comuns entre o que iremos usar no administrador e na parte p&uacute;blica.<br />
Por&eacute;m, precisamos de um comportamos um pouco mais especializado na tela &aacute;rea de administra&ccedil;&atilde;o.<br />
Para isso, criaremos uma controller base de administra&ccedil;&atilde;o.</p>
<p>Adicione ao final do arquivo <br />
C:\www\vitrine\application\core\MY_Controller.php</p>
<p>A linha:</p>
<pre class="brush: php">
require_once dirname(__FILE__) . '/AdminController.php';
</pre>
<p>Precisamos colocar neste arquivo porque o CI n&atilde;o tem como carregar este arquivo de forma autom&aacute;tica, <strong>mas ele carrega automaticamente a MY_Controller</strong>.<br />
Quando formos implementar a parte publica, veremos como fazer este carregamento de forma condicional.</p>
<p>Agora, crie um arquivo na estrutura:<br />
C:\www\vitrine\application\core\AdminController.php</p>
<p>E coloque o conte&uacute;do abaixo dentro deste arquivo criado:</p>
<pre class="brush: php">
/**
 * Controller base para se&ccedil;&atilde;o de administra&ccedil;&atilde;o
 *
 * @author Hugo Ferreira da Silva
 * @link http://www.hufersil.com.br
 *
 */
class AdminController extends MY_Controller {
	
	/**
	 * Caminhos que os usu&aacute;rios poder&atilde;o acessar sem a necessidade
	 * de estarem autenticados.
	 * 
	 * Cada caminho &eacute; uma entrada no array em forma de express&atilde;o regular.
	 * O mostrado abaixo d&aacute; acesso sem necessidade de autentica&ccedil;&atilde;o 
	 * a qualquer m&eacute;todo da controller &quot;login&quot;
	 * 
	 * @var array
	 */
	protected $allowedPaths = array(
		'^admin/login/.*?'
	);
	
	/**
	 * Contrutor
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	public function __construct(){
		// chamamos o construtor &quot;pai&quot;
		parent::__construct();
		
		// indicamos o arquivo de layout da &aacute;rea de administra&ccedil;&atilde;o
		$this-&gt;layoutFile = 'admin/template.php';
		
		// verifica se a permiss&atilde;o do usu&aacute;rio de acessar a URL indicada
		$this-&gt;verificarPermissao();
		
		// ja colocamos os dados do usuario da sess&atilde;o para
		// podermos renderizar nos templates
		$this-&gt;assign('_usuario', $this-&gt;getUsuarioSessao());
	}
	
	/**
	 * Recupera os dados do usu&aacute;rio logado
	 * 
	 * @author Hugo Ferreira da Silva
	 * @return array
	 */
	protected function getUsuarioSessao(){
		return empty($_SESSION['usuario']) ? null : $_SESSION['usuario'];
	}
	
	/**
	 * Verifica a permiss&atilde;o de acesso do usu&aacute;rio.
	 * 
	 * <p>Por enquanto, somente verificamos se o usu&aacute;rio est&aacute; logado</p>;
	 * 
	 * @author Hugo Ferreira da Silva
	 */
	protected function verificarPermissao(){
		$user = $this-&gt;getUsuarioSessao();
		$uri = $this-&gt;uri-&gt;uri_string();
		
		// se n&atilde;o est&aacute; logado e esta acessando uma URL n&atilde;o permitida.
		if(empty($user) &amp;&amp; !preg_match('@' . implode('|', $this-&gt;allowedPaths) . '@', $uri)){
			// limpa a sess&atilde;o
			$_SESSION = array();
			// envia para tela de login
			redirect('admin/login/index/sem_permissao');
		}
	}
}
</pre>
<p>Agora, nosso trabalho dentro da parte de administra&ccedil;&atilde;o ser&aacute; bem mais f&aacute;cil ;)<br />
No pr&oacute;ximo post veremos como organizar nossas views e criaremos nossa tela de login.</p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Qui, 02 de fevereiro de 2012 - as 11h14]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/geracao_imagem_drag_drop_jquery_jqueryui_php_parte_2</link>
</item>
<item>
<title><![CDATA[Criando um catálogo de produtos com Lumine e CodeIgniter.]]></title>
<description><![CDATA[<p>Criando um cat&aacute;logo de produtos com Lumine e CodeIgniter.</p>
<div>Como tive v&aacute;rios pedidos para mostrar melhor uma forma de integrar o Lumine com CodeIgniter, resolvi fazer um exemplo um pouco mais complexo, que estaremos montando ao longo de alguns tutoriais.</div>
<div>Neste primeiro artigo, iremos:</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>Baixar os pacotes necess&aacute;rios e configurando a pasta corretamente;</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>Criar o banco de dados;</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>Efetuar a engenharia reversa;</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span>Testar se tudo est&aacute; correto.</div>
<!-- more -->
<h2>Baixar os pacotes necess&aacute;rios e configurando a pasta corretamente</h2>
<p>A pasta raiz durante esta s&eacute;rie de tutoriais ser&aacute; a &quot;C:\www\vitrine&quot;, sendo &quot;C:\www&quot; o document-root do servidor web.<br />
Sendo assim, a nossa URL padr&atilde;o ser&aacute;: http://localhost/vitrine/</p>
<p>Para este exemplo, vamos utilizar o Lumine vers&atilde;o 1.6 e CodeIgniter 2.1.0.</p>
<p>Baixe primeiramente o <a href="http://codeigniter.com/download.php">CodeIgniter</a> e descompacte dentro da pasta raiz. Sua estrutura de pastas e arquivos dever&aacute; ser:</p>
<p style="margin-left: 40px; ">C:\www\vitrine\application<br />
C:\www\vitrine\system<br />
C:\www\vitrine\user_guide<br />
C:\www\vitrine\index.php<br />
C:\www\vitrine\license.txt</p>
<p>Se quiser, voc&ecirc; poder&aacute; apagar a pasta &quot;user_guide&quot;. N&atilde;o usaremos ela durante o desenvolvimento.<br />
Feita esta estrutura, baixe o <a href="http://sourceforge.net/projects/lumine/files/latest/download?source=directory">Lumine</a>, vers&atilde;o 1.6</p>
<p>&nbsp;</p>
<p>Descompacte os arquivos de Lumine dentro do diret&oacute;rio &quot;C:\www\vitrine\application\libraries\lumine&quot;.</p>
<p>A estrutura final dever&aacute; ficar semelhante a&nbsp;</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>C:\www\vitrine\application\libraries\lumine\lib\<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>C:\www\vitrine\application\libraries\lumine\changelog.txt<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>C:\www\vitrine\application\libraries\lumine\Lumine.php</p>
<p>Pronto. Agora vamos criar o nosso banco de dados.</p>
<h2>Criar o banco de dados.</h2>
<p>Crie um banco de dados chamado &quot;vitrine&quot;.</p>
<p>Importe a estrutura abaixo para criar as tabelas necessarias.</p>
<p>Este &quot;dump&quot; j&aacute; vem com um usu&aacute;rio padrao (e-mail: hufersil@gmail.com, senha: &quot;123456&quot;).</p>
<pre class="brush: sql">
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `categoria`
--

DROP TABLE IF EXISTS `categoria`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `categoria` (
  `codcategoria` int(11) NOT NULL AUTO_INCREMENT,
  `codpai` int(11) DEFAULT NULL,
  `nome` varchar(100) DEFAULT NULL,
  `permalink` varchar(100) DEFAULT NULL,
  `ordem` int(11) DEFAULT NULL,
  PRIMARY KEY (`codcategoria`),
  KEY `codpai` (`codpai`),
  CONSTRAINT `categoria_ibfk_1` FOREIGN KEY (`codpai`) REFERENCES `categoria` (`codcategoria`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `categoria`
--

LOCK TABLES `categoria` WRITE;
/*!40000 ALTER TABLE `categoria` DISABLE KEYS */;
/*!40000 ALTER TABLE `categoria` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `foto`
--

DROP TABLE IF EXISTS `foto`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `foto` (
  `codfoto` int(11) NOT NULL AUTO_INCREMENT,
  `codproduto` int(11) NOT NULL,
  `thumb` varchar(100) NOT NULL,
  `grande` varchar(100) NOT NULL,
  `ordem` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`codfoto`),
  KEY `codproduto` (`codproduto`),
  CONSTRAINT `foto_ibfk_1` FOREIGN KEY (`codproduto`) REFERENCES `produto` (`codproduto`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `foto`
--

LOCK TABLES `foto` WRITE;
/*!40000 ALTER TABLE `foto` DISABLE KEYS */;
/*!40000 ALTER TABLE `foto` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `produto`
--

DROP TABLE IF EXISTS `produto`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `produto` (
  `codproduto` int(11) NOT NULL AUTO_INCREMENT,
  `codcategoria` int(11) NOT NULL,
  `nome` varchar(200) DEFAULT NULL,
  `permalink` varchar(200) DEFAULT NULL,
  `descricao` text,
  `valor` float DEFAULT NULL,
  `observacoes_tecnicas` text,
  `data_cadastro` datetime DEFAULT NULL,
  PRIMARY KEY (`codproduto`),
  KEY `codcategoria` (`codcategoria`),
  CONSTRAINT `produto_ibfk_1` FOREIGN KEY (`codcategoria`) REFERENCES `categoria` (`codcategoria`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `produto`
--

LOCK TABLES `produto` WRITE;
/*!40000 ALTER TABLE `produto` DISABLE KEYS */;
/*!40000 ALTER TABLE `produto` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `usuario`
--

DROP TABLE IF EXISTS `usuario`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `usuario` (
  `codusuario` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(150) NOT NULL,
  `email` varchar(150) NOT NULL,
  `senha` varchar(32) NOT NULL,
  PRIMARY KEY (`codusuario`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `usuario`
--

LOCK TABLES `usuario` WRITE;
/*!40000 ALTER TABLE `usuario` DISABLE KEYS */;
INSERT INTO `usuario` VALUES (1,'Hugo Silva','hufersil@gmail.com','e10adc3949ba59abbe56e057f20f883e');
/*!40000 ALTER TABLE `usuario` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
</pre>
<h2>Efetuando a engenharia reversa</h2>
<p>&nbsp;</p>
<p>Com a estrutura do banco de dados criada, fica f&aacute;cil gerar as classes de acesso.<br />
Para isso, basta efetuar a engenharia reversa que Lumine (http://www.hufersil.com.br/lumine/engenharia_reversa) j&aacute; oferece.<br />
Acesse pelo browser: http://localhost/vitrine/application/libraries/lumine/lib/ui/reverse.php</p>
<p style="margin-left: 40px; ">Nota: caso apare&ccedil;a a mensagem &quot;Forbidden&quot;, &eacute; porque existe um arquivo chamado &quot;.htaccess&quot; dentro do diret&oacute;rio &quot;application&quot;.&nbsp;<br />
Renomeie este arquivo para poder acessar os arquivos dentro da pasta &quot;application&quot; <strong>durante o processo de desenvolvimento</strong>.<br />
Quando terminar e for colocar em produ&ccedil;&atilde;o, restaure este arquivo.</p>
<p>Dever&aacute; ser exibida a seguinte tela:</p>
<p><img width="863" height="482" border="1" alt="" src="http://www.hufersil.com.br/imagens/engenharia-reversa.PNG?" /></p>
<p>Preencha as abas como mostrado abaixo:</p>
<p><img width="866" height="491" alt="" src="http://www.hufersil.com.br/imagens/aba-dados-principais.PNG?" /></p>
<p><img width="864" height="512" alt="" src="http://www.hufersil.com.br/imagens/aba-personalizacao.PNG?" /></p>
<p><img width="864" height="409" alt="" src="http://www.hufersil.com.br/imagens/aba-integracao.PNG?" /></p>
<p>&nbsp;</p>
<p>Na aba &quot;Tabelas&quot;, clique em &quot;Atualizar Tabelas&quot;.</p>
<p>Dever&atilde;o ser exibidas as tabelas em seu banco de dados &quot;vitrine&quot;, como na tela abaixo:</p>
<p>&nbsp;</p>
<p><img width="863" height="332" alt="" src="http://www.hufersil.com.br/imagens/aba-tabelas.PNG?" /></p>
<p>&nbsp;</p>
<p>Selecione todas elas e clique no bot&atilde;o &quot;Gerar Classes&quot;. Voc&ecirc; ser&aacute; direcionado para a aba &quot;Log de gera&ccedil;&atilde;o&quot; onde poder&aacute; acompanhar o que Lumine est&aacute; fazendo.</p>
<p>Caso corra tudo sem problemas, a mensagem final dever&aacute; ser &quot;Engenharia reversa terminada!&quot;.</p>
<p>&nbsp;</p>
<p style="margin-left: 40px; ">Nota: o servidor web dever&aacute; ter permiss&atilde;o de escrita nas pastas:<br />
C:\www\vitrine\application<br />
C:\www\vitrine\application\libraries<br />
C:\www\vitrine\application\models</p>
<div>
<div>Os seguintes arquivos dever&atilde;o ter sido criados:</div>
<div>&nbsp;</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\lumine-conf.php</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\libraries\Lumine_ApplicationContext.php</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\models\Categoria.php</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\models\Foto.php</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\models\Produto.php</div>
<div style="margin-left: 40px; ">C:\www\vitrine\application\models\Usuario.php</div>
<div><span class="Apple-tab-span" style="white-space:pre">	</span></div>
<div>Confira se estes arquivos foram criados corretamente.</div>
<div>&nbsp;</div>
<div>Abra o arquivo &quot;Lumine_ApplicationContext.php&quot; e troque a linha</div>
</div>
<p>&nbsp;</p>
<pre class="brush: php">
require_once 'lumine/Lumine.php';
</pre>
<p>por</p>
<pre class="brush: php">
require_once APPPATH . '/libraries/lumine/Lumine.php';
</pre>
<p>e a linha</p>
<pre class="brush: php">
include 'lumine-conf.php';
</pre>
<p>por</p>
<pre class="brush: php">
include APPPATH . '/lumine-conf.php';
</pre>
<p>Pronto! Agora podemos testar nossa aplica&ccedil;&atilde;o.</p>
<h2>Testar se tudo est&aacute; correto</h2>
<p>Abra a controller padr&atilde;o que vem com a instala&ccedil;&atilde;o do CodeIgniter.<br />
Ela dever&aacute; estar em &quot;application/controllers/welcome.php&quot;.</p>
<p>Apague o m&eacute;todo &quot;index&quot; que ela possui e coloque este:</p>
<pre class="brush: php">
public function index(){
	// trocando o timezone para nao ficar aparecendo varios warnings
	// isto depende da configuracao do servidor, e nao do Lumine ou CodeIgniter
	date_default_timezone_set('America/Sao_Paulo');
	// importando a inicializacao de Lumine
	$this-&gt;load-&gt;library('Lumine_ApplicationContext');
	// ligando o log
	Lumine_Log::setLevel(3);
	// listando os usuarios
	$userList = new Usuario();
	$userList-&gt;find();
	
	while($userList-&gt;fetch()){
		echo 'Nome do usuario: ', $userList-&gt;nome, '<br />';
		echo 'E-mail: ', $userList-&gt;email, '<br />';
	}
}</pre>
<p>&nbsp;</p>
<p>Se aparecer um log e as informa&ccedil;&otilde;es:<br />
Nome do usuario: Hugo Silva<br />
E-mail: hufersil@gmail.com</p>
<p>Significa que est&aacute; tudo certo!</p>
<p>Na pr&oacute;xima mat&eacute;ria vamos aprender a:</p>
<p style="margin-left: 40px; ">configurar a base do CodeIgniter<br />
criar uma controller base<br />
criar uma controller base de administra&ccedil;&atilde;o<br />
criando a tela de login<span class="Apple-tab-span" style="white-space:pre">	</span></p>
<p>@bra&ccedil;os e fiquem com Deus!</p>
<p>&nbsp;</p>]]></description>
<lastBuildDate><![CDATA[Qua, 01 de fevereiro de 2012 - as 21h59]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/criando_catalogo_produtos_lumine_codeigniter</link>
</item>
<item>
<title><![CDATA[Geração de imagem com JQuery/JQueryUI e PHP]]></title>
<description><![CDATA[<p>Ajudando uma pessoa no f&oacute;rum do iMasters, fiz um exemplo bem bacana de como gerar imagens com feedback visual de Drag-Drop.</p>
<p>Assim, a pessoa monta uma imagem composta por outas imagens. Bem simples por&eacute;m bem divertido e f&aacute;cil de fazer.</p>
<p>Vamos ver como faz&ecirc;-lo!</p>
<!-- more -->
<p>Iremos criar apenas dois arquivos e duas pastas para esta tarefa. As pastas s&atilde;o:</p>
<ul>
    <li><strong>imagens</strong> - coloque suas imagens originais aqui</li>
    <li><strong>geradas</strong> - pasta onde as imagens geradas ser&atilde;o salvas. <em><strong>N&atilde;o esque&ccedil;a de alterar o permissionamento para escrita</strong></em>.</li>
</ul>
<p>Depois de criar as pastas, vamos criar os arquivos. Os arquivos devem estar no mesmo n&iacute;vel das pastas.</p>
<p><strong>Arquivo de entrada e composi&ccedil;&atilde;o das imagens</strong> (index.php).</p>
<div class="both">&nbsp;</div>
<pre class="brush: html">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Imagens&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	// quando terminar de carregar o script
	$(function(){
		// fazemos com que todas as imagens da lista possam ser arrastadas 
		$('.available li img').draggable({
			helper: 'clone'
		});

		// a &aacute;rea do &quot;papel&quot; ser&aacute; onde os itens podem ser soltos
		$('#area-itens').droppable({
			// quando soltar um item no &quot;papel&quot;...
			drop: function(evt, ui){
				// se o pai do item j&aacute; for o &quot;papel&quot;
				if(ui.draggable.parent()[0] == this){
					// nao faz nada
					return;
				}

				// referencia ao &quot;papel&quot;, mais curta
				var t = $(this);
				// copia do elemento arrastado
				var e = ui.draggable;
				// diferenca entre a posicao do mouse e a posicao do elemento quando for solto
				var diff = {x: evt.pageX - ui.position.left, y: evt.pageY - ui.position.top};
				// tiramos o &quot;helper&quot; do elemento ao ser arrastado
				e.draggable('option','helper','');
				// pegamos o elemento pai do elemento arrastado (a &quot;li&quot;)
				var parent = e.parent();
				// colocamos o elemento arrastado no papel
				e.appendTo(t);
				// removemos o elemento pai anterior do elemento arrastado (a &quot;li&quot;)
				parent.remove();

				// calculando novo posicionamento dentro do papel
				e.css({
					position: 'absolute',
					left: evt.pageX - t.offset().left - diff.x,
					top: evt.pageY - t.offset().top - diff.y
				});
			}
		});

		// ao clicar no botao de salvar a imagem
		$('#btnSalvar').click(function(evt){
			// elemento contendo o status
			var s = $('.status'), 
				// dados a serem enviados para o servidor
				data={}, 
				// area dos itens
				area = $('#area-itens'),
				// tamanho da pagina 
				pageSize = {width:area.width(),height:area.height()},
				// elementos escolhidos pelo usuario 
				itens=[];

			// para cada elemento dentro da pagina
			area.find('.itens').each(function(){
				// referencia ao elemento atual
				var t=$(this), 
					// criamos um novo objeto com as propriedades desejadas
					// para gera&ccedil;&atilde;o do arquivo final
					item = {
						src: this.src, 
						width: t.width(), 
						height: t.height(),
						x: t.position().left,
						y: t.position().top
					};
				// colocamos na lista de itens que ser&atilde;o usados para compor
				// a nova imagem
				itens.push(item);
			});

			// colocamos os dados no objeto para
			// enviar para gera&ccedil;&atilde;o da imagem
			data.area = pageSize;
			data.itens = itens;

			// muda o status para aguardar
			s.html('Aguarde...');
			// envia para o PHP gerar a imagem final
			$.post('gerar.php', data, function(link){
				// quando receber a resposta, mostra o Link para baixar a imagem
				s.html('Imagem gerada: &lt;a target=&quot;_blank&quot; href=&quot;'+link+'&quot;&gt;Clique aqui para baixar&lt;/a&gt;');
			});
		});
	});
	
	&lt;/script&gt;	
	
	&lt;style type=&quot;text/css&quot;&gt;
		#area-itens {
			position: relative;
			float: left;
			width: 300px;
			height: 450px;
			border: 1px solid black;
			overflow: hidden;
		}
		
		.available {
			float: right;
		}
		
		.buttons {
			clear: both;
		}
		
	&lt;/style&gt;
	
&lt;/head&gt;
&lt;body&gt;
	
	&lt;p&gt;Arraste as imagens da direita para a &quot;&aacute;rea do papel&quot; abaixo&lt;/p&gt;
	
	&lt;!--  area do &quot;papel&quot;  --&gt;
	&lt;div id=&quot;area-itens&quot;&gt;
	&lt;/div&gt;
	
	&lt;!--  lista de elementos que servem para o usuario compor a nova imagem --&gt;
	&lt;ul	class=&quot;available&quot;&gt;
		&lt;li&gt;&lt;img src=&quot;imagens/imagem1.jpg&quot; class=&quot;itens&quot; /&gt;&lt;/li&gt;
		&lt;li&gt;&lt;img src=&quot;imagens/imagem2.jpg&quot; class=&quot;itens&quot; /&gt;&lt;/li&gt;
		&lt;li&gt;&lt;img src=&quot;imagens/imagem3.jpg&quot; class=&quot;itens&quot; /&gt;&lt;/li&gt;
		&lt;li&gt;&lt;img src=&quot;imagens/imagem4.jpg&quot; class=&quot;itens&quot; /&gt;&lt;/li&gt;
	&lt;/ul&gt;
	
	&lt;div class=&quot;buttons&quot;&gt;
		&lt;input type=&quot;button&quot; value=&quot;Salvar Imagem&quot; id=&quot;btnSalvar&quot; /&gt;
	&lt;/div&gt;
	
	&lt;div class=&quot;status&quot;&gt;&lt;/div&gt;
	
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Como podemos ver, este arquivo &eacute; composto apenas de HTML, CSS e JavaScript. Simples e direto.</p>
<p><strong>Agora, vamos criar o arquivo que gera as imagens compostas</strong> (gerar.php):</p>
<pre class="brush: php">
&lt;?php

// mudamos o timezone para nao termos problema com datas
date_default_timezone_set('America/Sao_Paulo');

// pegamos a largura da pagina enviada via post,  ou usamos 300 como padrao
$width = empty($_POST['area']['width']) ? 300 : sprintf('%d', $_POST['area']['width']);
// pegamos a altura da pagina enviada via post,  ou usamos 450 como padrao
$height = empty($_POST['area']['height']) ? 450 : sprintf('%d', $_POST['area']['height']);

// criamos a imagem e colocamos um fundo branco
$img = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($img, 255, 255, 255);
imagefilledrectangle($img, 0, 0, $width, $height, $white);

// se enviou imagens
if(!empty($_POST['itens'])){
	// para cada imagem enviada
	foreach($_POST['itens'] as $item){
		// se tem o elemento &quot;src&quot;
		if(!empty($item['src'])){
			// pegamos somente o nome do arquivo e ignoramos o restante
			// vamos procurar por ela dentro da pasta &quot;imagens&quot;
			$filename = 'imagens/' . pathinfo($item['src'], PATHINFO_BASENAME);
			//se existir
			if(file_exists($filename)){
				// pegamos o restante das informacoes enviadas
				// via post para esta imagem
				$w = sprintf('%d', $item['width']);
				$h = sprintf('%d', $item['height']);
				$x = sprintf('%d', $item['x']);
				$y = sprintf('%d', $item['y']);
				
				// criamos o elemento de imagem no PHP a partir do conteudo do arquivo
				$item = imagecreatefromstring(file_get_contents($filename));
				
				// copiamos a imagem informada na imagem final, 
				// com as medidas e posi&ccedil;&otilde;es informadas
				imagecopy($img, $item, $x, $y, 0, 0, $w, $h);
			}
		}
	}
}

// geramos o arquivo final
$imageFileName = 'geradas/imagem-'.time().'.jpg';
imagejpeg($img, $imageFileName, 90);

// informamos o link
echo $imageFileName;
</pre>
<p>Como podemos ver, s&atilde;o dois arquivos simples e pequenos, f&aacute;ceis de serem alterados para suas necessidades!</p>
<p>Voc&ecirc; pode <a href="http://www.hufersil.com.br/exemplo/drag-drop/">conferir um exemplo online</a> ou <a href="http://www.hufersil.com.br/lumine/exemplos">baixar os arquivos do tutorial na se&ccedil;&atilde;o de exemplos</a>.</p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Ter, 31 de janeiro de 2012 - as 10h27]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/geracao_imagem_drag_drop_jquery_jqueryui_php</link>
</item>
<item>
<title><![CDATA[Exemplo de questionário]]></title>
<description><![CDATA[<p>Fala galera.</p>
<p>Ajudando uma pessoa no f&oacute;rum do iMasters / PHP esses dias atr&aacute;s, fiz um para ele um exemplo de como criar um question&aacute;rio e gravar as op&ccedil;&otilde;es selecionadas.</p>
<!-- more -->
<p>O usu&aacute;rio tamb&eacute;m pode definir quantas op&ccedil;&otilde;es podem ser selecionadas dentro de cada pergunta.</p>
<p>Tamb&eacute;m fiz um exemplo de como extrair os resultados do question&aacute;rio.</p>
<p>O exemplo pode ser baixado na <a href="/lumine/exemplos">se&ccedil;&atilde;o de exemplos</a>.</p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Seg, 30 de janeiro de 2012 - as 09h45]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/exemplo_questionario</link>
</item>
<item>
<title><![CDATA[Exemplo de Jogo: Nave]]></title>
<description><![CDATA[<p>Mais um exemplozinho de jogo em HTML + JS + CSS:</p>
<p><a href="http://www.hufersil.com.br/exemplo/nave/">Link do Jogo</a></p>
<p><a href="http://www.hufersil.com.br/exemplo/nave/assets/js/game.js">Link do JS</a></p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Qui, 05 de janeiro de 2012 - as 16h38]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/exemplo_jogo_nave</link>
</item>
<item>
<title><![CDATA[Lumine - 1.6!]]></title>
<description><![CDATA[<p>Fala pessoal,</p>
<p>Coloquei hoje uma nova vers&atilde;o de Lumine.<br />
Agora a forma de mapeamento pode ser feita atrav&eacute;s de annotations.<br />
Lumine ainda continua sendo compat&iacute;vel com PHP 5.2.</p>
<p>Voc&ecirc;s podem baixa-lo na <a href="http://www.hufersil.com.br/lumine/downloads">se&ccedil;&atilde;o de downloads</a>. <strong>Aten&ccedil;&atilde;o para as anota&ccedil;&otilde;es que coloquei nesta se&ccedil;&atilde;o</strong>! Houveram altera&ccedil;&otilde;es em nomenclaturas e formas de valida&ccedil;&atilde;o.</p>
<p>@bra&ccedil;os e fique com Deus!<br />
&nbsp;</p>]]></description>
<lastBuildDate><![CDATA[Qui, 05 de janeiro de 2012 - as 10h41]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/lumine_1_6</link>
</item>
<item>
<title><![CDATA[Exemplo de Jogo: Batalha Naval]]></title>
<description><![CDATA[<p>&nbsp;Fala galera,</p>
<p>Mais um joguinho de exemplo em html / javascript</p>
<p><a href="http://www.hufersil.com.br/exemplo/batalha_naval/">Jogar Batalha Naval</a><br />
<a href="http://www.hufersil.com.br/exemplo/batalha_naval/assets/js/game.js">JavaScript do Jogo</a></p>
<p><br />
@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Qua, 21 de dezembro de 2011 - as 11h56]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/batalha_naval</link>
</item>
<item>
<title><![CDATA[JS - Caça Palavras]]></title>
<description><![CDATA[<p>Ol&aacute; pessoas,</p>
<p>H&aacute; uns 5 anos atr&aacute;s, fiz um exemplo de <a href="http://www.mxstudio.com.br/desenvolvimento/flash/caca_palavras/">ca&ccedil;a-palavras em ActionScript 2 para o portal MX Studio</a>.<br />
At&eacute; hoje recebo alguns pedidos dos fontes (arquivos FLA). Sinceramente, nem fa&ccedil;o id&eacute;ia de onde eles estejam.</p>
<p>Resolvi ent&atilde;o fazer uma implementa&ccedil;&atilde;o em HTML.</p>
<p><a href="http://www.hufersil.com.br/exemplo/caca_palavras/">O link voc&ecirc; pode conferir aqui</a>.</p>
<p>@bra&ccedil;os e fiquem com Deus!</p>]]></description>
<lastBuildDate><![CDATA[Qua, 30 de novembro de 2011 - as 15h44]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/js_caca_palavras</link>
</item>
<item>
<title><![CDATA[Quer falar comigo? Pega senha!]]></title>
<description><![CDATA[<p>Hoje a coisa tava corrida no trabalho.</p>
<p>Todo mundo queria falar comigo.</p>
<p>E claro, o companheiro de trabalho Paulo Mu&ntilde;oz n&atilde;o poderia deixar de me zoar, como ele sempre faz.</p>
<p><img alt="" src="http://www.hufersil.com.br/imagens/senha.jpg?" /></p>]]></description>
<lastBuildDate><![CDATA[Qui, 06 de outubro de 2011 - as 22h24]]></lastBuildDate>
<link>http://www.hufersil.com.br/post/pega_senha</link>
</item>
</channel>
</rss>
