J'ai des boutons suivant et précédent dans mon album photos.

Le bouton suivant fonctionne très bien met mon bouton précédent reste bloqué sur l'id de la premiere photo posté. alors que j'aimerais que sa soi la page juste avant que celle qui est entrain d’être regarder.
Voici ma fonction voir
Je ne ses pas si mes explication son assez claire

function voir($id){
        $data"work"]=$this->Work->find("first",array(
            "conditions" => "Work.id=$id"
        ));
    // On récupère la catégorie du travail qu'on regarde
        $cat = $data"work"]"Portfolio"]"id"];
    // On récupère le travail suivant et précédent
        $data"suivant"]=$this->Work->find("first",array(
        "conditions" => "Work.id>$id AND Work.portfolio_id=$cat",
        "fields"=>"id,titre",
        "recursive"=>-1
    ));
        $data"precedent"]=$this->Work->find("first",array(
            "conditions" => "Work.id<$id AND Work.portfolio_id=$cat",
            "fields"=>"id,titre",
            "recursive"=>-1
        ));
        $this->set($data);
    }

Voici le lien 'precedent' dans ma vue voir.ctp

<?php if(isset($precedent"Work"])){ 
                          echo '<div class="back">';
                          echo $this->Html->link("« ".
                            $precedent"Work"]"titre"]." » Précédent ",
                            array("action"=>"voir",$precedent"Work"]"id"]),
                            null,
                            false,
                            false
                          );
                          echo "</div>";
                          }   
                      ?>

Si quelqu'un pouvais m’éclairer merci d'avance

11 réponses


Oulaaaaa tu te compliques la vie. Sur CakePHP, il existe un système de pagination qui te créera tes liens automatiquement sans que tu es besoin de le refaire.

http://book.cakephp.org/2.0/fr/core-libraries/components/pagination.html

++

sly
Auteur

Salut, merci pour ta réponse DexX

Enfaîte mon premier et que j'ai ma page 'index.ctp' qui présente toutes les photos en miniature toutes catégories confondu et je la pagine avec la fonction 'paginate' sa ses ok sa marche.

Ce que j'aimerais ses paginé les posts (aller de photo en photo) quand je clik sur une photo sa me la met en plus grand dans une autre vue 'voir.ctp'.
Et la au lieu de revenir sur la page 'index.ctp' pour sélectionné une autre photo, j'aimerais les liens photo suivante et précédente.

Pour le lien 'suivant' il me récupère bien la photo suivante avec cette condition :

"conditions" => "Work.id>$id AND Work.portfolio_id=$cat",=$cat",

le signe '>' indique de chercher l'id suivant mes pour le précédent il reste bloqué sur l'id 1

Ensuite mon autre soucis et que j'aimerais que si l'on sélectionne une photo de la page 'index.ctp' sa me pagine selon l'id sans tenir comte des catégories, mes que si les gens entre dans une catégorie par exemple 'pièces montées', ce que j'aimerais ses que les liens suivant et précédent pagine selon la catégorie dans laquelle on ce trouve.

Je suis débutant et la je ne vois pas du tout comment faire sa.

Salut,
tu as find('neighbors') qui va remplir l'affaire : http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find-neighbors.

N'hésite pas à fouiner dans le cookbook, ça m'a permis d'apprendre pas mal de trucs.

Pour ta deuxième question, il faut mettre des conditions de recherche dans ton find() lorsque tu as des catégories.

sly
Auteur

Merci pour ta réponse prbaron

Ses bien la fonction qui me fallait, grand merci! je vais essayer de mettre sa en place.

sly
Auteur

Avec find('neighbors') je n'arrivez toujours pas a récupérez le precedent

Finalement juste en précisant le 'order' sa fonctionne très bien

$data"work"]=$this->Work->find("first",array(
            "conditions" => "Work.id=$id"
        ));
        // On récupère le travail suivant et précédent
        $data"suivant"] = $this->Work->find('first', array('conditions' => array('Work.id >' => $id), 'order' => 'Work.id'));
        $data"precedent"]= $this->Work->find('first', array('conditions'=> array('Work.id <' => $id), 'order' => 'Work.id DESC'));
        $this->set($data);

Maintenant je vais voir pour faire ma condition de recherche pour les catégories.
Mes étant débutant si vous auriez un exemple pour me mettre sur la piste sa serai cool...

Je ne comprends pas, si tu fais ça tu devrais obtenir les bons objets :

$data'neighbors'] = $this->Work->find('neighbors', array(
    'conditions' => array(
         'Work.id' => $id   
     )
));
$data'precedent'] = $data'neighbors']'prev'];
$data'suivant'] = $data'neighbors']'next'];

