Concevoir un CMS avec CakePHP le principe de base

Afin de mieux gérer les demandes clients j’ai décidé de créer un CMS avec CakePHP. Un CMS est un gestionnaire de contenu, il faut donc pouvoir gérer le site par bloc et leur donner des positionnements différents. Pour parvenir à ce résultat, j’ai donc imaginé une stratégie simple.

Je vous ferais part de l’avancement des étapes du CMS en partageant les différentes problématiques rencontrées et solutions appliquées.

1) Utiliser un framework CSS

Un framework CSS permet d’effectuer une mise en page facilement grâces à des div où l’on ajoute simplement une classe pour indiquer la largeur du bloc et son positionnement.
Pour ceux qui ne connaissent pas jetez un oeil ici : http://www.blueprintcss.org/ , une fois qu’on l’a utilisé, impossible de s’en passer, cela nous évite tous les problèmes de positionnements etc…

2) Stocker dans la base de données les préférences

Voici un bref descriptif de l’utilité des différents champs :
position : un foreach aura lieu sur la position afin de lister les blocs contenu dans la position
type : il servira à générer un id pour la div et a appeler un élément qui portera le nom du type
span : il fera appel à une classe du framework css, exemple : « span-6 last » voudrait dire que c’est une colonne à droite faisant 6 unités de large et que c’est la dernière (ensuite il y aura un retour à la ligne).
align : alignement du contenu du bloc div
actif : savoir si le bloc est activé ou non

3) Appliquer le système dans Cakephp

Dans le fichier « app_controller.php » je « find » 4 fois les différents blocs pour les différentes sections, c’est à dire le header, menu, center, et footer et on passe ensuite les résultats à la vue. Ce sont donc des parties classiques qui reviennent souvent au travers d’un site web.
Ensuite très important, on met en cache le listing des blocs activés. Dans le cas présent on sauve dans le cache juste la liste des blocs actifs. Le contenu des différents blocs n’est pas mis en cache pour le moment mais il devra être mis en place pour chacun des éléments nécessitant des connexions récurrentes avec la base de données.

Voilà la base est là et le principe du CMS est en place. Après bien sûr, il faudra construire un back-office qui permettre d’enregistrer les différents paramètres spécifiés dans la db.

<?php
class AppController extends Controller {

function beforeFilter(){
$this->load_blocs();
}

/*
* Charge les blocs du site avec le positionnement
* @param       -
* @return      x array
**/
function load_blocs(){

$this->loadModel('Bloc');

$header_blocs = Cache::read('header_blocs');
if(empty($header_blocs)){
$this->Bloc->recursive = 0;
$header_blocs = $this->Bloc->find('all',array('conditions'=>array('Bloc.position'=>'header','Bloc.actif'=>1),'order' => array('Bloc.ordre ASC')));
Cache::write('header_blocs', $header_blocs);
}
$this->set('header_blocs',$header_blocs);

$menu_blocs = Cache::read('menu_blocs');
if(empty($menu_blocs)){
$this->Bloc->recursive = 0;
$menu_blocs = $this->Bloc->find('all',array('conditions'=>array('Bloc.position'=>'menu','Bloc.actif'=>1),'order' => array('Bloc.ordre ASC')));
Cache::write('menu_blocs', $menu_blocs);
}
$this->set('menu_blocs',$menu_blocs);

$center_blocs = Cache::read('center_blocs');
if(empty($center_blocs)){
$this->Bloc->recursive = 0;
$center_blocs = $this->Bloc->find('all',array('conditions'=>array('Bloc.position'=>'center','Bloc.actif'=>1),'order' => array('Bloc.ordre ASC')));
Cache::write('center_blocs', $center_blocs);
}
$this->set('center_blocs',$center_blocs);

$footer_blocs = Cache::read('footer_blocs');
if(empty($footer_blocs)){
$this->Bloc->recursive = 0;
$footer_blocs = $this->Bloc->find('all',array('conditions'=>array('Bloc.position'=>'footer','Bloc.actif'=>1),'order' => array('Bloc.ordre ASC')));
Cache::write('footer_blocs', $footer_blocs);
}
$this->set('footer_blocs',$footer_blocs);

}

}
?>

Ensuite dans la vue on fait l’opération ci-dessous.
On foreach sur les blocs généraux et on crée dynamiquement des « id » pour les div ce qui permet de les styler individuellement. La balise « class » permettra de positionner le div grâce au framework CSS et le contenu sera positionné aussi automatiquement grâce à « align ». Ensuite on appelle un élément qui porte le nom du « type » stocké en base de donnée. Dans notre cas on aura par exemple des éléments avec les noms suivants, langues.ctp, liens_elementaires.ctp, login.ctp.
Vous pouvez ensuite à l’intérieur de ces éléments faires des requestAction, mais n’oubliez pas de mettre ces éléments en cache sinon vous aurez une dégradation des performances.

<div class="container">

<div id="bloc_header" class="span-24">
<?php
foreach($header_blocs as $header_bloc){
echo '<div id="bloc_'.$header_bloc['Bloc']['type'].'" class="'.$header_bloc['Bloc']['span'].'" align="'.$header_bloc['Bloc']['align'].'">';
echo $this->element($header_bloc['Bloc']['type']);
echo '</div>';
}
?>
<div id="bloc_menu" class="span-24">
<?php
foreach($menu_blocs as $menu_bloc){
echo '<div id="bloc_'.$menu_bloc['Bloc']['type'].'" class="'.$menu_bloc['Bloc']['span'].'" align="'.$menu_bloc['Bloc']['align'].'">';
echo $this->element($menu_bloc['Bloc']['type']);
echo '</div>';
}
?>
</div>
</div>

<div id="bloc_center" class="span-24">
<?php
foreach($center_blocs as $center_bloc){
echo '<div id="bloc_'.$center_bloc['Bloc']['type'].'" class="'.$center_bloc['Bloc']['span'].'" align="'.$center_bloc['Bloc']['align'].'">';
echo $this->element($center_bloc['Bloc']['type']);
echo '</div>';
}
?>
</div>

<div id="bloc_footer" class="span-24 bloc_light">
<?php
foreach($footer_blocs as $footer_bloc){
echo '<div id="bloc_'.$footer_bloc['Bloc']['type'].'" class="'.$footer_bloc['Bloc']['span'].'" align="'.$footer_bloc['Bloc']['align'].'">';
echo $this->element($footer_bloc['Bloc']['type']);
echo '</div>';
}
?>
</div>

</div>

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *