bonjour a tous et bonne année
je souhaiterais savoir si quelqu'un a une idée pour mettre un site en maintenance ?
Que veux tu dire exactement ?
Ne donner la possibilité d'afficher qu'une page prédéfinie lorsque tu modifies une valeur dans des settings via base de données par exemple ?
Slt
ce que je veux dire c quand je travaille sur un site que personne n'y est acces le temps que je travail avec une page d attente
avec un bouton on/off dans l administration
Bonjour,
Pour cela j'ai effectué une requete dans une table sur un beforefilter dans mon "appController".
Il me suffit ensuite de vérifier sur mes pages (en utilisant le Configure::Read & Write).
Voici un exemple de ce que j'utilise:
$this->loadModel('Other');
$tableOther = $this->Other->find('first',array('fields' => array('maintenance', 'etatAnnonce')));
$tableOther = $tableOther"Other"];
/* Detection du mode maintenance */
if ($tableOther"maintenance"] == true) {
Configure::write("Maintenance", array('actuel' => '1', 'Generale' => '1'));
}elseif($tableOther"maintenance"] == false){
Configure::write("Maintenance", array('actuel' => '0', 'Generale' => '0'));
}
De cette manière, dans mes Controller (User par exemple) :
En vérifiant que le mode de maintenance n'est pas activé, seul les admins peuvent se connecter:
if($this->request->is('post')){
if($this->Auth->login()){
if (Configure::read("Maintenance.Generale") == 1) {
if ($this->Auth->user("role") == 'admin') {
$this->User->id = $this->Auth->user("id");
$this->User->saveField('lastlogin',date('Y-m-d H:i:s'));
$this->Session->setFlash("Vous êtes maintenant connecté","notif");
$this->redirect('/admin');
}else{
$this->Auth->logout();
$this->Session->setFlash("Vous n'êtes pas administrateur !","notifErr");
$this->redirect('/');
...
Puis dans mes pages, si on est pas admin je renvois sur une page de style pour la maintenance:
if(Configure::read("Maintenance.Generale") == 1 && AuthComponent::user('role') != 'admin'){throw new ForbiddenException('maintenance');}
Pour la partie admin, il suffit de faire une fonction qui récupère un paramètre pour l'activation de la maintenance:
function admin_maintenance($num){
if($this->Auth->user('role') == 'admin'){
$this->loadModel('Other');
$this->Other->updateAll(array('Other.maintenance' => $num), array('Other.id' => 1));
$this->Session->setFlash("Maintenance modifiée !","notif");
$this->redirect($this->referer());
}else{
$this->Session->setFlash("Vous n'êtes pas administrateur!","notifErr");
$this->redirect($this->referer());
}
}
Voila, j'ai utilisé cette méthode, il doit y avoir aussi d'autre manières de faire.
Slt
ce que je veux dire c quand je travaille sur un site que personne n'y est acces le temps que je travail avec une page d attente
avec un bouton on/off dans l administration
Quand tu dis que tu travailles ça veut dire quoi ? tu utilises l'administration de ton site ? tu crées un article ? ou bien tu fais des ajouts de code ?
Si c'est le dernier cas, normalement tu devrais avoir environnement de dev -> environnement de test -> environnement de production.
Cela te permettra de n'avoir qu'une mise à jour de ton serveur à réaliser lorsque tu veux mettre en ligne les nouvelles fonctionnalités. Dans ces cas là, les utilisateurs n'auront pas accès au site lors du chargement des fichiers.
Tu peux faire comme ceci :
/* dans l'AppController */
public function beforeFilter(){
parent::beforeFilter();
$this->loadModel('Setting');
/* Dans le sens ou chaque enregistrement de la table traite chacun d'un événement particulier */
$state = $this->Setting->findbyName('maintain', array('online'));
if($state'online'] == 0 && !$this->request->params'admin']){
$this->Auth->authenticate(array('Form' => array('scope' => array('User.role' => 'admin'))));
if($this->Session->check() && $this->Session->read('Auth.User.role') == 'admin'){
return true;
} else {
$this->Session->setFlash("Le site étant actuellement en maintenance, il n'est actuellement accessible que par les administrateurs de celui-ci");
return false;
}
}
}
Plutôt simple à comprendre et relativement facile à mettre en place sans avoir à faire 30 lignes de codes.
Je ne décris pas pour la mise en place en maintenance et inversement, il y a juste à modifier un champ dans la table.
Il y a des tas de façons de faire un système comme ça, franchement, si vous connaissez les principales fonctionnalités de CakePHP, vous devriez être capable de faire quelque chose de ce genre.