Pour ton deuxième point, j'aurais fais quelque chose comme ça :

$data'neighbors'] = $this->Work->find('neighbors', array(
    'conditions' => array(
         'Work.id' => $id,
         'Category.id' => $category_id
     )
));
$data'precedent'] = $data'neighbors']'prev'];
$data'suivant'] = $data'neighbors']'next'];
sly
Auteur

Enfaîte quand je fait ta première méthode sans la category(sachant que pour moi la catégorie s'appel portfolio) et je fait un 'debug(data;' j’obtiens l'id sur laquelle je me trouve pour suivant et précédent 'id 10' [code] Array ( [neighbors] => Array ( [prev] => [next] => Array ( [Work] => Array ( [id] => 10 [url] => Corne-abondance.jpg [portfolio_id] => 1 [description] => [titre] => Corne d'abondance [comment_count] => 1 [type] => ) [Portfolio] => Array ( [id] => 1 [name] => Pièces-Montées [slug] => pieces-montees [portfolio_count] => 26 [link] => Array ( [controller] => works [action] => portfolio [slug] => pieces-montees ) ) [Comment] => Array ( [0] => Array ( [id] => 1 [pseudo] => sly [mail] => [contenu] =>

fhrets

[post_id] => 0 [created] => 2013-04-13 16:36:43 [recette_id] => 0 [work_id] => 10 [trick_id] => 0 ) ) ) ) [precedent] => [suivant] => Array ( [Work] => Array ( [id] => 10 [url] => Corne-abondance.jpg [portfolio_id] => 1 [description] => [titre] => Corne d'abondance [comment_count] => 1 [type] => ) [Portfolio] => Array ( [id] => 1 [name] => Pièces-Montées [slug] => pieces-montees [portfolio_count] => 26 [link] => Array ( [controller] => works [action] => portfolio [slug] => pieces-montees ) ) [Comment] => Array ( [0] => Array ( [id] => 1 [pseudo] => sly [mail] => [contenu] =>

fhrets

[post_id] => 0 [created] => 2013-04-13 16:36:43 [recette_id] => 0 [work_id] => 10 [trick_id] => 0 ) ) ) ) [/code] En rajoutant la conditions pour les catégories ta 2ieme méthodes j'obtiens un tableau vide : [code] $data['neighbors'] = $this->Work->find('neighbors', array( 'conditions' => array( 'Work.id' => $id, 'Portfolio.id' => $portfolio_id ) )); $data['precedent'] = $data['neighbors']['prev']; $data['suivant'] = $data['neighbors']['next']; debug($data); $this->set($data) Array ( [neighbors] => Array ( [prev] => [next] => ) [precedent] => [suivant] => ) [/code] Et si je rajoute juste la conditions a ce que j'ai fait sa me dit qu'il connait pas ma variable '$portfolio' Undefined variable: portfolio_id [APP/Controller/WorksController.php, line 51] [code] $data["work"]=$this->Work->find("first",array( 'conditions' => array( 'Work.id' => $id, 'Portfolio.id' => $portfolio_id ) )); // On récupère le travail suivant et précédent $data["suivant"] = $this->Work->find('first', array('conditions' => array('Work.id >' => $id), 'order' => 'Work.id')); $data["precedent"]= $this->Work->find('first', array('conditions'=> array('Work.id $id), 'order' => 'Work.id DESC')); debug($data); $this->set($data); } Array ( [work] => [suivant] => Array ( [Work] => Array ( [id] => 11 //ICI JE DEVRAIS OBTENIR ID => 13 pour respecter la categorie demander. [url] => Paris-Brest.jpg [portfolio_id] => 2 [description] => [titre] => Paris-Brest [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 2 [name] => Gâteaux [slug] => gateaux [portfolio_count] => 5 [link] => Array ( [controller] => works [action] => portfolio [slug] => gateaux ) ) [Comment] => Array ( ) ) [precedent] => Array ( [Work] => Array ( [id] => 9 [url] => cone.jpg [portfolio_id] => 1 [description] => [titre] => Cône [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 1 [name] => Pièces-Montées [slug] => pieces-montees [portfolio_count] => 26 [link] => Array ( [controller] => works [action] => portfolio [slug] => pieces-montees ) ) [Comment] => Array ( ) ) ) [/code]

sly
Auteur

Le problème ne pourrais pas venir de mon url?
Quand on sélectionne une catégorie par exemple piéce montée sa nous amène sur la page 'portfolio.ctp'
ce qui donne : /portfolio/pieces-montees et ici quand je clique sur la photo sa me renvoie sur l'url /voir/10
sa ne devrais pas m'envoyer sur une url de ce type :

/portfolio/pieces-montees/voir/10 pour rester dans la catégorie??

ma page portfolio.ctp et index.ctp ses la même chose

<?php
            foreach($works as $w){
                $w = $w"Work"];
            ?>
             <div class="min">
            <?php
                echo"<h3>".($w"titre"])."</h3>"; 
                $image=$this->Html->image(("/img/album/min/".$w"url"]));
                $url= array("action"=>"voir",$w"id"]);
                $option=array('escape'=> false);
                echo $this->Html->link($image,$url,$option);
            ?>
            </div>
            <?php
                }
            ?>

