Ajout d'un élément UNIQUEMENT dans une page spécifique? (condition)

Par caema, il y a 12 ans


Salut à toutes et tous,

Je suis en train de bosser sur Cake, je profite des tutos pour en apprendre plus sur le framework, mais une question me taraude:

Comment s'y prendre pour ajouter (par exemple) une sidebar uniquement dans une page spécifique?
Un peu comme faire:

if($rubrique == 1){
    include("map.php");
}

Dois je créer ma sidebar en tant qu'élément, en tant que bloc? Ou une autre technique peut être?
J'ai du louper quelque chose dans la compréhension de la logique du framework j'ai l'impression, parce que là je ne sais pas comment m'y prendre, alors que c'est une tâche courante à réaliser.

Si une âme charitable pouvait m'expliquer un peu le fonctionnement et la logique du framework pour ce genre de situation, ça serait bien aimable!

D'avance merci!

13 réponses

coloo, il y a 12 ans

Bonjour,

Tu crées ton élément dans : app/views/elements/le_nom_de_votre_element.ctp

ensuite dans la vu spécifique tu l'appelle :

<? php echo $this->element ('le_nom_de_votre_element.ctp'); ?>

(ceci fonctionne si tu appelles pas la bdd)

Pour des spécificités, je te conseille d'aller voir ce lien :

cookbook

caema, il y a 12 ans

Je ne pense pas que ceci fonctionne dans mon cas, puisque j’interroge la base de données.
En fait, dans la base de données, j'ai une table 'posts' qui reprend mes pages, et mes news (on distingue page et news via un champ type).

Je voudrais donc insérer une sidebar, uniquement sur la page d'accueil par exemple, donc par exemple:

if($post.id == 1){
    include("sidebar.php");
}

(comment on fait en PHP classique).

J'avais pensé que peut être, les vues étendues et/ou les blocks (ajouts cakephp 2.1 si je ne m'abuse) pourraient m'aider, mais je ne suis pas certaine d'avoir bien compris le principe de ces 2 nouveaux concepts

coloo, il y a 12 ans

Ta page index est dans le dossier post ?

caema, il y a 12 ans

En effet, j'ai mon index.ctp dans le dossier view/posts

coloo, il y a 12 ans

bah étant donnée que tu es dans post, tu n'as pas besoin d'un élement ou autre.

tu sais lister tes post ?

1) find all des post dans controller post function index. Tu envois ta variable

2) dans ta vue :

<div id="sidebar1">
<h2>News</h2>
<?php
foreach($post as $p ):
if ($p'champ']=='news' ) {
echo $p'title'];
}
endforeach;
?>
<h2>Page</h2>
<?php
foreach($post as $p ):
if ($p'champ']=='pages' ) {
echo $p'title'];
}
endforeach;
?>

</div>
caema, il y a 12 ans

Je capte pas là: peux-tu m'expliquer, dans le code que tu donnes, où tu insère la sidebar?

coloo, il y a 12 ans

O_o

Bon reprenons un peu / le code que je t'ai passé c'est la composition de ta sidebar.

Je reprends l'énoncé : "j'ai besoin d'une sidebar pour une page spécifique"

Donc il n'y a pas besoin d'un élément pour cette page comme elle sera que sur ta page d'accueil.

Maintenant tu vas dans ton controlerPost faire un find->all dans la fonction de ta page d'accueil.

cette page : qui est par là selon tes dires : view/post/index.ctp

tu rajoute ta sidebar dans cette page (le code plus haut comme exemple). Voilà.

caema, il y a 12 ans

Ok, la pièce vient de tomber je crois! Désolée lol, j'avais pas tout suivi je crois :-p
Je vais tester cela ce soir, si d'ici là c'est bon je mets en résolu!

D'avance merci, et bonne fin de journée à vous.

coloo, il y a 12 ans

bonne journée à toi ;)

kal-el, il y a 12 ans

C'est tres simple en faite. Dans ton layout, ajout simplement un block dans lequel tu injectera ta sidebar par la suite :

<?php echo $this->fetch('sidebar'); ?>

Ensuite dans la vue dans laquelle tu veux afficher ton élément, tout ce que tu as a faire c'est d"insérer ton code comme ceci :

<?php $this->start('sidebar'); ?>
    // Le code a afficher dans la sidebar
<?php $this->end(); ?>

Cette technique te permettra d"afficher une sidebar dans n'importe laquelle de tes vues si jamais dans le futur tu en aurai besoin

En espérant que sa t'ai aider

caema, il y a 12 ans

Le soucis, c'est que mon élément sidebar ne doit pas s'afficher sur une vue spécifique, mais sur une page spécifique.
J'ai une vue "show" qui affiche le contenu de mes pages, mais ma sidebar je n'en ai besoin que sur UNE page, la page d'accueil en l'occurence.

J'avais donc pensé à faire quelque chose comme ceci:

<?php
    if($this->$params = array('id'=>'1')){
        echo $this->fetch('sidebar');
    }
?>

Mais cela retourne une erreur:
Cannot access empty property au niveau de Portfolio\lib\Cake\View\View.php
Line: 852
La fonction présente à cette ligne est la suivante:

public function __set($name, $value) {
        switch ($name) {
            case 'output':
                return $this->Blocks->set('content', $value);
            default:
                $this->{$name} = $value;
        }
    }

Je vois avoir loupé quelque chose je crois... je bloque depuis 3 jours.

Merci pour l'aide déjà apportée ;-)

Kareylo, il y a 12 ans

La Sidebar doit être affichée juste sur une vue particulière (Ca peut-être ta page d'accueil) ? Si c'est le cas, il te suffit de mettre ou doit être ta sidebar :

<?php echo $this->element('sidebar'); ?>

Si c'est dans une action et un controller spécifique :

<?php if($this->params'action'] == 'monAction' && $this->params'controller'] == 'monController'){
    echo $this->element('sidebar');
}

Si c'est avec un id spécifique (fourni dans l'URL, ici, l'id sera égale à 1, à toi d'adapter)

<?php if(isset($this->params'id']) && $this->params'id'] == 1){
    echo $this->element('sidebar');
}

Si c'est un paramètre passé dans l'url (quand tu fais un link, "$this->Html->link('Mon Lien', array('controller' => 'controller', 'action' => 'action', 'id' => 1));", le 'id' est le paramètre passé.)

<?php if(!empty($this->params'pass']) && $this->params'pass'][0] == 1){
    echo $this->element('sidebar');
}

L'index 0 est le premier paramètre passé.

Je crois que j'ai fait le tour de la question.

caema, il y a 12 ans

Un tout grand merci à Kareylo (et aux autres) pour cette réponse pertinente.
J'avais en effet loupé un truc dans la logique de CakePHP, maintenant que j'ai compris je me sens bête, ça fonctionne nickel et c'est pile poil ce dont j'ai besoin.

Grand merci donc!