Bonjour,

Je souhaiterais implémenter dans mon site web un moyen de récupérer des informations de configuration présente dans la base de donnée (dans le cadre de la création d'un CMS pour certaines catégories de sites). Il faudrait donc pouvoir récupérer en base de donnée, les valeurs de certaines informations (tel que le nom du site, le texte de présentation, les mots clefs ou autre)

Je ne vois pas du tout comment implémenter cela facilement et de manière optimale. Je viens donc vous demander votre aide pour quelques conseils.

Merci d'avance :)
Loïc.

1 réponse


kal-el
Réponse acceptée

Salut, voici comment moi je fais généralement. J'ai une table configurations de la forme suivante :

id int(11)
key varchar(100)
value text

Puis ensuite je créer mon model :

<?php
class Configuration extends AppModel{
    public function load() {
        $settings = $this->find('all', array(
            'fields' => array('key', 'value')
        ));
        foreach ($settings as $variable) {
            Configure::write ( 'Webapp.'.$variable'Configuration']'key'], $variable'Configuration']'value'] );
        }
    }
    public function write($data){
        foreach($data as $key => $value){
            $this->updateAll(
                array('Configuration.value' => is_numeric($value) ? $value : '\'' . $value . '\''),
                array('Configuration.key LIKE ' => $key)
            );
        }
    }
}
?>

Et enfin dans mon AppController :

$this->Configuration->load();

Ensuite c'est très simple, tu appel simplement les données depuis la Configuration :

echo $this->Html->meta('description', Configure::read('Webapp.meta_description'));
echo $this->Html->meta('keywords', Configure::read('Webapp.meta_keywords'));

Pour la sauvegarde des données, les champs que je créer, porte le même nom que la clé de la base de données. Par exemple supposons que j'ai dans la base :

id = 1
key = website_name
value = le nom de mon site web

J'aurai alors lorsque je veux modifier cette valeur, un champ comme ci-dessous (généralement j'ai un <form> que je regroupe par catégorie dans des tab et je valide l'ensemble d'un seul coup) :

<input type="text" name="website_name" id="website_name" />

Il suffira ensuite dans ton controller de faire comme ceci :

<?php
class ConfigurationsController extends AppController{
    public function admin_index(){
        if($this->request->is('post')){
            $this->Configuration->write($this->request->data);
            $this->Session->setFlash(__('La configuration du site à été mise à jour.'), 'admin/notif');
        }
        // Rechargement des données après sauvegarde
        $this->Configuration->load();
    }
}

Cette technique à l'avantage d'être très simple à mettre en place et marche très très bien. Après je suis sur que l'on peut faire mieux, mais pour ma part, sa correspond tout a fais à ce que je veux faire.