Como criar um CMS completo com CakePHP – Parte 2 – Criando tabelas e inserindo dados no banco de dados com Schema (Console e Shell) Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 5 anos, 1 mês, 2 dias atrás.

No primeiro artigo desta série, mostrei como Instalar, configurar e deixar o CakePHP seguro para que possamos criar nosso CMS ou qualquer projeto..

Agora quero mostrar um pouco sobre como usar o CakePHP para criar nossas tabelas e inserir os dados iniciais do CakePHP sem ter que nos preocupar com qual banco de dados vamos usar, lembrando que já temos a nossa disposição Mysql, Sqlserver, Postgres e Sqlite e ainda podemos instalar novos a partir de https://github.com/cakephp/datasources/tree/2.0 ou criar nosso próprio datasource.

Se você quiser, pode pular esta etapa, apenas vá ao fim do post, aonde está escrito "Schema pronto para o CMS", porém recomendo que leia este artigo, é realmente muito produtivo trabalhar com bancos de dados desta forma no CakePHP.

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

O legal é que independente do banco que escolhermos o CakePHP se encarrega de criar todo o SQL necessário para criar as tabelas, inserir, atualizar, apagar e exibir as nossas informações, porém a parte do inserir, atualizar, apagar e exibir, veremos mais pra frente, agora estou preocupado com o criar tabelas e inserir os dados iniciais do nosso CMS, para isso usaremos o gerenciador de schemas e migrações, um recurso do console do CakePHP.

Para fazer isso funcionar, primeiro precisamos fazer o nosso sistema operacional reconhecer o console do CakePHP, mas isso é fácil:

Ok, após fazer isso funcionar, vamos criar um arquivo schema.php em app/Config/Schema/schema.php, para isso acesse a pasta do app do seu projeto através do console do seu sistema operacional e digite:

Console/cake schema generate

Não esqueça que no Windows a barra é invertida, ou seja, assim:

Console\cake schema generate

Agora você deve ter um arquivo em app/Config/Schema/schema.php com o seguinte código:

<?php class AppSchema extends CakeSchema {

    public function before($event = array()) {

        return true;

    }

    public function after($event = array()) {

    }

}

Antes de prosseguir com o artigo, é importante lembrar que errar é humano e estou a cada dia aprendendo tanto quanto vocês, e nosso amigo Rafael postou nos comentários um erro que estava ocorrendo, portanto fica aqui o complemento do artigo (obs.: já atualizei o arquivo a ser baixado).

Iremos precisar de dois Models para inserir os dados iniciais, vou falar deles posteriormente, mas vamos já deixa-los na pasta para poder funcionar corretamente, baixe os dois arquivos aqui, e descompacte em app/Model.

Vamos também alterar nossa função before para limpar o cache antes de criar cada tabela, isso vai evitar um erro do Cake dizendo que a tabela não existe (mesmo existindo), adicione isto dentro do seu public function before($event = array()):

$db = ConnectionManager::getDataSource('default');
$db->cacheSources = false;
return true;

Note duas coisas:

  1. Só vai ter um return true; (substitua o que já tem)
  2. Em $db = ConnectionManager::getDataSource('default'); o 'default' é a variável usada para configurar o banco de dados do primeiro artigo (lá tem test e default, estamos usando o 'default').

E por ultimo, adicione no início do arquivo Schema, logo após a tag de abertura do PHP, bem no começo mesmo:

App::uses('Seo', 'Model');
App::uses('Pagina', 'Model');

Para importar os Models no Schema

Agora com o Schema corretamente configurado, vamos prosseguir:

Vamos criar a estrutura do banco de dados.

Com seu arquivo schema.php aberto vamos acrescentar novas tabelas ao nosso projeto CakePHP, isso é bem simples, tabelas aqui são declaradas com variáveis, e seus valores array são as colunas. Vamos ver funcionando criando a tabela de usuários.

Acrescente isso na linha 10:

public $useres = array(

    'id' => array('type' => 'integer', 'key' => 'primary'),
    'nome' => array('type' => 'string', 'length' => 250),
    'username' => array('type' => 'string', 'length' => 50),
    'email' => array('type' => 'string', 'length' => 500),
    'password' => array('type' => 'string', 'length' => 60),
    'titulo' => array('type' => 'text'),
    'acessos' => array('type' => 'integer'),
    'created' => array('type' => 'datetime'),
    'modified' => array('type' => 'datetime'),
    'indexes' => array(
        'PRIMARY' => array('column' => 'id', 'unique' => 1)
    ),
    'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'InnoDB')
);

Depois execute isso no console:

Console/cake schema create

Ou no Windows:

Console\cake schema create

Ele vai fazer duas perguntas, a primeira se você quer remover as tabelas do banco e a segunda se quer criar, por padrão ele responde não pra primeira e sim para a segunda, ok, é o que precisamos, então apenas de confirme as duas sem digitar nada.

Abra seu banco de dados para ver.

Bem o que fizemos foi criar um array com as configurações do nome, tipo e tamanho de cada coluna que quisermos criar, por exemplo a coluna nome que é no tipo varchar com no máximo 250 caracteres, ainda podemos passar qualquer parametro sql que quisermos, bastando acrescentar no array o atributo e o valor, como por exemplo 'key'=>'primary' no id, que define como primário e seta AUTO_INCREMENT, o céu é o limite.

