Mostrando postagens com marcador PHP. Mostrar todas as postagens
Mostrando postagens com marcador PHP. Mostrar todas as postagens

sábado, abril 18, 2015

Instalação do Laravel 5 no Ubuntu 14.10

O framework Laravel é atualmente um dos mais bem conceituados no mundo PHP. Isso se dá não apenas por conta do seu código limpo e elegante, mas também pela suave curva de aprendizado, recursos oferecidos, facilidade de uso e uma boa documentação.

Neste post, será demonstrado a instalação do mesmo no Ubuntu 14.10 utilizando o Terminal. Alguns pacotes e configurações descritos são opcionais, principalmente para quem não trabalha com desenvolvimento Webmapping.

1) Atualizando o Ubuntu:

$  sudo apt-get update && sudo apt-get upgrade -y

2) Servidor Apache

$  sudo apt-get install apache2

Em seguida, deve-se configurar as permissões do seu usuário na pasta de html. Substitua a palavra "marcello" pelo nome do seu usuário:

$  sudo adduser marcello www-data
$  sudo chown marcello:www-data -R /var/www/html
$  sudo chmod 755 -R /var/www/html


 3) PHP 5

$  sudo apt-get install php5

Criação o arquivo info.php dentro do diretório /var/www/html:

$  cd /var/www/html/
$  touch info.php
$  echo '<?php phpinfo(); ?>' >> info.php

Abra o browser e verifique a instalação: http://localhost/info.php

4) PostgreSQL / PostGIS (opcional)

$  sudo apt-get install postgresql-9.4-postgis-2.1 pgadmin3

Troque o seu usuário para o usuário postgres com os comandos:

$  sudo su
$  su postgres
$  postgres@ubuntu:/home/marcello$ createuser -s <seu_usuario> -P

5) Módulo PostgreSQL para o PHP 5

$  sudo apt-get install php5-pgsql

6) Extensão Mcrypt

$  sudo apt-get install php5-mcrypt
$  sudo php5enmod mcrypt
$  sudo service apache2 reload

7) Habilitando o mod_rewrite

$  sudo a2enmod rewrite
$  sudo service apache2 restart

Abra o arquivo:

$  sudo nano /etc/apache2/sites-available/000-default.conf

Procure por “DocumentRoot /var/www/html” e adicione as linhas a seguir logo abaixo:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Saia do nano digitando control x, confirme as modificações (y) e por último tecle ENTER. Reinicie o servidor novamente:

$  sudo service apache2 reload

8) Composer

$  sudo apt-get install curl
$  curl -sS https://getcomposer.org/installer | php
$  mv composer.phar /usr/local/bin/composer

9) Nosso primeiro projeto com o Laravel 5

Na pasta /var/www/html/, execute o comando abaixo para realizar a instalação do Laravel:

$  composer create-project laravel/laravel <nome-do-projeto> --prefer-dist

Neste exemplo,  o nome do nosso projeto será sirh. Em seguida entre na pasta e execute os comando a seguir:

$  cd sirh
$  sudo chmod -R 777 storage/
$  php artisan serve

Temos então a aplicação funcionando no endereço http://localhost:8000

10) Criando um Virtual Host (opcional)

Embora seja possível acessar o projeto atráves do comando anterior, eu particularmente prefiro acessar através de uma url com o seguinte formato http://nome-do-projeto.dev. Para isso é necessário configurar um Virtual Host, da seguinte forma:
$  cd /etc/apache2/sites-available
$  sudo touch sirh.dev.conf
$  sudo nano sirh.dev.conf

Coloque o conteúdo a seguir dentro do arquivo criado:

<VirtualHost *:80>
  ServerName sirh.dev
  DocumentRoot /var/www/html/sirh/public
   <Directory /var/www/html/sirh/public>
     Options Indexes FollowSymLinks
     AllowOverride All
     Require all granted
   </Directory>
</VirtualHost>

Saia do nano digitando control x, confirme as modificações (y) e por último tecle ENTER. Será necessário ativar o VirtualHost com o comando:

$  sudo a2ensite  sirh.dev.conf

Altere o arquivo de hosts...

$  sudo nano /etc/hosts

...adicionando a seguinte linha ao final do arquivo:

 127.0.0.1 sirh.dev

Por último, reinicie o servidor Apache:

$  sudo service apache2 reload

Acesse o link http://sirh.dev/, você deverá ver a página inicial do Laravel:



