Maintenance d'un site

Par giizmo, il y a 12 ans


bonjour a tous et bonne année

je souhaiterais savoir si quelqu'un a une idée pour mettre un site en maintenance ?

5 réponses

Lartak, il y a 12 ans

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 ?

giizmo, il y a 12 ans

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

joss113, il y a 12 ans

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.

Maenhyr, il y a 12 ans


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.

Lartak, il y a 12 ans

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.