Bon je reposte parce que en fait je me suis tromper de catégorie de forum et avait fait un topic dans php : ici.

Alors voila, je suis en train de suivre le tuto sur cakePHP et j'ai décider de créer une table types (sur l'exemple de la table categories) pour séparer mes différents types de posts et de catégories. Donc en gros dans ma table categories j'ai un type_id, et de même j'ai un type_id dans ma table posts.

Donc les problèmes résultant :

J'aimerais pouvoir afficher dans mon admin_index de categories le types'name'] qui découle du categorie'type_id'] et non pas afficher le type_id qui est forcement un numéro...

Et plus gênant dans mon Post extends AppModel, mon controller => de afterFind déconne puisque le type_id est un numéro et pas un varchar...

<?php 
class Post extends AppModel{
    public function afterFind($data){
        foreach($data as $k=>$d){
            if(isset($d'Post']'slug']) && isset($d'Post']'id']) && isset($d'Post']'type_id'])){
                $d'Post']'link'] = array(
                    'controller'    => $d'Post']'type_id'],
                    'action' => 'show',
                    'id' => $d'Post']'id'],
                    'slug' => $d'Post']'slug']
                );
            }
            $data$k] = $d;
        }
        return $data;
    }

Alors voila je ne sais pas comment utiliser la valeur name d'une table qui correspond au type_id d'une autre table.

12 réponses


lepetitnico
Réponse acceptée

Salut en faite il faut dans un premier temps enlevé $v = current($v) car en faite il te fait rentrer directement dans Category, et tu écrit par exemple pour ton

$v'id'] : $v'Category']'id']

Du coup pour le name du type, tu fais :

$v'Type']'name']

Avec sa tu auras ton nom de type.

Salut est ce que tu as entendu parler des liaisons entre les modèles, dans la documentation de cakephp : Lien vers la documentation

Au sinon tu devrais suivre le cour Jour3 avec cakephp de grafikart sur commer lier des modeles, sa devrait répondre à ta question.
Voici le lien :

Cour Jour 3 cakephp

Si tu as toujours des soucis reviens poster un message.

Lepetitnico

neodin
Auteur

Oui j'ai suivi ce tuto, ainsi que celui sur les tags, mais ce que je voudrais faire, c'est par exemple en fonction du type_ID de mon post ou de ma catéorie, afficher la valeur correspondante du champ name de ma table types.

Et bien qu'ayant lié mes models, je ne vois pas comment remplacer le type_id par le name, ce que je ne comprends pas c'est comment les faire correspondre.

Il te suffit de le déclarer dans tes fields quand tu fais ta requête préparé avec cakephp, par exemple Type.name.

Du coup il y aura un tableau Typ dans ton tableau de résultat, également a tu mis $recursive à 1 minimum.

neodin
Auteur

erf nan la recursive était a -1; je sais pas pourquoi d'ailleur. fin bref donc si je fais un $this->Category->Type->find('list', array('fields'=>'id','name'));

et que dans mon admin_index je fais dans la table qui correspond au type : echo $v'Type']'name'];

Donc en gros si ma catégory a un type_id qui est égal a 3 et que mon id 3 de ma table type est égal a un name : post, il affichera automatiquement : post.

neodin
Auteur

Et si je fais un truc comme ca.

class Category extends AppModel {
    public $name = 'Category';
    public $belongsTo = array(
        'Type' => array(
            'className' => 'Type',
            'foreignKey' => 'type_id'
        )
    );
}

Oui sa va le faire, dans ta table Category tu as un type_id, si oui sa va automatiquement t'appelé tous les champs de Type, correspondant à cet id si tu met une recursive à (1 ou 0) je crois.

neodin
Auteur

cool je vais tester ca.

neodin
Auteur
Array
(
    [categories] => Array
        (
            [0] => Array
                (
                    [Category] => Array
                        (
                            [id] => 1
                            [name] => Art
                            [slug] => art
                            [post_count] => 0
                            [type_id] => 3
                            [link] => Array
                                (
                                    [controller] => posts
                                    [action] => category
                                    [slug] => art
                                )
                        )
                    [Type] => Array
                        (
                            [id] => 3
                            [name] => video
                        )
                )
        )
)

Donc il m'a bien lié mes models pas de souci la dessus, par contre dans mon admin_index :

<table>
    <tr>
        <th>ID</th>
        <th>Nom</th>
        <th>Type</th>
        <th>Actions</th>
    </tr>
    <?php foreach($categories as $k=>$v): $v = current($v); ?>
    <tr>
        <td><?php echo $v'id']; ?></td>
        <td><?php echo $v'name']; ?></td>
        <td><?php echo $v'type_id']; ?></td>
        <td>
            <?php echo $this->Html->link("Editer",array('action'=>'edit',$v'id'])); ?> - 
            <?php echo $this->Html->link("Supprimer",array('action'=>'delete',$v'id']),null,'Voulez vous vraiment supprimer cette page ?'); ?>
        </td>
    </tr>
    <?php endforeach; ?>
</table>

Je ne sais pas quoi mettre a la place de mon $v'type_id']; pour qu'il affiche le $v'Type']'name']

neodin
Auteur

Ça marche nikel...

Je venais de m'apercevoir qu'effectivement il parcourrait uniquement $categories et j'étais en train de changer $categories par $d mais ça marchait pas non plus...

Je te remercie grandement... 2 jour que j'y suis... j'ai péter un câble tout effacé et recommencer... bon me reste plus qu'a tout refaire ^^

Désolé, j'ai posté que en fin de journée.

neodin
Auteur

Nan c'est nikel mec, merci, j'ai tout refait en plus propre, et j'ai pu résoudre le second problème de Post extends AppModel plus conventionnellement.