Bonjour,
Me revoilà encore.
Je recherche actuellement un prochain pour que quand la personne n'est pas connecté il n'est accès qu'a la page "Maintenance".
J'ai pensé a utilisé le composant Auth->allow(); mais allow nous redirige directement vers Controller->Users avec l'action ->Login alors que je voudrais le controller ->Maintenance et l'action ->index.
Auriez vous une solution à ca ?
Merci beaucoup à vous.
Du genre ?
$this->Auth->allow(array("controller" => "Maintenance", "action" => "index"));
Juste mais comment interdir les autres pages alors ? Je veux qu'ils est accès aux pages juste si il sont connectés sinon : La page Maintenance donc de login.
J'aurais mit ca moi:
$this->Auth->allow("maintenance");
Et as tu une idée pour rediriger quand il y a un "missing controller" je vois plein de gens parlé de AppError mais il n'existe pas ce fichier je met leur code ca ne me fais rien.
Oui mais je veux juste maintenance donc j'ai bon?
Mais après par exemple si il va sur une page qui a pas de controller, je veux qu'il soit rediriger a '/'.
Bonsoir.
J'ai une question à te poser, ton site n'est pas tout le temps en maintenance je suppose, n'est-ce pas ?
Dans ce cas là, il te faut faire une vérification pour quand c'est le cas ou non et dans ces conditions, il te suffit d'y configurer le composant Auth, de manière à ce que tu puisses avoir deux moyens différent d'autorisation pour le composant Auth.
Non mon site seras pas tout le temps en maintenance.
Mais j'enleverais le code après enfin le routing vers maintenance.
je ferais plutot un controller maintennance, et qui fait en sorte que s'ik est activé alors toutes les pages sont redirigées vers la page maintenance et s'il ne l'est pas alors aucune redirection et dans ton admin ta juste un bouton a mettre c'est plus pratique !
Oui mais comment fair ca ?
Mon idée, je propose pour pas qu'on me dise que je fous rien :
Appcontroller
$maintenance = 1;
if($maintenance == 1){
redirect ?
) else {
Nothing ;
}
Ou tu fais un petit coup de config
// dans ton boostrap.php par exemple
$AppStatus = 1; // 1 pour production 2 pour maintenance
Configure::write('AppStatus',$AppStatus); // Site en mode production J'ai choisis la clé AppStatus comme ça
/*
* Il te reste plus dans ton AppController comme tu le souhaitez de faire Configure::read('AppStatus'),
* mais moi je le ferais dans le routing
* Donc moi dans le routes.php je ferais:
*/
if(Configure::read('AppStatus') == 1){
Router::connect(...); // Là tu gères toutes tes routes/prefix/... pour le site en productions comme tu le fais normalement
) else{
Router::connect(...); // Là tu gères toutes tes routes/prefix/... pour le site lorsqu'il est en maintenance
}
Ta envie de revenir voir mon belle ordinateur ?
Error: syntax error, unexpected '$AppStatus' (T_VARIABLE), expecting function (T_FUNCTION)
File: H:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\projects\Habbtips\app\Controller\AppController.php
Line: 46
Je sens que j'ai fais encore une connerie, je re regarde.
J'ai édité mon code.
Warkas fait le dans les routes ça sera plus clair pour toi, si dans ton fichier bootstrap.php tu met la variable à 1 ou 2 ça changera toutes tes routes comme ça tu manipulera plus facilement les pages accessibles.
Et avec cette écriture dans la config Configure::write() / Configure::read() tu y auras accès partout car c'est une méthode statique.
Donc partout tu aura accès à la valeur que tu rentreras 1 ou 2,3 etc... après à toi de faire tes conditions: if( Configure::read('AppStatus') == 1 ){} ....
/*
* boostrap.php
*/
$AppStatus = 1; // 1 pour production 2 pour maintenance 3 pour ...
Configure::write('AppStatus',$AppStatus); // Site en mode production J'ai choisis la clé AppStatus comme ça
/*
* routes.php
*/
if(Configure::read('AppStatus') == 1){
Router::connect(...); // Là tu gères toutes tes routes/prefix/... pour le site en productions comme tu le fais normalement
) else{
Router::connect(...); // Là tu gères toutes tes routes/prefix/... pour le site lorsqu'il est en maintenance
}
/*
* Imaginons que l'on veuille que quand on est en maintenance n'avoir qu'une seule page qui s'affiche
*/
//Routes.php
if(Configure::read('AppStatus') == 1){
Router::connect(...); // Là tu gères toutes tes routes/prefix/... pour le site en productions comme tu le fais normalement
) else{
Router::connect('/', ['controller' => 'Pages', 'action' => 'maintenance']); // Là on redirige la www.monsite.fr à l'action maintenance du controller pages
}
Class AppController extends Controller
{
public function beforeFilter() {
if(Configure::read('AppStatus') == 1){
$this->Auth->allow(); //Ce que tu veut autoriser ou tout autoriser de façon globale, bon ça tu gères
) else{
$this->Auth->deny(); // La on refuse tout et on gèrera en cas de maintenance ce que l'on veut au cas par cas
}
}
}
Class PagesController extends Controller
{
public function beforeFilter()
{
parent::beforeFilter();
$this->Auth->allow('maintenance');
}
public function maintenance()
{
$this->render();
}
}
// View/Pages/maintenance.ctp
<p> Mon site est en maintenance </p>
D'accord merci beaucoup ca fonctionne bien là. C'est possible de fair aussi une table config et de recupérer ca dans le bootstrap?
Code precedent édité avec un exemple
Oui, mais qui dis appel SQL dis temps à charger. Si tu as des données qui ne changerons qu'une fois tout les 36 du mois hésite pas à faire des fichiers de configurations. Ca te permets d'être clair et de réduire les requêtes SQL. Après dans ton application rien ne t'empêche de l'écrire avec une fonction dans l'administration, comme par exemple, je sais pas, euh, l'url d'un Teamspeak pour un TSViewer par exemple.
Et si je veux gérer que les administrateur est accès quand même au site pendant une maintenance ?
Et ton code quand je met 0 je suis directement mit dans /users/login.
Ben tu as du créer un prefix dans tes routes pour ça:
Configure::write('Routing.prefixes', array('admin'));
if(Configure::read('AppStatus') == 1){
Router::connect('/', ['controller' => 'Pages', 'action' => 'home']);
Router::connect('/admin', array('controller' => 'pages', 'action' => 'index', 'admin' => true));
Router::connect('/admin/Blog', array('controller' => 'Blog', 'action' => 'index', 'admin' => true));
...
) else{
Router::connect('/', ['controller' => 'Pages', 'action' => 'maintenance']);
Router::connect('/admin', array('controller' => 'pages', 'action' => 'index', 'admin' => true));
Router::connect('/admin/Blog', array('controller' => 'Blog', 'action' => 'index', 'admin' => true));
...
}
Mais pour le coup avec notre deny() il faut autoriser les gens à se connecter dans l'adiministration donc faut prévoir le coup et avoir une méthode login en administration .
Ce que je t'ai donné est très sommaire depuis le début, et ne conviens pas à tout les projet c'est juste une base de réflexion.
Et ton code quand je met 0 je suis directement mit dans /users/login.
tu tombes dans le else
$this->Auth->deny()
rajoute en dessous
$this->Auth->allow('maintenance'); pour autoriser la méthode maintenance qui se trouve dans PagesController dans mon exemples
Mais je veux pas forcèment juste leur donné l'accès a l'administration mais au site en entier a l'équipe.
En gros :
Si maintenance & pas connecté { hop page de maintenance } else if { maintenance & pas connecté } juste maintenance
Dans ce cas là il faut que tu rajoutes une conditions sur le group de l'utilisateur:
Par exemple on veut que tout les utilisateurs qui ont le group_id à 1 est accès à tout
Class AppController extends Controller
{
public function beforeFilter() {
if(Configure::read('AppStatus') == 1){
$this->Auth->allow('index','view');
$this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
if($this->session->read('Auth.User.group_id') == 1){
$this->Auth->allow();
}
}elseif($this->session->read('Auth.User.group_id') == 1){
$this->Auth->allow();
}else{
$this->Auth->deny();
}
}
}
Fatal error: Call to a member function read() on a non-object in H:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\projects\Habbtips\app\Controller\AppController.php on line 52
J'ai cette erreur.
le mieux reste la fonction isAuthorized() pour deny les droit d'acces en administration example:
class AppController extends Controller {
function beforeFilter(){
$this->Auth->allow('index', 'view');
}
function isAuthorized() {
if ($this->Auth->user('role') != 'admin') {
$this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
}
}
}
$this->Session->read(...) et pas $this->session->read(...) dsl c'est le S minuscule qui va pas
Nan mais dans tes controllers tu dois extends le beforeFilter dans tout tes controller comme ça le beforeFilter de ton AppController fonctionnera sur tout les controller que tu as créé.
public function beforeFilter() {
parent::beforeFilter()
}
public function maintenance(){
$this->layout = false;
$this->loadModel('User');
if($this->request->is('post')){
if(!empty($this->request->data)){
if($this->Auth->login()){
return $this->redirect($this->Auth->redirectUrl());
} else {
die("pas logged");
}
}
}
}
Euh normale que mon this layout fonctionne pas ?
Pose toi 5 minutes et relis bien la doc de Auth sur le book:
http://book.cakephp.org/2.0/fr/tutorials-and-examples/blog-auth-example/auth.html
Mais pourquoi tu fais une fonction de loggin sur ta méthode maintenance? Tu as une méthode loggin dans ton model User pour gérer ça.
DRY: Don't Repeat Yourself ...
Explique moi ce que tu voulais faire
Alors je veux pour que sur la page de maintenance que l'equipe est accès au site pour voir les modifications.
Et je dois bien avoir un form pour me connecter..
Class AppController extends Controller
{
public function beforeFilter() {
if(Configure::read('AppStatus') == 1){
if($this->session->read('Auth.User.group_id') == 1){
$this->Auth->allow();
}else{
$this->Auth->allow('index','view');
$this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
}
}elseif($this->session->read('Auth.User.group_id') == 1){
$this->Auth->allow();
}else{
$this->Auth->deny();
}
}
}
Avec ca ils devraient avoir accès à tout les admins non?
Tu as raison j'avais fais un copié collé de mon ancien truc faux, je suis un peu pressé j'ai pas fais attention, normalement la c'est plus logique
Class AppController extends Controller
{
public function beforeFilter() {
if(Configure::read('AppStatus') == 1){ // Si le site n'est pas en maintenance
if($this->Session->read('Auth.User.group_id') == 1){ // Si le group de l'utilisateur connecté est 1 donc admin
$this->Auth->allow();
}else{ // Si l'utilisateur n'est pas connecté et si son group_id est different de 1
$this->Auth->allow('index','view');
$this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
}
}else{ // Sinon si le site est en maintenance
if($this->Session->read('Auth.User.group_id') == 1){ // Si le group_id de l'utilisateur connecté est 1 donc admin
$this->Auth->allow();
}else{ //On refuse toute les pages aux non connecté et ceux dont le group_id est différent de 1 au cas ou
$this->Auth->deny();
}
}
}
}
Et ta une idée pour que si le site en maintenance la page principal est maintenance ? routing ? car ca me redirige a users/login ?
Jc pires 2eme compte: Oui dans le dernier else la ou il y a $this->Auth->deny() rajoute $this->Auth->allow('maintenance'); pour autoriser la vue maintenance
<CODE>
Missing Controller
Error: Controller could not be found.
Error: Create the class Controller below in file: app\Controller\Controller.php
<?php
class Controller extends AppController {
}
Notice: If you want to customize this error message, create app\View\Errors\missing_controller.ctp
Stack Trace
APP\webroot\index.php line 118 → Dispatcher->dispatch(CakeRequest, CakeResponse)
</CODE>
Mais je veux que tout les missings controller redirige a "/".
Mais je veux que tout les missings controller redirige a "/".
Il n'y a pas de redirect sur les Missing Controller, tout ce que tu peux faire c'est créer un fichier pour en personnaliser l'affichage de l'erreur.
Si tu te retrouve avec cette page, c'est une erreur interne, et non due à l'utilisateur.
Je veux rediriger en fait quand il y a Missing Controller
Mais ca n'as pas l'air possible.
Mais ca n'as pas l'air possible.
Ce n'est pas impossible, puisque dans la doc de CakePHP, ils disent qu'il est possible de modifier le comportement des exceptions : Créer un controller personnalisé pour gérer les exceptions.
Sauf que comme il y est dit, ce genre d'erreur est censé afficher un visuel et non par exemple, faire une redirection.
Créer un fichier dans app AppError.Php
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->redirect('/');
}
}
Je trouve ou ce AppError ?
Il n'y a pas de AppError et il ne te servirait à rien d'en faire un, regardes plutôt mon message précédent.
je vais regarder la DOC lartak merci.
Euuh je reviens, vraiment besoins d'un babysitter de codage moi car j'ai tellement de question et de problème :
$this->loadModel('Post');
debug($this->Post->find('all'));
Une raison a ce que sa me sorte rien du tout alors que ma table est remplises ?
Une raison a ce que sa me sorte rien du tout alors que ma table est remplises ?
Je te recommande de plutôt stocker les résultats de ta requête dans une variable et de débugger la variable au lieu de débugger directement la requête.
Ca fais le même résultat
$message = $this->Post->find('all');
debug($message);
Ca m'affiche même pas un tableau , logiquement ca devrait me me mettre array() mais là rien.
Configure::debug est bien supérieur à 0 dans tes paramètre d'application?
Et si tu fais un var_dump($message) ?
Ca m'affiche même pas un tableau , logiquement ca devrait me me mettre array() mais là rien.
Si ton debug n'est pas 0 (voir message ci-dessus), ton debug doit bien être affiché, sauf que tu ne doit pas le voir car il doit être caché par un/des élément(s) de ton design, donc pour le voir sans problème, mets un die(); juste après le debug() :
debug($message);
die();
Car même si la variable était vide, elle renverrait null.
Ou alors, tu envoies la variables $message à la vue via set et tu fais le debug de la variable sur la vue.
Oui bien vu Lartak pour le die(); c'est tellement automatique pour moi que je n'y avais pas pensé.
Non il me renvoie
\app\Controller\MaintenanceController.php (line 10)
Mais je voudrais préciser que si je met :
$message = $this->Post->find('all', array("limit" => 3));
Ca fonctionne d'un coup et ca m'en affiche bien 3.
Et le var dump fonctionne bien.