Caso não consiga chegar até aqui, entre em contato comigo, dúvidas e sugestões serão bem vindas.

Referências:

Documentação do Laravel:
http://laravel.com/docs/master

Iniciando um Novo Projeto no Laravel:
 http://magazine.softerize.com.br/tutoriais/php/laravel/iniciando-um-novo-projeto-laravel

sábado, maio 10, 2014

Aplicações WebGIS com o Laravel

Quem programa em PHP já deve conhecer ou ter ouvido falar sobre o Laravel. Uma coisa interessante neste framework é que é possível trabalhar com dados espaciais de forma muito prática.

O código abaixo exemplifica a implementação da classe Obra, que no PostGIS é uma tabela espacial do tipo POINT.

Primeiro criamos a migration:

Após rodarmos a migration, criamos o model Obras.php

No controller ObrasConrtoller.php, temos o método postCreate(), que recebe os dados de uma view onde são informadas as coordenadas x e y através de um formulário (ou de alguma aplicação Webmapping como mostra a Figura 1). Tais coordenadas são checadas através do método estático checkCoords($x, $y) do model Municipios.php. Este método faz a verificação das coordenadas informadas, que devem estar dentro dos limites do estado:

 
Figura 1 - Exemplo de View.

Embora o código aqui esteja bastante resumido, acredito que dá para se ter uma ideia do fluxo de trabalho neste framework, envolvendo dados espaciais. Qualquer dúvida ou melhoria no código serão bem vindas.

Um abraço e até a próxima o/

segunda-feira, outubro 11, 2010

Tutorial CodeIgniter - Parte 5

Vamos finalizar a nossa aplicação desenvolvendo o CRUD para a tabela rio, grande parte do código utilizado nas postagens anteriores será reutilizado.

Vamos começar com o rio_model.php:

<?php
class Rio_model extends CI_Model
{

    function __construct()
    {
        parent::__construct();
    }

    function get_rio()
    {
        $this->db->order_by('nome_rio', 'asc');
        //junção com a tabela bacia_hidrografica
        $this->db->join('bacia_hidrografica', 'bacia_hidrografica.id_bacia = rio.id_bacia');
        $query = $this->db->get('rio');
        if ($query->num_rows() > 0)
        {
            return $query->result();
        }
        else
        {
            return false;
        }
    }

    function insert()
    {
        $data = $_POST;
        return $this->db->insert('rio', $data);
    }

    function get_where($id)
    {
        $this->db->where('id_rio', $id);
        $this->db->join('bacia_hidrografica', 'bacia_hidrografica.id_bacia = rio.id_bacia');
        $query = $this->db->get('rio');
        return $query->row();
    }

    function update($id)
    {
        $data = $_POST;
        $this->db->where('id_rio', $id);
        $this->db->update('rio', $data);
    }

    function delete($id)
    {
        $this->db->where('id_rio', $id);
        return $this->db->delete('rio');
    }

}

O nosso controllador rio.php vai carregar dois model´s, já que teremos nos formulários de inserção e de atualização uma lista das bacias cadastradas:

<?php

