Como criar um CMS completo com CakePHP – Parte 9 – Finalizando o CMS Artigo

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


Este artigo foi publicado a 4 anos, 1 mês, 1 semana atrás.

Parece que foi esses dias que tive a ideia de começar a fazer esta série de artigos, e em 10 de julho publiquei o primeiro artigo, mas agora que estamos terminando deu vontade de continuar escrevendo esta série, mas temos que seguir em frente, não é.

Muita coisa mudou neste meio tempo e uma delas é a versão do CakePHP, então se você acompanhou estes artigos junto comigo desde a primeira postagem no dia 11 de Junho de 2013 volte lá e atualize seu CMS, é só substituir a pasta "lib" da raiz do projeto (fora da pasta app) pela atualizada no site do CakePHP (http://www.cakephp.org).

Correções

Com seu CakePHP atualizado, vamos corrigir alguns bugs que surgiram no decorrer do projeto, as alterações já foram feitas nos devidos artigos.

Gostou deste artigo?

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

O primeiro é no instalador que está dando erro de conexão ao banco de dados, isto porque no nosso AppController.php fazemos um find no Model Usuario na linha 80, veja:

else{
    $this->loadModel('Usuario');
    $user=$this->Usuario->find('first',array(
        'conditions'=>array('id'=>1),
        'fields'=>array('titulo')
    ));
    $configs['titulo']=$user['Usuario']['titulo'];
}

Acontece que o AppController é executado antes do InstalaAppController do plugin então precisamos fazer uma verificação ai pra evitar que o find aconteça antes da instalação do plugin, entre diversas formas eficientes de se fazer vou apenas checar como fiz no model, então vou aproveitar e substituir todo o nosso beforeRender, evitando que o nosso tema seja chamado (exibindo o layout da administração) e também setando o Título para 'Instalando CMS', nosso beforeRender vai ficar assim:

public function beforeRender(){

    if(isset($this->request->params['prefix'])){

    if($this->request->params['prefix']=='admin') $this->layout='default';

    if($this->request->params['prefix']=='ajax') $this->layout='ajax';

    $this->set('user',$this->Auth->User());
    $this->set('active','home');

    }else{
        $configs['titulo'] = 'Instalando CMS';
        $this->set('user',false);
        App::uses('SchemaInstallShell', 'Instala.Console/Command');
        $this->My = new SchemaInstallShell();
        $this->My->startup();
        $db = ConnectionManager::getDataSource('default');
        $db = $db->listSources();
        $tables = array_diff($this->My->checkInstalacao(),$db);
        if(empty($tables)){
            if($this->Auth->User()){
                $configs['titulo']=$this->Auth->User('titulo');
                $this->theme=Configure::read('theme');
            }else{
                $this->loadModel('Usuario');
                $user=$this->Usuario->find('first',array(
                    'conditions'=>array('id'=>1),
                    'fields'=>array('titulo')
                ));
                if(!empty($user)){
                    $configs['titulo']=$user['Usuario']['titulo'];
                    $this->theme=Configure::read('theme');
                }
            }
        }
        $this->set('configs',$configs);
    }

    if($this->request->is('ajax')){
        $this->layout='ajax';
    }
}

Com isso nosso instalador não apresenta mais este erro.

Mas se você acha que ficou confuso pode apenas abrir o InstalaAppController (App/Plugin/Instala/Controller/InstalaAppController.php) e adicionar um beforeRender para substituir o anterior com um set('user',false), assim:

public function beforeRender(){
    $this->set('user',false);
}

As duas formas funcionam quem se arrisca a dizer qual a melhor?

Agora vamos as páginas que não abrem e dão erro na variável $conteudo, faltou informar que o :slug é um parâmetro a se passar a action e isso pode ser alterado no app/Config/routes.php, na penúltima linha que está assim:

Router::connect('/:slug', array('controller' => 'paginas ', 'action' => 'display'));

Deverá ficar assim:

Router::connect('/:slug', array('controller' => 'paginas ', 'action' => 'display'),array('pass'=>array('slug')));

Acrescentamos o terceiro argumento do Router::connect que traz algumas configurações bem legais, vamos usar uma delas que é o pass que faz exatamente o que precisamos, diz para o :slug ser enviado para a action, minha dica aqui é ir até o controller Paginas na action display e dar um debug($this->request->params) e testar das duas formas pra você entender como isso funciona (sem o 'pass' e com ele), um dia você pode precisar.

O terceiro e último bug é no controller Paginas, Action display. Precisamos também do campo titulo, então vamos adicionar ao nosso find, encontre o parâmetro 'fields' e acrescente o campo titulo:

'fields'=>array('titulo','title','descricao','tags','slug','corpo')

Criando o tema final do nosso site

Vamos usar um tema com recursos ajax feito por mim e ensinado aqui no blog, o que acontece é que o CakePHP consegue identificar requisições ajax (já disse isso antes) e com isso podemos trabalhar nosso backend para exibir a informação de acordo. No nosso caso fizemos o CakePHP setar o Layout ajax que não tem layout, apenas o retorno da action, se você quiser saber como fiz este tema que vou usar:

Se não quer aprender a fazer apenas baixe o tema aqui.

Descompacte dentro da pasta webroot do tema Default (ela ainda não existe, então crie em app/View/Themed/Default/webroot), abra o arquivo index.html e substitua todo o conteúdo do default.ctp (app/View/Themed/Default/Layouts).

Agora basta acrescentarmos nossos Elements.

No começo, apague a linha do title e as duas linhas de css, adicione o element head e os dois arquivos de css via helper:

echo $this->Html->css(array('bootstrap.min','tema'),null,array('inline'=>false));
echo $this->element('tema/head'); 

No header, dentro do body (não confundir com head), encontre a linha do h1 e substitua pelo helper do logotipo:

echo $this->element('tema/logotipo');

Logo abaixo temos dois menus (ul class="nav"), troque pelo element menu:

echo $this->element('tema/menu');

No id="breadcrumbs" troque todo o conteúdo para o element de breadcrumb:

echo $this->element('tema/breadcrumb');

E as imagens de redes sociais precisam ser chamadas com helper:

echo $this->Html->image('icon-facebook.png');

Troque também o conteúdo da div com class .campo-edita pelo element de contéudo:

echo $this->element('tema/conteudo');

E para fechar, no footer temos mais um menu, coloque o element correspondente, e troque os javascripts por uma chamada via helper:

echo $this->Html->script(array(
    '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js',
    'bootstrap.min',
    'jquery.stellar.min',
    'jquery.history',
    'tema',
));

Se você fez tudo certo até aqui quando abrir seu site vai ver a página com o novo tema funcionando, com navegação ajax e um painel para gerenciar o conteúdo destas páginas.

Viu como é fácil adaptar temas, mesmo com navegação ajax, para o nosso tema, fica um desafio, como vocês acham que seria com um tema One Page?

Quando comecei esta série a 5 meses atrás eu já tinha algo pronto e apenas implementei o que eu já tinha, mas neste tempo o projeto evoluiu e ele não podia para por aqui, incrementei uma página de contato e também um sistema de galerias de imagens com categorias, além de configurações mais avançadas e um sistema rústico de ACL, na época eu já tinha noção de MVC, mas era só isso, uma noção, hoje já me aprofundei muito mais no assunto, a ponto de me sentir confortável a escrever sobre o assunto aqui no blog e dar exemplos.

Ultimamente ando meio sem tempo, por isso não estou mantendo a regularidade de postagens no blog, mas em breve quero mostrar como trabalhar com upload de arquivos no CakePHP sem usar plugins, também vou falar sobre o WideImage e como usá-lo no CakePHP e também me aprofundar mais nas PSRs, MVC e como fazer um framework PHP com isso.

Quer ler uma nova série de artigos sobre algum assunto? Posta ai nos comentários.

E aqui a lista com os outros artigos desta série.

Então este foi 9º 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!