<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>caioariede.com weblog &#187; Kohana</title>
	<atom:link href="http://caioariede.com/category/kohanaphp/feed" rel="self" type="application/rss+xml" />
	<link>http://caioariede.com</link>
	<description>— coding for great good</description>
	<lastBuildDate>Mon, 30 Aug 2010 14:22:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ajudando a traduzir o site do Kohana PHP</title>
		<link>http://caioariede.com/2009/ajudando-a-traduzir-o-site-do-kohana-php</link>
		<comments>http://caioariede.com/2009/ajudando-a-traduzir-o-site-do-kohana-php#comments</comments>
		<pubDate>Thu, 18 Jun 2009 23:01:25 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=530</guid>
		<description><![CDATA[Esclarecerei aqui, como ajudar na tradução do site do projeto Kohana PHP.
Primeiramente, baixe e instale o Subversion.
Caso você utilize Ubuntu/Linux, Debian, ou alguma distribuição parecida, você pode instalar através do terminal, usando o comando:
sudo apt-get install subversion
Caso você utilize outra distribuição, ou Windows, mais informações para download estão disponíveis em http://subversion.tigris.org/getting.html#binary-packages
Após a instalação
Após instalar o [...]]]></description>
			<content:encoded><![CDATA[<p>Esclarecerei aqui, como ajudar na tradução do site do projeto Kohana PHP.</p>
<p>Primeiramente, baixe e instale o <a href="http://pt.wikipedia.org/wiki/Subversion">Subversion</a>.</p>
<p>Caso você utilize Ubuntu/Linux, Debian, ou alguma distribuição parecida, você pode instalar através do terminal, usando o comando:</p>
<pre>sudo apt-get install subversion</pre>
<p>Caso você utilize outra distribuição, ou Windows, mais informações para download estão disponíveis em <a href="http://subversion.tigris.org/getting.html#binary-packages">http://subversion.tigris.org/getting.html#binary-packages</a></p>
<h3>Após a instalação</h3>
<p>Após instalar o Subversion, caso esteja no Linux, abra o terminal.</p>
<p>Caso esteja no Windows, vá em Iniciar &gt; Executar, digite &#8220;cmd&#8221; e execute.</p>
<p>Crie uma pasta, no lugar que desejar. Aqui eu optei por ~/kohana.</p>
<p>Esta é a pasta onde você baixará os arquivos do site do Kohana, para fazer isso, vá até a pasta e execute o comando abaixo:</p>
<pre>svn co http://source.kohanaphp.com/branches/website/application kohana-website</pre>
<p>Esse comando baixará somente a pasta <em>application</em>, pois fora dela, não há conteúdo a ser traduzido.</p>
<p>Após o término, você terá os arquivos em sua máquina.</p>
<h3>Realizando o primeiro Patch</h3>
<p>O Patch, ou Correção, nada mais é que a diferença entre o arquivo antigo e o novo (modificado).</p>
<p>Portanto, você irá modificar o arquivo em questão, e realizar o patch através do SVN mesmo. Ele possui uma ferramenta que faz isso.</p>
<p>Para montar esse Mini How To, eu realizarei um patch, no arquivo: <em>i18n/pt_BR/layout.php</em></p>
<p>Realizei algumas alterações no arquivo, comparando com a versão atual em inglês  <em>i18n/en_US/layout.php</em>, adicionei duas traduções que faltavam: <em>menu_redmine</em> e <em>menu_projects</em>.</p>
<p>Após isso, é bastante simples. Somente fui até a pasta, através do terminal e gerei o patch, com o comando:</p>
<pre>svn diff i18n/pt_BR/layout.php &gt; patch_i18n_pt_BR_layout.patch</pre>
<p>Eu acho importante manter uma padronização no nome dos patches.</p>
<h3>Finalizando, envio do Patch</h3>
<p>Foi criado um Ticket no site do Kohana, onde devem ser adicionados os patches, para isso basta se cadastrar no site, ir até o Ticket e enviar o arquivo.</p>
<p>O Ticket criado para isso, foi o <a href="http://dev.kohanaphp.com/issues/1799">#1799</a>.</p>
<p>Espero que esse documento seja de bastante utilidade, e que todos consigam compreender bem.</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/ajudando-a-traduzir-o-site-do-kohana-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Brincando com os Hooks</title>
		<link>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks</link>
		<comments>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks#comments</comments>
		<pubDate>Tue, 26 May 2009 13:59:11 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=525</guid>
		<description><![CDATA[Os Hooks do Kohana PHP são realmente úteis. Demonstrarei como utiliza-los, exemplificando a sua utilização em uma situação real.
O que são Hooks?
Hooks são arquivos que são carregados na inicialização do Kohana, permitindo você adicionar ou modificar funções, chamadas callbacks, que são disparadas pelo Kohana.
Essas funções (ou callbacks) são colocados em uma lista dentro do seu [...]]]></description>
			<content:encoded><![CDATA[<p>Os Hooks do <a href="http://kohanaphp.com/">Kohana <a href="http://sledge.boo-box.com/list/page/ZnJhbWV3b3JrJTJDK3BocCs1JTJDK2VkaXRvciUyQytsaW51eCUyQytvcmllbnRhJUU3JUUzbythK29iamV0b3NfIyNfYm94XyMjX3RhZ2dpbmctdG9vbC13cF8jI18yODM0ODQ=-136" class="bbli">PHP<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a></a> são realmente úteis. Demonstrarei como utiliza-los, exemplificando a sua utilização em uma situação real.</p>
<h3>O que são Hooks?</h3>
<p>Hooks são arquivos que são carregados na inicialização do Kohana, permitindo você adicionar ou modificar funções, chamadas <em>callbacks</em>, que são disparadas pelo Kohana.</p>
<p>Essas funções (ou <em>callbacks</em>) são colocados em uma lista dentro do seu evento específico, chamada Event Queue.</p>
<h3>O que são Eventos?</h3>
<p>Durante a inicialização, e até mesmo durante a execução, em alguns casos, o núcleo do Kohana dispara vários eventos. Eventos que são definidos pelo próprio núcleo.</p>
<p>Você pode ver a lista completa de eventos disparados pelo Kohana, na documentação: <a href="http://docs.kohanaphp.com/general/events">http://docs.kohanaphp.com/general/events</a></p>
<h3>Habilitando os Hooks no Kohana</h3>
<p>Para começar a brincar com os Hooks, é necessário habilitá-los. Para isso, basta configurar a opção <em>enable_hooks</em> no <em>config/config.php</em>, para <em>TRUE</em>:</p>
<pre lang="php">$config['enable_hooks'] = TRUE;</pre>
<h3>Exemplo de utilização de Hooks</h3>
<p>Suponha que tenhamos um site com sistema de autenticação.</p>
<p>Quando um visitante chega, ele é logo direcionado ao <em>controller</em> padrão, definido em <em>config/routes.php</em>, pela seguinte linha:</p>
<pre lang="php">$config['_default'] = 'site';</pre>
<p style="text-align: justify;">O <em>controller</em> site, contém os métodos (páginas): Home (com formulário de autenticação), Quem Somos, Ajuda&#8230;</p>
<p>Agora, o que fazer quando este visitante já estava autenticado anteriormente, e retorna ao site?</p>
<p>A solução mais simples a se fazer, é criar uma verificação no <em>controller</em> site, e caso o usuário já esteja autenticado ele será redirecionado à outro <em>controller</em>, chamado <span style="text-decoration: underline;">painel</span>.</p>
<h4>Problema</h4>
<p>A cada redirecionamento do <em>controller</em> site ao controller <em>painel</em>, seria realizado outra inicialização do sistema completo.</p>
<h4>Solução</h4>
<p>Uma solução elegante e correta para isso, é utilizar um Hook para informar ao <em>Router</em>, o <em>controller</em> correto a ser chamado.</p>
<p>O <em>Router</em> é quem define através da URL, qual <em>controller</em> deverá ser chamado, portanto a única coisa que terá de ser feita, é dizer à ele qual <em>controller</em> ele deverá chamar.</p>
<p>Criamos então, o arquivo <em>hooks/site.php</em>, o nome não importa, a não ser por fácil identificação posteriormente.</p>
<p>No arquivo, é especificado que no momento do evento <em>system.routing</em>, uma função (leia-se <em>callback</em>) será chamada, antes do <em>Router::setup</em>.</p>
<p>Esse <em>callback</em> definirá o <em>controller</em> correto à ser carregado.</p>
<pre lang="php">&lt;?php defined('SYSPATH') OR die('No direct access allowed.');

function hook_define_controller_padrao()
{
	if (!empty(Router::$current_uri)) return;
	if (Session::instance()-&gt;get('user'))
		// usuário logado
		Router::$current_uri = 'painel';
}</pre>
<p>Você pode também impossibilitar o acesso à página de autenticação, quando o usuário já estiver autenticado, modificação a função <em>callback</em> acima, da seguinte forma:</p>
<pre lang="php">function hook_define_controller_padrao()
{
	$logado = Session::instance()-&gt;get('user');
	if (empty(Router::$current_uri) &amp;&amp; $logado)
		// usuário autenticado
		Router::$current_uri = 'painel';
	elseif (Router::$current_uri == 'site/login' &amp;&amp; $logado)
		// exibir "página não encontrada"
		Event::run('system.404');
}</pre>
<p>Criada a função, é necessário que seja adicionada à lista de eventos a serem realizados, isso pode ser feito logo abaixo da função, ou no final do arquivo Hook.</p>
<pre lang="php">Event::add_before(
	'system.routing',
	array('Router', 'setup'),
	'hook_define_controller_padrao'
);</pre>
<p>Existe também como definir novos eventos, mas isso fica para outro artigo, pois este é somente uma introdução sobre o assunto.</p>
<p>Utilize os Hooks sempre que possível, eles poderão reduzir inúmeras linhas no seu código, tornando-o mais enxuto, legível e organizado.</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Boas práticas de desenvolvimento</title>
		<link>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento</link>
		<comments>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento#comments</comments>
		<pubDate>Wed, 20 May 2009 13:03:19 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php + framework]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=453</guid>
		<description><![CDATA[Este artigo tem como objetivo relembrar algumas das funcionalidades disponibilizadas pelo excelente framework Kohana PHP. Funcionalidades estas que podem facilitar, e muito, na hora de desenvolver ou refatorar uma aplicação.
Serve também para aqueles que estão começando a se familiarizar com o framework e querem aprender um pouco mais sobre as possibilidades que ele oferece.
Singleton
Singleton é [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo tem como objetivo relembrar algumas das funcionalidades disponibilizadas pelo excelente framework <a href="http://kohanaphp.com/">Kohana PHP</a>. Funcionalidades estas que podem facilitar, e muito, na hora de desenvolver ou refatorar uma aplicação.</p>
<p>Serve também para aqueles que estão começando a se familiarizar com o framework e querem aprender um pouco mais sobre as possibilidades que ele oferece.</p>
<h3>Singleton</h3>
<p>Singleton é um padrão (Design Pattern) que garante que suas classes serão instânciadas somente uma vez, podendo ser acessadas de forma global, evitando a criação de várias instâncias desnecessarias da mesma.</p>
<p>No KohanaPHP isso pode ser aplicado nas bibliotecas, pois todas as bibliotecas tem suporte a Singleton.</p>
<p>Ao invés de criar uma nova instância:</p>
<pre lang="php">$this-&gt;session = new Session;</pre>
<p>Você utiliza o método estático <em>instance</em>:</p>
<pre lang="php">$this-&gt;session = Session::instance();</pre>
<p>O que o método <em>instance</em> cria uma nova instância, armazena-a em uma variável, e a retorna. Na próxima chamada é feita uma verificação, caso uma variável com a instância já exista, ao invés de criar uma nova, ele retorna a instância contida na variável.</p>
<h3>Utilize o Query Builder</h3>
<p>Muita gente odeia Query Builders por serem um tanto limitados, porém se você quiser que a sua aplicação seja independente de banco de dados, use-o. Deixe para escrever SQL&#8217;s somente quando for realmente necessários.</p>
<p>O Query Builder suporta <em>method chaining</em>, o que pode deixar o código mais elegante.</p>
<p><em>Exemplos de Method Chaining com Query Builder</em></p>
<pre lang="php">$result = $this-&gt;db-&gt;select('id, nome')
                   -&gt;from('tabela')
                   -&gt;where(array('categoria' =&gt; 1))
                   -&gt;limit(10)
                   -&gt;get();</pre>
<pre lang="php">$result = $this-&gt;db-&gt;select('id')
                   -&gt;getwhere('tabela', array('categoria' =&gt; 2));</pre>
<p><em>Contando total de registros em uma tabela</em></p>
<pre lang="php">$total_usuarios = $this-&gt;db-&gt;count_records('usuarios');</pre>
<h3>Utilize segmentos, de preferência nomeados</h3>
<p>Ao invés de usar variáveis <em>$_GET</em>, dê preferência aos segmentos. Além de mais elegantes, são mais fáceis de serem manipulados.</p>
<p>http://meusite/clientes/busca/<strong>cidade</strong>/Bauru/<strong>estado</strong>/SP</p>
<p>Onde <em>clientes</em> é o controller, <em>busca</em> é o método, e <em>cidade</em> e <em>estado</em> são segmentos.</p>
<pre lang="php">$cidade = uri::segment('cidade');</pre>
<pre lang="php">$estado = uri::segment('estado');</pre>
<h3>Nunca modifique os arquivos do diretório <em>system</em></h3>
<p>Os recursos disponíveis pelo Kohana, são carregados no formato de cascata, ou seja, primeiro ele verifica se o arquivo existe no diretório <em>application</em>, caso não exista, então procura nos diretórios de cada módulo, em seguida no diretório <em>system</em>.</p>
<p>Um bom exemplo são os arquivos de configuração, localizados no diretório <em>system/config/</em>.</p>
<p>O caminho percorrido até ele chegar em qualquer arquivo dentro deste diretório, é o seguinte:</p>
<pre>application/config/auth.php
--&gt; modules/archive/config/auth.php
--&gt; modules/flot/config/auth.php
--&gt; modules/auth/config/auth.php (encontrado)</pre>
<p>Caso não fosse encontrado, ele continuaria a pesquisar, terminando no diretório <em>system</em>:</p>
<pre>system/config/auth.php</pre>
<p>Por isso é muito importante transferir todos os arquivos necessários para o diretório <em>application</em>, e nunca modifica-los nos seus diretórios de origem.</p>
<h3>Use os helpers e bibliotecas disponíveis</h3>
<p>O Kohana disponibiliza uma série de helpers e bibliotecas que podem facilitar e muito o desenvolvimento. Não invente a roda à todo momento.</p>
<p><em>Exemplo de utilização do helper Upload</em></p>
<pre lang="php">$filename = $_FILES['arquivo']['name'];
$tmp_name = $_FILES['arquivo']['tmp_name'];

$filename_path = upload::save(array
(
	'name' =&gt; $filename,
	'tmp_name' =&gt; $tmp_name
), $filename);

$filename = basename($filename_path);</pre>
<p><em>Exemplo de utilização da biblioteca Pagination</em></p>
<pre lang="php">$this-&gt;pagination = new Pagination(array
(
	'base_url'       =&gt; 'noticias/page/',
	'uri_segment'    =&gt; 'page',
	'total_items'    =&gt; $total_num_rows,
	'items_per_page' =&gt; $rows,
	'style'          =&gt; 'digg'
));

echo $this-&gt;pagination;</pre>
<p>No exemplo acima, será impressa uma paginação no estilo Digg.</p>
<p>Existem outros estilos de paginação que podem ser conferidos através da documentação:</p>
<p>http://docs.kohanaphp.com/libraries/pagination</p>
<h3>Estenda os helpers, sempre que necessário</h3>
<p>Uma prática muito encorajada no Kohana é a extensão dos helpers para se adequar as suas necessidades.</p>
<p>Por exemplo, podemos estender o helper <em>format</em>, para formatar também o tamanho de arquivos, criando o arquivo <em>MY_format.php</em> dentro do diretório helpers da sua apliação, geralmente <em>application/helpers</em>.</p>
<p><em>applications/helpers/MY_format.php</em></p>
<pre lang="php">&lt;?php defined('SYSPATH') or die('No direct script access.');

class format extends format_Core
{
	public static function filesize($size)
	{
		$sizes = array('B', 'kB', 'MB', 'GB',
		            'TB', 'PB', 'EB', 'ZB', 'YB');
		$c = count($sizes) - 1;
		for ($i = 0; $size &gt; 1024 &amp;&amp; $i &lt; $c; $i++)
			$size /= 1024;
		return round($size, 2) . $sizes[$i];
	}
}</pre>
<pre lang="php">echo format::filesize(1024*4); // 4kB</pre>
<p>Lembre-se, todo arquivo de extensão deve ser iniciado por <em>MY_</em>, é um padrão definido pelo Kohana.</p>
<h3>Internacionalização</h3>
<p>Criar uma aplicação multi-idiomas com o Kohana é relativamente simples.</p>
<p>Primeiro crie o diretório <em>i18n</em> dentro de <em>applications</em>, e em seguida crie o diretório <em>pt_BR</em>.</p>
<p><em>applications/i18n/pt_BR/</em></p>
<p>Após isso, as strings são divididas entre arquivos, dentro desse diretório, por exemplo:</p>
<p><em>applications/i18n/pt_BR/caption.php</em></p>
<p>Dentro de cada arquivo, são especificadas as strings:</p>
<pre lang="php">&lt;?php defined('SYSPATH') OR die('No direct access allowed.');

$lang = array
(
	'submit' =&gt; 'Enviar',
	'cancel' =&gt; 'Cancelar',
	'confirm' =&gt; 'Confirmar',
);</pre>
<pre lang="php">echo Kohana::lang('caption.submit'); // Enviar</pre>
<p>Também é permitido a utilização de Arrays:</p>
<pre lang="php">'confirm' =&gt; array
(
	'edit?' =&gt; 'Editar texto?',
	'remove?' =&gt; 'Remover texto?'
);</pre>
<pre lang="php">echo Kohana::lang('message.confirm.edit?'); // Editar texto?</pre>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Mini How-To</title>
		<link>http://caioariede.com/2008/kohana-mini-how-to</link>
		<comments>http://caioariede.com/2008/kohana-mini-how-to#comments</comments>
		<pubDate>Sun, 31 Aug 2008 16:31:17 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=89</guid>
		<description><![CDATA[Neste tutorial, quero demonstrar a criação de uma aplicação usando o framework Kohana, que eu tenho utilizado muito no meu dia-a-dia, e acho que merece a atenção de todos que procuram um framework que facilite o desenvolvimento de aplicações php/web.
Algumas dúvidas relacionadas a este material podem ser retiradas através do documentação do próprio Kohana PHP, [...]]]></description>
			<content:encoded><![CDATA[<p>Neste tutorial, quero demonstrar a criação de uma aplicação usando o framework <a href="http://kohanaphp.com/" target="_blank">Kohana</a>, que eu tenho utilizado muito no meu dia-a-dia, e acho que merece a atenção de todos que procuram um framework que facilite o desenvolvimento de aplicações php/web.</p>
<p>Algumas dúvidas relacionadas a este material podem ser retiradas através do documentação do próprio Kohana PHP, em http://docs.kohanaphp.com/.</p>
<p>Começando *bem* do começo, <em>o começo do começo</em>..</p>
<ol>
<li>Faça o download do Kohana no site <a href="http://kohanaphp.com/" target="_blank">http://kohanaphp.com/</a></li>
<li>Renomeie a pasta <strong>Kohana_vX.X.X</strong> para <strong>agenda</strong>.</li>
<li>Deixe o diretório <strong>application/logs</strong> com permissão para escrita.</li>
<li>Edite o arquivo <strong>application/config.php</strong> e altere <em>site_domain</em> para o respectivo caminho onde se encontra o kohana, <em>/agenda/</em>, caso seja <em>http://localhost/agenda/</em>.</li>
</ol>
<p>E vamos lá..</p>
<p><span id="more-89"></span></p>
<p>Primeiro vamos &#8220;limpar&#8221; o kohana, removendo os exemplos, que nesse tutorial, não serão utilizados.</p>
<ol>
<li>Apague todos arquivos que estão dentro da pasta <strong>application/controllers</strong></li>
<li>Apague todos arquivos que estão dentro da pasta <strong>application/views</strong></li>
</ol>
<p>Crie um novo arquivo, <strong>application/controllers/agenda.php</strong>, que será um <em>controller</em>.</p>
<pre lang="php">&lt;?php defined('SYSPATH') or die('No direct script access.');

class Agenda_Controller extends Controller
{

    public function create()
    {
        /* Aqui iremos chamar a view, que esta localizada dentro
         * da pasta "views/", o .php pode ser omitido.
         */
        $view = new View('create');
        $view-&gt;render(true);
    }

}

?&gt;</pre>
<p>Crie agora, o arquivo <strong>application/views/create.php</strong>, que será a <em>view</em> chamada pelo método <em>create </em>dentro do controller <em>Agenda</em>.</p>
<pre lang="php">&lt;form action="&lt;?php echo url::site('agenda/create'); ?&gt;" method="post"&gt;
    &lt;label for="name"&gt;Nome:&lt;/label&gt;
        &lt;input id="name" name="name" type="text" /&gt;
    &lt;label for="phone"&gt;Telefone:&lt;/label&gt;
        &lt;input id="phone" name="phone" type="text" /&gt;
    &lt;input type="submit" value="Salvar" /&gt;
&lt;/form&gt;</pre>
<p>Repare, que na view <em>create.php</em>, usamos o método url::site(). O método <em>site</em>, faz parte do <strong>helper</strong> <em>url</em>, que contém um conjunto de métodos úteis que ajudaram no desenvolvimento de suas aplicações, o método <em>site</em> retorna o caminho <em>site_domain + controller/metodo</em>.</p>
<p>Aqui já podemos chamar a url <strong>http://localhost/agenda/index.php/agenda/create</strong></p>
<p>E através dessa url você já pode perceber que o formato das url&#8217;s é:</p>
<p><em>index.php/controller/método</em></p>
<p>Caso queira, você também pode usar subdiretórios dentro da pasta <em>applications/controllers</em>, por exemplo <em>agenda/escola/contatos.php</em>, onde <em>contatos.php</em> é um controller com nome <em>Contatos_Controller</em>, e pode ser acessado através da url <em>agenda/index.php/agenda/escola/contatos</em>. Enfim, isso não vem ao caso agora.</p>
<p>Voltando, vamos dar vida a nossa aplicação. Crie um banco de dados para a agenda:</p>
<pre lang="sql">CREATE DATABASE `agenda` ;

CREATE TABLE `agenda`.`contacts` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8</pre>
<p>Agora, copie o arquivo <strong>system/config/database.php</strong> para <strong>application/config/database.php</strong>, na pasta <em>system/config</em> ficam todos arquivos de configuração padrão, como nós não vamos usar uma &#8220;base de dados padrão&#8221;, então copiamos o arquivo para a pasta da nossa aplicação.</p>
<p>Edite o arquivo <strong>application/config/database.php</strong>, configurando o acesso ao seu banco de dados:</p>
<p>&#8216;user&#8217;     =&gt; &#8216;usuário&#8217;,<br />
&#8216;pass&#8217;     =&gt; &#8217;senha_do_usuario&#8217;,<br />
&#8216;database&#8217; =&gt; &#8216;agenda&#8217;</p>
<p>E então vamos alterar o método <em>create</em> no nosso controller <em>agenda</em>, para que adicione nossos dados ao banco de dados.</p>
<pre lang="php">public function create()
{
    if (request::method() == 'post')
    {
        $name  = (string) @$_POST['name'];
        $phone = (string) @$_POST['phone'];

        // aqui inserimos os dados no banco
        $db = new Database;
        $db-&gt;insert('contacts', array('name' =&gt; $name, 'phone' =&gt; $phone));

        // redirecionamos para o metodo "contacts"
        url::redirect('agenda/contacts');
    }
    /* Aqui iremos chamar a view, que esta localizada dentro
     * da pasta "views/", o .php pode ser omitido.
     */
    $view = new View('create');
    $view-&gt;render(true);
}</pre>
<p>Você já pode testar o formulário, porém ele dará erro, pois ainda não criamos o método contacts, que será criado agora:</p>
<pre lang="php">public function contacts()
{
    /* Primeiro vamos retornar a lista de contatos do banco de dados
     * e guarda-la na variável $result
     */
    $db = new Database;
    $result = $db-&gt;get('contacts');
    /* Aqui iremos chamar a view (views/contacts.php),
     * passando a variável de nome "result".
     */
    $view = new View('contacts', array('result' =&gt; $result));
    $view-&gt;render(true);
}</pre>
<p>E a view contacts.php ficará assim:</p>
<pre lang="php">&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Telefone&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($result as $r): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $r-&gt;id; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $r-&gt;name; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $r-&gt;phone; ?&gt;&lt;/td&gt;
&lt;td&gt;
    &lt;?php
        echo html::anchor('agenda/edit/' . $r-&gt;id, 'Editar');
    ?&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/tbody&gt;&lt;/table&gt;</pre>
<p>Observe que foi utilizado mais um <em>helper</em>, html::anchor(), que basicamente cria um link &lt;a href=&#8221;"&gt;&#8230;&lt;/a&gt;.</p>
<p>Bom, agora que já temos o método <em>create</em>, o <em>contacts (list)</em> falta o <em>edit</em>, certo?</p>
<pre lang="php">public function edit($id = null)
{
    $db = new Database;
    $id = (int) $id;
    $result = $db-&gt;limit(1)-&gt;getwhere('contacts', array('id' =&gt; $id));
    if (count($result) == 0)
    {
        /* Caso não exista um contato com este id
         * retorna uma página "not found" do kohana
         */
        Event::run('system.404');
    }
    /* Se chegou até aqui, é porque achou o registro
     */
    $row = $result[0];
    /* Conferimos se é um método http post,
     * se for, salvamos o registro
     */
    if (request::method() == 'post')
    {
        $name  = (string) @$_POST['name'];
        $phone = (string) @$_POST['phone'];

        // aqui inserimos os dados no banco
        $db = new Database;
        $db-&gt;update('contacts',
                    array('name' =&gt; $name, 'phone' =&gt; $phone),
                    array('id' =&gt; $row-&gt;id));

        // redirecionamos para o metodo "contacts"
        url::redirect('agenda/contacts');
    }
    /* E então, chamamos a view responsável..
     */
    $view = new View('edit', array('row' =&gt; $row));
    $view-&gt;render(true);
}</pre>
<p>E então a view edit.php</p>
<pre lang="php">&lt;form action="&lt;?php echo url::site('agenda/edit/' . $row-&gt;id); ?&gt;"
      method="post"&gt;

&lt;label for="name"&gt;Nome:&lt;/label&gt;
&lt;input id="name"
       name="name"
       type="text"
       value="&lt;?php echo $row-&gt;name; ?&gt;" /&gt;

&lt;label for="phone"&gt;Telefone:&lt;/label&gt;
&lt;input id="phone"
       name="phone"
       type="text"
       value="&lt;?php echo $row-&gt;phone; ?&gt;" /&gt;

&lt;input type="submit" value="Salvar" /&gt;

&lt;/form&gt;</pre>
<p>Deixe o seu comentário. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2008/kohana-mini-how-to/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Criando múltiplas aplicações</title>
		<link>http://caioariede.com/2008/kohana-php-criando-multiplas-aplicacoes</link>
		<comments>http://caioariede.com/2008/kohana-php-criando-multiplas-aplicacoes#comments</comments>
		<pubDate>Sat, 21 Jun 2008 19:02:57 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=78</guid>
		<description><![CDATA[De uns tempos pra cá, tenho utilizado bastante o Kohana PHP para suprir minhas necessidades Web + PHP.
Conheci o Kohana após desenvolver por um bom tempo em cima do framework, bem conhecido, Code Igniter, no qual o Kohana foi baseado.
Dizendo &#8220;por cima&#8221; (não é o foco do artigo), resolvi trocar o Code Igniter pelo  [...]]]></description>
			<content:encoded><![CDATA[<p>De uns tempos pra cá, tenho utilizado bastante o Kohana PHP para suprir minhas necessidades Web + PHP.</p>
<p>Conheci o Kohana após desenvolver por um bom tempo em cima do framework, bem conhecido, Code Igniter, no qual o Kohana foi baseado.</p>
<p>Dizendo &#8220;por cima&#8221; (não é o foco do artigo), resolvi trocar o Code Igniter pelo  Kohana, basicamente devido ao uso estrito da orientação a objetos disponibilizada no PHP 5, e também ao fato de que o Kohana é mantido pela sua própria comunidade, o contrário do Code Igniter, que todos sempre tiveram que esperar a boa vontade do pessoal da Ellislab para o lançamento de novas versões, features, etc&#8230; Enfim, isso é assunto para outra discussão, em breve.</p>
<p>O que quero explicar aqui, é uma coisa bem básica de se fazer no Kohana, a criação de <strong>Múltiplas Aplicações, apenas com uma instância do Kohana</strong>.</p>
<p><span id="more-78"></span></p>
<p>Infelizmente não tive a oportunidade de fazer o mesmo no Code Igniter, por falta de necessidade mesmo. Então *não* vou falar aqui, qual framework é mais fácil de se fazer isso, se difere (já que o Kohana é baseado no Code Igniter), etc&#8230; Se alguém souber como funciona no CI (acredito que da mesma forma do Kohana), pronuncie-se! :-)</p>
<p>Lembrando que isso esse é só um exemplo de como você pode utilizar o conceito de múltiplas aplicações no Kohana.</p>
<p>Baseando-se em uma instalação limpa do Kohana, após a extração dos arquivos, você terá uma estrutura assim:</p>
<p>application/<br />
system/<br />
index.php</p>
<p>Neste exemplo, vou criar duas aplicações: app_index e app_admin. Onde app_index será a aplicação principal (site) e a app_admin será a aplicação responsável pela administração do site.</p>
<p>Portanto, você deve fazer uma cópia do diretório <em>application</em>, no mesmo local, e renomear as  duas pastas para: <em>app_index</em> e <em>app_admin</em>. Tendo assim a estrutura abaixo:</p>
<p>app_admin/<br />
app_index/<br />
index.php</p>
<p>O próximo passo é a criação do .htaccess que vai nos auxiliar nessa &#8220;arte&#8221;. Personalize o código abaixo conforme a sua necessidade.</p>
<p>Este .htaccess, tem a função de direcionar as URL&#8217;s para o arquivo especifico de cada uma. Ou seja:</p>
<p>http://127.0.0.1/dir_instalacao_kohana/admin -&gt; admin.php<br />
http://127.0.0.1/dir_instalacao_kohana/(qualquer outra coisa que nao seja admin/) -&gt; index.php</p>
<p>Grande parte do .htaccess abaixo, foi retirado da própria documentação do Kohana.</p>
<pre lang="apache"># Turn on URL rewriting
RewriteEngine On

# Put your installation directory here:
# If your URL is www.example.com/, use /
# If your URL is www.example.com/kohana/, use /kohana/
RewriteBase /dir_instalacao_kohana/

# Do not enable rewriting for files or directories that exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} /dir_instalacao_kohana/admin(/|$)
RewriteRule ^admin/(.*)$ admin.php/$1 [PT,L]

RewriteRule ^(.*)$ index.php/$1 [PT,L]
</pre>
<p>Podemos perceber que a regra (RewriteRule) ^admin/(.*)$ aponta para o arquivo admin.php, o qual eu vou explicar de onde vem agora.</p>
<p>O arquivo <em>admin.php</em>, nada mais é que a cópia do arquivo <em>index.php</em>, porém ele precisa ser configurado para apontar para o diretório app_admin, assim como o index.php precisa ser configurado para apontar para o diretório app_index também, como abaixo.</p>
<p>index.php</p>
<pre lang="php">$kohana_application = 'app_index';
</pre>
<p>admin.php</p>
<pre lang="php">$kohana_application = 'app_admin';
</pre>
<p>Após isso, vem a parte da configuração especifica de cada aplicação. Uma dessas configurações, que com certeza você vai precisar é o <em>routes.php</em>, que fica por padrão localizado no <em>system/config/routes.php</em>.</p>
<p>Se você não tiver o arquivo routes.php, dentro da pasta config da sua aplicação, ele vai pegar o arquivo padrão que é o próprio <em>system/config/routes.php</em>. Portanto faça uma cópia do <em>routes.php</em> para cada uma de suas aplicações, no nosso caso, para <em>app_index/config/routes.php</em> e <em>app_admin/config/routes.php</em>.</p>
<p>De aqui pra frente é só com você, a estrutura esta montada, e espero que a explicação esteja simples e fácil de compreender.</p>
<p>Não deixe de comentar sua própria experiência.</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2008/kohana-php-criando-multiplas-aplicacoes/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
