Bonjour,

J'aimerais faire un menu deroulant qui litse toutes mes vues index.ctp (pas admin_index, ou member_index, mais index tout court)

Je sais que

$this->request->param'controller']

$this->params'action']
$this->params'controller']

affichera le controller courant, mais j'aimerais tous les avoir quite a les filtrer pour en afficher uniquement ceux qui ont la vue index?
Ca doit être faisable, non?

6 réponses


Bonjour,

Quel est ton besoin réel ?

Hello, merci pour ta reponse.
Le but est de faire un menu deroulant pour l'utilisateur puisse choisir sa page d'accueil.

Par exemple, il peux créer des pages et dans ma base de données, dasns la tabel pages, il y a des champs id, nom, online, etc..
Je peux parcourir cette table pour facilement proposer la page a sélectionner.

Cependant, j'ai aussi des controller Contact, Panier, Support avec des action admin_index, member_index et index.
Et je souhaiterais ajouter les controller/action qui ont l'action index, seulement. Ceci pourqu'il puisse en pélus choisir que , par exemple, contacts/index, ou baskets/index soit la page d'accueil du site, quand le visiteur tape www.monsite.ch.

Voilà mon but

En fait, j'oublie encore un petit detail. J'ai un Back Office et depuis là, le gestionnaire du site peut choisir la page qui officira comme page d'accueil.

Voili voila

Bonsoir.

page d'accueil du site, quand le visiteur tape www.monsite.ch

Tu ne peux pas faire ce que tu demandes, pour la simple et bonne raison que le système affichera le controller et l'action désignée dans ton fichier routes.php pour l'URL racine de ton site.
Ce que tu peux faire par contre, c'est faire une redirection lorsque l'utilisateur se connecte à sa session.

Salut Lartak11,

Heu oui j'ai réussi à le faire. Le seul truc c'est que je n'arrive pas a collecter tous les controllers créé.

Voici comment j'ai fait:
Dans mon route j'ai ceci:

Router::connect('/', array('controller' => 'pages', 'action' => 'index', 'home'));

Dans mon PagesController, j'ai ceci

function index(){

        if(preg_match("/[0-9]$/",$this->Session->read('Site.homepage'))){
            $this->redirect(array('action'=>'show', $this->Session->read('Site.homepage') ));   
        }else{
            $this->redirect(array('controller'=>strtolower($this->Session->read('Site.homepage')),'action'=>'index'));  
        }

    }

La page par defaut est enregistrée dans ma base. Si c'est un int, c'est une page créé en Back Office. Si non c'est un controler.

Ca sa fonctionne.

Dans mon Back Office, je peux lister mes page créées.

$this->loadModel('Page');
        $d'pages'] = $this->Page->find('list',array('conditions'=>array('online'=>1,'id > 1'),'order'=>'name ASC'));

Mais là, je ne sais pas comment lister mes controller qui ont une action 'index' uniquement.
Pour le moement, je le fais manuellement, mais j'aimerais que ca se fasse automatiquement, sans mon intervention, particulierement si plus tard on ajoute un controller

$this->loadModel('Page');
        $d'pages'] = $this->Page->find('list',array('conditions'=>array('online'=>1,'id > 1'),'order'=>'name ASC'));
        $cont = array(
            'Articles' => 'index',
            'Contacts' => 'index',
            'Supports' => 'index'
        );
        foreach($cont as $k => $v){
            $d'pages']$k] = $k;
        }

Ca fonctionne, mais j'aimerais remplacer ca

$cont = array(
            'Articles' => 'index',
            'Contacts' => 'index',
            'Supports' => 'index'
        );

Voili, voila

Bonjour.
Pour récupérer la liste des dossiers qui contiennent des vues index.ctp, tu peux par exemple faire comme ça :

App::uses('Folder', 'Utility');
$dir = new Folder(APP.'View'.DS);/* Défini le chemin du répertoire */
$files = $dir->findRecursive('(index).ctp');/* Trouve de façon récursive les fichiers se nommant index.ctp */

Ce qui donne par exemple en debug
$dir:

object(Folder) {
    path => 'C:\wamp\www\Final\app\View\'
    sort => false
    mode => (int) 493
    [protected] _messages => array()
    [protected] _errors => array()
    [protected] _directories => null
    [protected] _files => null
}

$files:

array(
    (int) 0 => 'C:\wamp\www\Final\app\View\Animes\index.ctp',
    (int) 1 => 'C:\wamp\www\Final\app\View\Articles\index.ctp',
    (int) 2 => 'C:\wamp\www\Final\app\View\Categories\index.ctp',
    (int) 3 => 'C:\wamp\www\Final\app\View\Dashboards\index.ctp',
    (int) 4 => 'C:\wamp\www\Final\app\View\Faqs\index.ctp',
    (int) 5 => 'C:\wamp\www\Final\app\View\Pages\index.ctp',
    (int) 6 => 'C:\wamp\www\Final\app\View\Posts\index.ctp',
    (int) 7 => 'C:\wamp\www\Final\app\View\Users\index.ctp',
    (int) 8 => 'C:\wamp\www\Final\app\View\Villes\index.ctp'
)

Il n'y a là bien sur que pour les dossiers contenant un fichier index.ctp, les autres ne sont pas retournés.
Il ne te reste plus qu'à qu'a inflecter les noms des dossiers du retour et à les envoyer dans la vue de ton formulaire ou autre.

Salut,
Super et intéressant, je vais voir ca de plus près

Merci