class Rio extends CI_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model(array('rio_model', 'bacia_model'));
        $this->load->library('form_validation');
    }

    function index()
    {
        $data['titulo'] = "SIRH";
        $data['cabecalho'] = "Rios";

        $data['rios'] = $this->rio_model->get_rio();

        $this->load->view('rio_view', $data);
    }

    function criar()
    {
        $data['titulo'] = "SIRH - Novo Rio";
        $data['cabecalho'] = "Criar novo Rio";

        $data['bacias'] = $this->bacia_model->get_bacia();

        $this->load->view('rio_new', $data);
    }

    function insere()
    {

        $data['titulo'] = "SIRH - Novo Rio | Erro na Validação, preencha corretamente!";
        $data['cabecalho'] = "Criar novo Rio | Preencha Corretamente!";

        $data['bacias'] = $this->bacia_model->get_bacia();

        $this->form_validation->set_rules('nome_rio', 'Nome do Rio', 'required|alpha');
        $this->form_validation->set_rules('comprimento_km', 'Comprimento', 'required|numeric');
        $this->form_validation->set_rules('id_bacia', 'Bacia Hidrográfica', 'required');

        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('rio_new', $data);
        }
        else
        {
            $this->rio_model->insert();
            $this->session->set_flashdata('msg', 'Registro Criado com Sucesso!');
            redirect('rio');
        }
    }

    function editar($id)
    {
        $data['titulo'] = "SIRH - Editar Rio";
        $data['cabecalho'] = "Editar Rio";

        $data['registro'] = $this->rio_model->get_where($id);

        $data['bacias'] = $this->bacia_model->get_bacia();

        $this->load->view('rio_new', $data);
    }

    function atualizar()
    {
        $id = $this->input->post('id_rio');

        $data['titulo'] = "SIRH - Editar Rio | Erro na Validação, preencha corretamente!";
        $data['cabecalho'] = "Editar Rio | Preencha Corretamente!";

        $data['registro'] = $this->rio_model->get_where($id);

        $data['bacias'] = $this->bacia_model->get_bacia();

        $this->form_validation->set_rules('nome_rio', 'Nome do Rio', 'required|alpha');
        $this->form_validation->set_rules('comprimento_km', 'Comprimento', 'required|numeric');
        $this->form_validation->set_rules('id_bacia', 'Bacia Hidrográfica', 'required');

        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('rio_new', $data);
        }
        else
        {
            $this->rio_model->update($id);
            $this->session->set_flashdata('msg', 'Registro Atualizado com Sucesso!');
            redirect('rio');
        }
    }

    function deletar($id)
    {
        if ($this->rio_model->delete($id))
        {
            $this->session->set_flashdata('msg', 'Registro Deletado com Sucesso!');
        } else
        {
            $this->session->set_flashdata('msg', 'ERRO - Não foi possível deletar este registro!');
        }
        redirect('rio');
    }

}

A página de exibição dos rios (rio_view.php):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title><?= $titulo ?></title>
    </head>

    <body>
        <h2><?= $cabecalho ?></h2>

        <p><?= anchor('bacia', 'Ver Bacias Hidrográficas')?> &nbsp; <?= anchor('rio', 'Ver Rios')?></p>

        <p><?= anchor('rio/criar', 'Criar Rio') ?></p>

        <p><?= @$this->session->flashdata('msg'); ?></p>

        <table border="1">
            <thead>
                <tr>
                    <th>
                        Nome do rio
                    </th>
                    <th>
                        Comprimento (km)
                    </th>
                    <th>
                        Nome da bacia
                    </th>
                    <th>
                        Ações
                    </th>
                </tr>
            </thead>
            <tbody>
                <?php if ($rios != false): ?>
                <?php foreach ($rios as $rio): ?>
                        <tr>
                           <td>
                                <?= $rio->nome_rio ?>
                           </td>
                           <td>
                                <?= $rio->comprimento_km ?>
                           </td>
                           <td>
                                <?= $rio->nome_bacia ?>
                           </td>
                    <td>
                        <?= anchor('rio/editar/' . $rio->id_rio, 'Editar') ?> |
                        <?= anchor('rio/deletar/' . $rio->id_rio, 'Deletar') ?>
                    </td>
                </tr>
                <?php endforeach; ?>
                <?php else: ?>
                            <p>Não há registros cadastrados!</p>
                <?php endif ?>
            </tbody>
        </table>
    </body>
</html>

Da mesma forma como fizemos nas bacias, teremos um único arquivo responsável pelo cadastramento e atualização dos dados referentes a esta tabela (rio_new.php):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title><?= $titulo ?></title>
    </head>
    <body>
        <h2><?= $cabecalho ?></h2>

        <p><?= validation_errors(); ?></p>

        <?php
        //verifica se o form vai ser usado para insert ou update
        if (!isset($registro->id_rio))
        {
            echo form_open('rio/insere');
        }
        else
        {
            echo form_open('rio/atualizar');

            echo form_hidden('id_rio', $registro->id_rio);
        }
        ?>
        <p>
            <label>Nome do rio:</label>
            <input name="nome_rio" type="text" id="nome_rio" size="40" value="<?= @$registro->nome_rio ?>" />
        </p>

        <p>
            <label>Comprimento (km): </label>
            <input name="comprimento_km" type="text" id="comprimento_km" size="40" value="<?= @$registro->comprimento_km ?>" />
        </p>

        <p>
            <label>Bacia Hidrográfica</label>
            <select name="id_bacia">
                <option value="<?= @$registro->id_bacia; ?>"> <?= @$registro->nome_bacia; ?> </option>
                <?php foreach ($bacias as $bacia): ?>
                <option value="<?= $bacia->id_bacia; ?>"> <?= $bacia->nome_bacia; ?> </option>
                <?php endforeach; ?>
            </select>
        </p>
        <p>
             <input type="submit" id="Enviar" value="Enviar" />
        </p>
               <?= form_close() ?>
    </body>
