Bonjour,

Pourrais-t-on me donner un exemple comment fonctionne l'héritage ?

Exemple:

Une Classe Personne (nom, prenom, adresse, ...)
Une Classe Professeur extends Personne (avec en plus 2 champs par exemple : cours_id, classe_id)

=> debug($professeurs) qui m'afficherait un tableau complet.

j'ai essayé public $hasOne, $hasMany etc... ça ne fonctionne pas les liaisons ne se font pas...

Merci pour votre aide.

Gf

9 réponses


GrafikFan
Auteur
Réponse acceptée

waip, bon ... on va faire avec donc :)
c'est bien dommage car j'aime bien ce Framework mais si c'est pour faire de la bonne POO, je le trouve un peu limité ou alors contraint de respecter certaines conventions alternatives...

voilà, toutefois merci pour vos réactions

@++

je laisse le billet ouvert, si une soluce existerai - à la sauce POO :-)

Pakito
Réponse acceptée

En fait, il suffit surtout de savoir comment s'appelle ce que l'on cherche pour trouver ça très rapidement.

Et dans le cas présent, une jointure qui partage, en plus d'un héritage basique et logique, une structure de Model en BDD, c'est le comportement polymorphic.

Si je ne dis pas de bêtise, c'est une feature Ruby on Rails au départ, mais bien évidemment le comportement a été demandé sur Cake.
Pour l'instant il n'est pas implémenté, mais il y a des méthodes pour créer le behavior un peu partout, notamment ici ou sur certains repos Git. Le mieux est encore de chercher sur Google et de trouver la méthode qui correspond le mieux à ta manière de coder.

Enjoy ;)

Euh là tu confonds héritage de classes et MCD

Bonjour, dans cakephp à ce que je sache la classe mère de notre dossier app en ce qui concerne les controllers est AppController. Voilà pourquoi toutes les class que tu feras dans ce dossier Controller ont un extends pour AppController. Qu'est ce que sa veut dire ? Sa veut tout simplement dire que toutes les class qui extends de la class mère(AppController), hérite automatiquement de toutes les fonctions et variables [u]public[/u] ou [u]protected[/u] se trouvant dans la class mère. Pour exemple en mettant un : [code] public $helpers = array('Html');[/code] veut tout simplement dire que toutes les class qui hériteront de AppController pourront utiliser ce helper. CakePhp nous permet aussi de faire des liaisons, ce qu'il y'a de plus naturel avec tous frameworks. En base de données, on appellera ça tout aussi une liaison, pour cela Cake utilise les différentes variables : [code]public $hasOne, $hasMany, $belonsTo, $hasAndBelongsToMany;[/code] Si je comprend bien tu veux faire hériter des variables qui se trouve dans ta class Personne pour la class Professeur. Ce que je te conseille de faire c'est de créer une table [u]personnes[/u] avec bien sur les différents paramètres dont tu as fait part + un paramètre de liaison [u]professeur_id[/u]. ainsi que la table [u]professeurs[/u] avec ses différents paramètres. Tu auras donc pour cela un model [u]Personne[/u] qui lui héritera de [u]AppModel[/u] ainsi qu'un model [u]Professeur[/u] héritera aussi de [u]AppModel[/u] mais qui aura une liaison de type [u]hasOne/u](A une) avec Personne et Personne qui aura une liaison de type [u]belongsTo[/u]. exemple : [code] class Personne extends AppModel{ public $belongsTo = array('Professeur'); } [/code] [code] class Professeur extends AppModel{ public $hasOne = array('Personne'); } [/code] En bref, suit la formation de grafikart, il y a rien de mieux pour t'expliquer le fonctionnement de Cakephp. Superbement, ccvf2s.

Salut, et merci pour tes explications... Mais :)

Tout cela je l'avais bien compris mais ça ne répond pas à ma demande ou alors me suis mal exprimé...

Les entends de AppController et jointures je sais ce que cela représente et dans quels cas les utiliser.
J'avais déjà suivis la formation de Grafikart également.

Par contre:
L'héritage que souhaite appliquer n'est pas celui de AppController, la "grande classe mère", mais plutôt ce genre:
La Classe Professeur qui hériterait des fonctions de Personne, et dans certains cas, complétée par une surcharge (poo).
Exemple : si je dois inscrire une personne, je ne vais pas recréer une fonction inscription (la méthode dans Personne sera utilisée), par contre si elle surchargée par des arguments supplémentaires ce sera celle de Professeur, de l'héritage telle qu'on utilise en POO classique.
J'ai réussi à faire quelques tests (via import('Controller', 'Personne'), ça fonctionne au niveau des appels de fonction. Mais des que j'utilise (dans mon modèle un $hasOne, ou autre type de jointure) les informations n'apparaissent pas (sauf si je crée la requête en dure dans ma fonctionne), et j'ai bien respecté les conventions (les tables en anglais, People et Professors, et foreignKey person_id).

Voilà, pour cette raison que je demandais à la base si quelqu'un avait déjà eu à faire à de l'héritage.
( si je dois sauvegarder un professeur automatiquement l'application fera appel à la fonction de la mère - si elle n'est pas surchargée).

Merci pour votre aide.

Gf

Uu c'est quoi cette question Uu

En pratique oui si tu fais un extends sur 2class extend 1class (qui est extends a appcontroller), tu auras les fonctions de la 1class dans la 2class. Le fait de remplir l'Appcontroller est que nous avons des validation de formulaire autre que nous pouvons appliquer à tous les controller ou que nous en avons besoin sur la plus part.

Dans chaque fonction d'une class, quand nous devons lister, editer supprimer un objet de la table de notre controller, nous l'appellons sans ambiguïté

$this->set('models1', $this->paginate());

A quoi cela te servirais d'avoir ça dans ta deuxieme classe ? Il faudrait que tu embellisse ta fonction paginate pour que cela fonctionne

public $paginate = array(
      'models1' =>array( 'limit' => 25,
        'order' => array(
         'model1.modified' => 'desc')),

          'models2' =>array( 'limit' => 25,
        'order' => array(
         'model2.modified' => 'desc')),

    );

Ton $uses serait assez imposant sachant que tu devrais utiliser x modele dans ton controller car tu aurais les fonction pour deux controller

Au final tu aurais en soit beaucoup de requête pour rien. J'ai jamais testé de faire un extend de controller mais si tu as à la fin de ta page le debug sql tu verras que si tu changes pas le recursive tu auras un select sur tes 2 tables.

Je pense que ça ne ferait qu'alourdir ton application. Mais bon à tester ^^
Bonne continuation.

Bah teste jeannette, j'ai jamais essayé ce que je dis est purement théorique.

En créant un controller sans base, tu pourrais déja palier le probleme de surcharge de requête par exemple :')

Bonjour,

bien que je n'ai pas utilisé, la version 3.0 de cakephp
je pense(avec méfiance ) que l'ajout des namespaces
aidera à faire ce que tu veux.

Mais logiquement, vu que Cake sert dans la plupart du temps
pour faire des sites internet, les relations de type jointure
correspondent mieux à ce que tu veux.

Superbement,
ccvf2s.

Cool Pakito !
merci pour ces précisions.

gFan