Bem, agora que você entendeu como gerar sql com o CakePHP, vamos seguir em frente e criar o resto das tabelas, copie o código abaixo e adicione ao schema.php logo após fechar a variável $useres.

public $paginas = array(
    'id' => array('type' => 'integer', 'key' => 'primary'),
    'menu' => array('type' => 'string', 'length' => 512),
    'corpo' => array('type' => 'text'),
    'title' => array('type' => 'string', 'length' => 512),
    'descricao' => array('type' => 'text'),
    'tags' => array('type' => 'string', 'length' => 512),
    'url' => array('type' => 'string', 'length' => 512),
    'parent_id' => array('type' => 'integer'),
    'lft' => array('type' => 'integer'),
    'rght' => array('type' => 'integer'),
    'created' => array('type' => 'datetime'),
    'modified' => array('type' => 'datetime'),
    'indexes' => array(
        'PRIMARY' => array('column' => 'id', 'unique' => 1)
    ),
    'tableParameters' => array(
        'charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'InnoDB'
    )
);

public $seos = array(
    'id' => array('type' => 'integer', 'key' => 'primary'),
    'robots' => array('type' => 'text'),
    'sitemap' => array('type' => 'text'),
    'google_confirm' => array('type' => 'text'),
    'indexes' => array(
        'PRIMARY' => array('column' => 'id', 'unique' => 1)
    ),
    'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'InnoDB')
);

public $sliders = array(
    'id' => array('type' => 'integer', 'key' => 'primary'),
    'imagem' => array('type' => 'string', 'length' => 250),
    'titulo' => array('type' => 'string', 'length' => 250),
    'descricao' => array('type' => 'text'),
    'parent_id' => array('type' => 'integer'),
    'lft' => array('type' => 'integer'),
    'rght' => array('type' => 'integer'),
    'pagina_id' => array('type' => 'integer'),
    'indexes' => array(
        'PRIMARY' => array('column' => 'id', 'unique' => 1)
    ),
    'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'MyISAM')
);

Execute o Console\cake schema create novamente, mas dessa vez respondendo y (yes/sim) para as duas perguntas (apagar tabelas e inserir tabelas).

Com isso temos nosso banco de dados criado, mas eu queria que o conteúdo do robots.txt já estivesse preenchido "automaticamente" desde a instalação do CMS, e isso também é possível, graças a função after criada no nosso schema.php quando geramos ele lá atras (lembra?), insira este código dentro da sua função function after($event = array()):

if (isset($event['create'])) {
    switch ($event['create']) {
        case 'seos':
            App::uses('ClassRegistry', 'Utility'); $post = ClassRegistry::init('Seo'); $post->create(); $post->save(
                array('Seo' =>
                    array('robots' => 'User-agent: * Disallow: /admin')
                )
            );
            break;
    }
}

Esse código irá verificar se o evento atual é create e se é a vez de criar a tabela seos, se for ele instancia a classe ClassRegistry que é responsável por atualizar e criar dados no banco de dados (o create, o save, o saveAll...) e cria uma nova entrada no banco de dados com a configuração inicial do robots.txt.

Note que agora nosso robots irá permitir indexação de todo o site, menos do diretório /admin, que será nossa administração.

Só pra completar, também vou aproveitar pra inserir a home do site, logo após o break; insira:

case 'paginas':
App::uses('ClassRegistry', 'Utility'); $post = ClassRegistry::init('Pagina'); $post->create(); $post->save(
    array('Pagina' =>
        array(
            'titulo' => 'Home',
            'title' => 'Home',
            'slug' => 'home',
            'menu'=>'1',
            'habilitar'=>'1',
            'lft'=>'1',
            'rght'=>'2',
            'parent_id'=>'0'
        )
    )
); break;

E pronto, agora já temos nossa home. Para finalizar esta etapa apenas de um Console\cake schema create, apague todos os dados e crie tudo novamente.

 (Bônus) Crie os arquivos SQLs

Tem casos em que é mais fácil apenas exportar um arquivo .sql e disponibilizar para ser importado no banco de dados. Para isso, configure:

  1. Seu schema.php
  2. A conexão com o banco de dados

E por fim execute o comando no console:

Console/cake schema dump --write mysql-install.sql

Aonde está mysql-install.sql você pode por o nome que quiser.

Schema pronto para o CMS

Para quem quis pular esta etapa, seguem o arquivo para download, é só por o arquivo schema.php na pasta app/Config/Schema, o resto vai ficar para o próximo tutorial.

Baixe o arquivo do banco de dados do CMS em CakePHP..

No próximo tutorial vamos criar o instalador do banco de dados do CMS, enquanto isso você pode ir dando uma lida no tutorial que fiz sobre integração do CakePHP com o Twitter Bootstrap, vou usar ele para diagramar o painel de administração do site e também criar o tema inicial do CMS, vamos ganhar um tempo com isso.

Então este foi 2º artigo de 9 que ensina como construir um CMS completo com CakePHP.


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!