</html>

Finalizamos o CRUD das duas tabelas, no nosso próximo post, vou mostrar como habilitar o mod_rewrite e retirar da url o index.php, e também fazer algumas pequenas melhorias visuais com CSS. Até lá!

domingo, outubro 10, 2010

Tutorial CodeIgniter - Parte 4

Vamos agora adicionar a validação no formulário de criação das Bacias Hidrográficas e em seguida, no próximo post, finalizar a aplicação com o CRUD dos rios.

A validação no CodeIgniter é feita através da biblioteca  "form_validation", o único problema que eu tive com ela, foi o fato da mesma não aceitar acentos da língua portuguesa,  para resolvermos  isso, vamos extender a classe do core realizando uma modificação no código da função alpha().

Para ver as mensagens dos erros de validação em português, é necessário baixar este arquivo, em seguida descompactar a pasta pt_br em sirh/system/language, feito isso, agora abra o arquivo config.php (dentro da pasta config) e mude a linha 69 para: $config['language'] = "pt-br";

Temos então que copiar o arquivo Form_validation.php da pasta /system/libraries para a pasta /system/application/libraries, agora abra o arquivo copiado e procure pela função alpha(), comente o return dela, e faça a seguinte alteração:

function alpha($str)
{
    //return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
    return (!preg_match("/^([A-Za-zá-úÁ=Ú.\s])+$/i", $str)) ? FALSE : TRUE;
}
 

Modificada a expressão regular, agora é possível trabalhar com palavras acentuadas.

Abra o controller bacia.php, vamos adicionar a validação nas funções insere() e atualizar(). Para isso é necessário Carregar a biblioteca form_validation no método construtor do controlador:

function __construct()
{
    parent::_construct();
    $this->load->model('bacia_model');
    $this->load->library('form_validation');
}



A função insert() ficará assim:

function insere()
{
    // o campo é requerido e deve ser uma string (alpha)
    $this->form_validation->set_rules('nome_bacia', 'Nome da Bacia', 'required|alpha');
    // caso a validação não passe,  carregue a view com o array $data
    if ($this->form_validation->run() == FALSE)
    {
        $data['titulo'] = "SIRH - Nova Bacia Hidrográfica | Erro na Validação, preencha corretamente!";
        $data['cabecalho'] = "Criar Bacia Hidrográfica | Preencha Corretamente!";

        $this->load->view('bacia_new', $data);
    }
    else
    {
        $this->bacia_model->insert();
        $this->session->set_flashdata('msg', 'Registro Criado com Sucesso!');
        redirect('bacia');
    }
}

e a update():

function atualizar()
{
    $id = $this->input->post('id_bacia');

    $this->form_validation->set_rules('nome_bacia', 'Nome da Bacia', 'required|alpha');

    // caso a validação não passe, carregue a view com o array $data
    if ($this->form_validation->run() == FALSE)
    {
        $data['titulo'] = "SIRH - Editar Bacia Hidrográfica | Erro na Validação, preencha corretamente!";
        $data['cabecalho'] = "Editar Bacia Hidrográfica | Preencha Corretamente!";

        $data['registro'] = $this->bacia_model->get_where($id);

        $this->load->view('bacia_new', $data);
    }
    else
    {
        $this->bacia_model->update($id);
        $this->session->set_flashdata('msg', 'Registro Atualizado com Sucesso!');
        redirect('bacia');
    }
} 

A regra adicionada não permite que o campo "nome" da Bacia Hidrográfica fique sem preenchimento (required), e será permitido apenas o preenchimento com texto (alpha). Para sinalizar as mensagens de erro, Abra a view bacia_new.php e adicione a função abaixo, logo depois do cabeçalho:

<p><?= validation_errors(); ?></p>

É isso... no próximo post vou mostrar como ficará o CRUD da tabela rio. Um abraço e até lá!

terça-feira, setembro 28, 2010

Tutorial CodeIgniter - Parte 3

Neste post, vamos criar as funções que irão realizar as operações inserir, atualizar e deletar os registros da tabela bacia_hidrografica.