OK et ça ? C'est ce que j'ai pour un site et cela fonctionne chez moi. Il faudrait nous donner ton Model et ton schema de base de données sinon.

$d'neighbors'] = $this->Post->find('neighbors', array(
    'field' => 'id', 
    'value' => $id
));

et

$d'neighbors'] = $this->Post->find('neighbors', array(
    'field' => 'id', 
    'value' => $id, 
    'conditions' => array('Portfolio.id' => $portfolio_id)
));
sly
Auteur

Mon model work

<?php
class Work extends AppModel{
    public $name = "Work";
    public $belongsTo = array(
            'Portfolio' => array(
                'counterCache' => 'portfolio_count'
            ),
        );
    public $hasMany = array(
        'Comment' => array(
            'className' => 'Comment',
            'foreignKey' => 'work_id',
            'order' => 'Comment.created DESC',
            'dependent' => true
            ),
        );
}
?>

Ma structure base de donnée de works

-- 
-- Structure de la table `works`
-- 
CREATE TABLE `works` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `portfolio_id` int(2) NOT NULL DEFAULT '0',
  `description` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `titre` varchar(60) COLLATE latin1_general_ci NOT NULL,
  `comment_count` int(11) NOT NULL,
  `type` varchar(15) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `portfolio_id` (`portfolio_id`),
  KEY `portfolio_id_2` (`portfolio_id`)
) ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=41 ;
-- 
-- Contenu de la table `works`
-- 
INSERT INTO `works` VALUES (1, '2cv.jpg', 1, '', '2CV', 0, '');
INSERT INTO `works` VALUES (2, 'Barque.jpg', 1, '', 'Barque', 0, '');
INSERT INTO `works` VALUES (3, 'Berceaux.jpg', 1, '', 'Berceaux', 0, '');
INSERT INTO `works` VALUES (4, 'Cars-Manege.jpg', 1, '', 'Cars-Manége', 0, '');
INSERT INTO `works` VALUES (5, 'Chapeau-lapin.jpg', 1, '', 'Chapeaux et Lapin', 0, '');
INSERT INTO `works` VALUES (6, 'Chateau.jpg', 1, '', 'Château', 0, '');
INSERT INTO `works` VALUES (7, 'Chausson.jpg', 1, '', 'Chausson', 0, '');
INSERT INTO `works` VALUES (8, 'Coeur.jpg', 1, '', 'Coeurs', 0, '');
INSERT INTO `works` VALUES (9, 'cone.jpg', 1, '', 'Cône', 0, '');
INSERT INTO `works` VALUES (10, 'Corne-abondance.jpg', 1, '', 'Corne d''abondance', 1, '');
INSERT INTO `works` VALUES (11, 'Paris-Brest.jpg', 2, '', 'Paris-Brest', 0, '');
INSERT INTO `works` VALUES (12, '3-chocolats.jpg', 2, '', '3 chocolats', 0, '');
INSERT INTO `works` VALUES (13, 'Corne-abondance2.jpg', 1, '', 'Corne d''abondance 2', 0, '');
INSERT INTO `works` VALUES (14, 'danseuse.jpg', 1, '', 'Danseuse', 0, '');
INSERT INTO `works` VALUES (15, 'Eglise.jpg', 1, '', 'Eglise', 0, '');
INSERT INTO `works` VALUES (16, 'Escargot.jpg', 1, '', 'Escargot', 0, '');
INSERT INTO `works` VALUES (17, 'girafe.jpg', 1, '', 'Girafe', 0, '');
INSERT INTO `works` VALUES (18, 'Livre.jpg', 1, '', 'Livre', 0, '');
INSERT INTO `works` VALUES (19, 'Fruits Rouges.jpg', 2, '', 'Fruits Rouges', 0, '');
INSERT INTO `works` VALUES (20, 'Saint-honore.jpg', 2, '', 'Saint Honoré', 0, '');
INSERT INTO `works` VALUES (21, 'Livre2.jpg', 1, '', 'Livre 2', 0, '');
INSERT INTO `works` VALUES (22, 'Livre3.jpg', 1, '', 'Livre 3', 0, '');
INSERT INTO `works` VALUES (23, 'Livre4.jpg', 1, '', 'Livre 4', 0, '');
INSERT INTO `works` VALUES (24, 'Manege.jpg', 1, '', 'Manége', 0, '');
INSERT INTO `works` VALUES (25, 'ourson.jpg', 1, '', 'Ourson', 0, '');
INSERT INTO `works` VALUES (26, 'Faire-part-chausson.jpg', 1, '', 'Faire part et Chausson', 0, '');
INSERT INTO `works` VALUES (27, 'Faire-part-chausson2.jpg', 1, '', 'Faire part et Chausson 2', 0, '');
INSERT INTO `works` VALUES (28, 'Tartelettes citron.jpg', 2, '', 'Tartelettes au citron', 0, '');
INSERT INTO `works` VALUES (29, 'Planete-Nuit-Jour.jpg', 1, '', 'Planète Jour et la Nuit', 0, '');
INSERT INTO `works` VALUES (30, 'Tracteur-et-sa-remorque.jpg', 1, '', 'Tracteur et sa remorque', 0, '');
INSERT INTO `works` VALUES (31, 'Voiture-Cars.jpg', 1, '', 'Cars', 0, '');
// La table portfolio qui correspond a ma categorie de l'album photo
-- 
-- Structure de la table `portfolios`
-- 
CREATE TABLE `portfolios` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `name` varchar(60) COLLATE latin1_general_ci NOT NULL,
  `slug` varchar(60) COLLATE latin1_general_ci NOT NULL,
  `portfolio_count` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
