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:
- Só vai ter um return true; (substitua o que já tem)
- 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:
- Seu schema.php
- 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.