Antes de começarmos a criar as funções, vamos habilitar a biblioteca "session" do codeigniter e o helper "form", para isso, abra o arquivo autoload.php e modifique as linhas 42 e 54, respectivamente para:

$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url', 'form');

Vamos começar definindo uma função no model que será responsável por inserir os registros na tabela, abra o arquivo bacia_model.php e adicione a seguinte função:

function insert()
{
  $data = $_POST;
  return $this->db->insert('bacia_hidrografica', $data);
}

Já a função abaixo, retorna a linha da tabela com o id_bacia informado, ela será usada para povoar o campo "nome da bacia" do formulário de atualização:

function get_where($id)
{
    $this->db->where('id_bacia', $id);
    $query = $this->db->get('bacia_hidrografica');
    return $query->row();
}

Para realizar o update, usaremos a função abaixo:
function update($id)
{
    $data = $_POST;
    $this->db->where('id_bacia', $id);
    $this->db->update('bacia_hidrografica', $data);
}

Para deletar um registro desta tabela, primeiro faz-se necessário verificar se a mesma não possui nenhum rio vinculado, pois isso vai gerar uma mensagem de erro vinda do banco de dados, em função da constraint foreign key, logo criaremos a função abaixo que fará essa verificação de vínculo:

function verifica_fk($id)
{
    $this->db->where('id_bacia', $id);
    $query = $this->db->get('rio');
    if ($query->num_rows > 0)
    {
        // se houver fk, retorne falso
        return false;
    } else
    {
        return true;
    }
} 

De posse da função acima,  criaremos a função delete():

function delete($id)
{
   // se for verdadeiro, pode apagar o registro
   if ($this->verifica_fk($id))
   {
      $this->db->where('id_bacia', $id);
      return $this->db->delete('bacia_hidrografica');
   }
   else
   {
      return false;
   }
}

Agora, vamos criar duas funções no controller bacia.php, uma para chamar o formulário que será utilizado para a inserção de novos registros, e a outra, que será responsável por efetivar esta operação, através da função definida no model anteriormente (função insert() ):

OBS: Não vamos usar nenhuma função de validação dos dados nesse momento, este será um assunto abordado em um próximo post.

function criar()
{
    $data['titulo'] = "SIRH - Nova Bacia Hidrográfica";
    $data['cabecalho'] = "Criar nova Bacia Hidrográfica";
    $this->load->view('bacia_new', $data);
}

function insere()
{
    $this->bacia_model->insert();
    $this->session->set_flashdata('msg', 'Registro Criado com Sucesso!');
    redirect('bacia');
}

Seguindo o mesmo raciocínio, para realizar a atualização dos registros, vamos criar mais duas funções no controller, editar() e atualizar():

function editar($id)
{
    $data['titulo'] = "SIRH - Editar Bacia Hidrográfica";
    $data['cabecalho'] = "Editar Bacia Hidrográfica";

    $data['registro'] = $this->bacia_model->get_where($id);

    $this->load->view('bacia_new', $data);
}

function atualizar()
{
    $id = $this->input->post('id_bacia');

    $this->bacia_model->update($id);
    $this->session->set_flashdata('msg', 'Registro Atualizado com Sucesso!');
    redirect('bacia');
}

Criamos então a view bacia_new.php, que tanto servirá para inserir, quanto para atualizar, isso é feito através da verificação da existência da variável $registro->id_bacia:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title><?= $titulo ?></title>
    </head>
    <body>
        <h2><?= $cabecalho ?></h2>
        <?php
            //verifica se o form vai ser usado para insert ou update
            if (!isset($registro->id_bacia))
            {
                echo form_open('bacia/insere');
            }
            else
            {
                echo form_open('bacia/atualizar');
                echo form_hidden('id_bacia', $registro->id_bacia);
            }
        ?>
        <p><label>Nome da Bacia:</label>
            <input name="nome_bacia" type="text" id="nome_bacia" size="40" value="<?= @$registro->nome_bacia ?>" />
        </p>

        <p>
            <input type="submit" id="Enviar" value="Enviar" />
        </p>

        <?= form_close() ?>
    </body>
</html>

Finalizando o controller bacia.php, adicionamos a função deletar(), que vai chamar a função delete() do model:

function deletar($id)
{
    if ($this->bacia_model->delete($id))
    {
        $this->session->set_flashdata('msg', 'Registro Deletado com Sucesso!');
    }
    else
    {
        $this->session->set_flashdata('msg', 'ERRO - Não foi possível deletar este registro!<br/>
                                              Primeiro apague os Rios que se relacionam com esta Bacia');
    }
    redirect('bacia');
}

Para terminar, abra o arquivo bacia_view.php e logo abaixo do cabeçalho, chame a função que irá exibir as mensagens para as operações realizadas pelo usuário:

 <p><?=@$this->session->flashdata('msg');?></p>  


Pronto!!! Já temos um CRUD funcional para a tabela bacia_hidrografica, porém sem a validação dos formulários, isso será o assunto da próxima postagem, até lá!

domingo, setembro 26, 2010

Tutorial CodeIgniter - parte 2

Vamos dar continuidade ao desenvolvimento da aplicação usando o CodeIgniter, na pasta sirh/system/application/controllers crie o arquivo bacia.php com o conteúdo abaixo:

<?php
class Bacia extends CI_Controller
{

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        echo "<h1>Testando... 1, 2, 3</h1>";
    }
}
 No código anterior, criamos o controlador bacia, com a função index, que é exibida por default quando o controlador é chamado. Logo ao digitarmos a url:  http://localhost/sirh/index.php/bacia, veremos a mensagem de teste (Figura 1).

Figura 1 - teste do controlador bacia
Testado o funcionamento do controller bacia, vamos adicionar o cabeçalho e título da nossa página, modificando o código da função index:

function index()
{
  $data['titulo'] = "SIRH";
  $data['cabecalho'] = "Bacias Hidrográficas";

  $this->load->view('bacia_view', $data);
}

agora, dentro da pasta views, em sirh/system/application/, crie um arquivo com o nome bacia_view.php, com o seguinte conteúdo:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <title><?=$titulo?></title>
   </head>

   <body>
      <h2><?=$cabecalho?></h2>
   </body>
</html>

Abra mais uma vez o endereço http://localhost/sirh/index.php/bacia , o resultado deve ser o da Figura 2

Figura 2 - definidos o título e o cabeçalho da página
Está na hora de inserirmos alguns dados para a visualização, execute o script abaixo no banco, para povoar as duas tabelas:

-- INSERINDO 3 Bacias Hidrográficas
INSERT INTO bacia_hidrografica(nome_bacia) VALUES ('Abiaí');
--
INSERT INTO bacia_hidrografica(nome_bacia) VALUES ('Mamanguape');
--
INSERT INTO bacia_hidrografica(nome_bacia) VALUES ('Gramame');

-- INSERINDO 6 Rios nas suas respectivas Bacias
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Papocas', 9, 1);
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Graú', 12, 1);
--
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Mogeiro', 23, 2);
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Gavião', 9, 2);
--
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Guarabira',31, 3);
INSERT INTO rio(nome_rio, comprimento_km, id_bacia) VALUES ('Jacaré', 7, 3);

vamos agora exibir os dados que foram inseridos na tabela bacia_hidrografica, para isso será necessário criar um model (dentro de sirh/system/application/model) , que chamaremos de bacia_model.php, com o seguinte conteúdo:

<?php
class Bacia_model extends CI_Model
{
    function  __construct()
    {
        parent:__construct();
    }

    function get_bacia()
    {
        $this->db->order_by('nome_bacia', 'asc');
        $query = $this->db->get('bacia_hidrografica');
        if ($query->num_rows() > 0)
        {
            return $query->result();
        }
        else
        {
            return false;
        }
    }
}

Agora, vamos modificar o nosso controlador, carregando o model criado e povoando uma variável com um array de objetos, obtidos através da função get_bacia():

<?php
class Bacia extends CI_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model('bacia_model');
    }

    function index()
    {
        $data['titulo'] = "SIRH";
        $data['cabecalho'] = "Bacias Hidrográficas";

        $data['bacias'] = $this->bacia_model->get_bacia();

        $this->load->view('bacia_view', $data);
    }
}

Para finalizar esta postagem, vamos agora modificar a nossa view, basicamente vamos varrer o array de objetos $data['bacias'] e exibir os resultados, também vamos utilizar a função anchor() do CodeIgniter para definir os links desta página, que serão finalizados no próximo Post:


<h2><?=$cabecalho ?></h2>

<p><?=anchor('bacia/criar', 'Criar Bacia Hidrográfica') ?></p>