-- 
-- Contenu de la table `portfolios`
-- 
INSERT INTO `portfolios` VALUES (1, 'Pièces-Montées', 'pieces-montees', 26);
INSERT INTO `portfolios` VALUES (2, 'Gâteaux', 'gateaux', 5);

Mon model portfolio

<?php
class Portfolio extends AppModel{
    var $name = "Portfolio";
    var $hasMany = "Work";

    public function afterFind($data){
        foreach($data as $k=>$d){
            if(isset($d'Portfolio']'slug']) && isset($d'Portfolio']'id'])){
                $d'Portfolio']'link'] = array(
                    'controller'    => 'works',
                    'action' => 'portfolio',
                    'slug' => $d'Portfolio']'slug']
                );
            }
            $data$k] = $d;
        }
        return $data;
    }

    public function beforeSave(){
        if(empty($this->data'Portfolio']'slug']) && isset($this->data'Portfolio']'slug']) && !empty($this->data'Portfolio']'name']))
            $this->data'Portfolio']'slug'] = strtolower(Inflector::slug($this->data'Portfolio']'name'],'-'));
        return true; 
    }
  }
?>
sly
Auteur

Je viens d'essayer la première méthode donne bien le suivant et le précédent mes il me reconnais plus ma variable '$work' sur ma page index je n'ai plus rien qui s'affiche. [code] Array ( [neighbors] => Array ( [prev] => Array ( [Work] => Array ( [id] => 9 [url] => cone.jpg [portfolio_id] => 1 [description] => [titre] => Cône [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 1 [name] => Pièces-Montées [slug] => pieces-montees [portfolio_count] => 26 [link] => Array ( [controller] => works [action] => portfolio [slug] => pieces-montees ) ) [Comment] => Array ( ) ) [next] => Array ( [Work] => Array ( [id] => 11 [url] => Paris-Brest.jpg [portfolio_id] => 2 [description] => [titre] => Paris-Brest [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 2 [name] => Gâteaux [slug] => gateaux [portfolio_count] => 5 [link] => Array ( [controller] => works [action] => portfolio [slug] => gateaux ) ) [Comment] => Array ( ) ) ) [precedent] => Array ( [Work] => Array ( [id] => 9 [url] => cone.jpg [portfolio_id] => 1 [description] => [titre] => Cône [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 1 [name] => Pièces-Montées [slug] => pieces-montees [portfolio_count] => 26 [link] => Array ( [controller] => works [action] => portfolio [slug] => pieces-montees ) ) [Comment] => Array ( ) ) [suivant] => Array ( [Work] => Array ( [id] => 11 [url] => Paris-Brest.jpg [portfolio_id] => 2 [description] => [titre] => Paris-Brest [comment_count] => 0 [type] => ) [Portfolio] => Array ( [id] => 2 [name] => Gâteaux [slug] => gateaux [portfolio_count] => 5 [link] => Array ( [controller] => works [action] => portfolio [slug] => gateaux ) ) [Comment] => Array ( ) ) ) [/code] Mes de que je rajoute la conditions portfolio sa me donne un tableau vide et toujours la même erreur: Undefined variable: portfolio_id