<table border="1">
    <thead>
        <tr>
            <th>
                Nome da Bacia
            </th>
            <th>
                Ações
            </th>
        </tr>
    </thead>
    <tbody>
        <?php if ($bacias != false): ?>
        <?php foreach ($bacias as $bacia): ?>
            <tr>
            <td>
                <?=$bacia->nome_bacia ?>
            </td>
            <td>
                <?=anchor('bacia/editar/' . $bacia->id_bacia, 'Editar') ?> |
                <?=anchor('bacia/deletar/' . $bacia->id_bacia, 'Deletar') ?>
            </td>
        </tr>
        <?php endforeach; ?>
        <?php else: ?>
        <p>Não há registros cadastrados!</p>
        <?php endif ?>
    </tbody>
</table>

Salve todos os arquivos e abra o navegador e veja o resultado: http://localhost/sirh/index.php/bacia

Figura 3 - Exibição das Bacias Hidrográficas
  Bem pessoal, por hoje é só, para ajudar no entendimento deste exemplo, sugiro dar uma boa olhada na série de screencasts do Nettus+ sobre o CodeIgniter (item 5 do link).

Tutorial CodeIgniter - parte 1

O CRUD é definido como acrônimo da expressão inglesa (Create Retrieve Update and Delete), para as quatro operações básicas utilizadas em um bancos de dados relacionais (RDBMS).
Nesta série de  postagens, criaremos uma aplicação Web com CRUD através da linguagem PHP, para as duas tabelas do modelo lógico da Figura 1, utilizando o Framework CodeIgniter. Para codificar, sugiro o uso do Netbeans com o autocomplete do CodeIgniter, este último pode ser baixado no link: http://rhasan.com/blog/2009/09/codeigniter-auto-complete-with-netbeans/ . Já o banco que irei utilizar nesse exemplo, será o PostgreSQL.

OBS: É necessário que o leitor tenha uma base em PHP OO, pois não vou entrar em muitos detalhes, também sugiro, dar uma boa lida no Manual do CodeIgniter em português.


Figura 1 – modelo lógico do exemplo
 
1o Passo: criar o banco no PostgreSQL

Crie um banco com o nome sirh com a codificação UTF-8 e rode o modelo físico abaixo, observe que as chaves primárias foram definidas como serial, criando automaticamente o auto-incremento para esses dois campos:


CREATE TABLE bacia_hidrografica (
id_bacia serial PRIMARY KEY,
nome_bacia varchar(40)
);

CREATE TABLE rio (
id_rio serial PRIMARY KEY,
nome_rio varchar(40),
comprimento_km int,
id_bacia int,
FOREIGN KEY(id_bacia) REFERENCES bacia_hidrografica (id_bacia)
ON UPDATE CASCADE );

Após rodar o script acima, o seu banco ficará da seguinte forma (Figura 2):

Figura 2 - Banco com as duas tabelas criadas (PgAdmin)


2o Passo: download do CodeIgniter

Vá até o endereço: http://codeigniter.com/downloads/ e baixe a última versão do CI (nesse post, usei a versão 1.7.2), a instalação é bem simples, descompacte o arquivo zipado na pasta de publicação do seu servidor web, no meu caso “/var/www/”, para quem usa o MS4W (Mapserver for Windows), descompacte na pasta htdocs do servidor.
Agora, vamos mudar o nome da pasta que foi descompactada para sirh (abreviação de “sistema para recursos hídricos”).

3o Passo: configurar a url do sistema e a conexão com o banco PostgreSQL

Abra  o arquivo config.php, dentro de sirh/system/application/config. Mude a linha 14 para http://localhost/sirh/ , salve o arquivo em seguida.

Abra o arquivo database.php (na mesma pasta) e configure a conexão com o banco (em seguida salve o arquivo):

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "postgres";
$db['default']['password'] = "postgres";
$db['default']['database'] = "sirh";
$db['default']['dbdriver'] = "postgre";

4° Passo: configurar as bibliotecas e os helpers que serão carregados de forma automática

Abra o arquivo autoload.php, modifique a linha 42 para:

 $autoload['libraries'] = array(‘database’); 

e a 54 para:

$autoload['helper'] = array(‘url’);

5° Passo: testar a instalação

Abra o seu navegador e digite a url: http://localhost/sirh, você verá a tela da Figura 3, caso a mesma não seja exibida dessa forma, verifique os passos anteriores. No próximo Post continuaremos a desenvolver esta aplicação, até lá!

figura 3 - tela de boas vindas do codeigniter