[mcdebat]Comme un arrière gout d'objet

Problèmes, bugs et difficultés rencontrés sur le site.
Avatar du membre
Dominique
Messages : 3704
Enregistré le : 08 avr. 2006, 21:58

[mcdebat]Comme un arrière gout d'objet

Message par Dominique »

Quand je regarde le code de controleurs/nouvelles.php, je me dis que ce fichier n'est pas loin de retourner un objet... $vue

$vue->titre = 'Dernières nouvelles du site et informations ajoutées sur les refuges';
$vue->commentaires = $_GET['commentaires'];
$vue->general = $_GET['general'];
$vue->stat = stat_site ();
$vue->quoi = $_GET ['quoi'] ? $_GET ['quoi'] : 'commentaires,points,forums';


Une petite erreur de casting (au sens cinématographique)?
Ne serait ce pas le rôle du modele/nouvelle.php de retourner les infos concernant les nouvelles ?
Puis au contrôleur de les passer à la vue

modeles/Nouvelles.php:
class ModeleNouvelles
{
$titre = 'Dernières nouvelles du site et informations ajoutées sur les refuges';
$commentaires = $_GET['commentaires'];
$general = $_GET['general'];
$stat = stat_site ();
$quoi = $_GET ['quoi'] ? $_GET ['quoi'] : 'commentaires,points,forums';
}


Puis (en restant dans la logique de codage actuelle):
$vue = new ModeleNouvelles ();
include ($config['chemin_vues']."_entete.html");
include ($config['chemin_vues']."$vue->type.html");
include ($config['chemin_vues']."_pied.html");

En principe, ça revient au même, sauf qu'il n'y a pas de stdclass, ni ->, ni include :D

Je sens qu'on brûle.
(pas implémenté)
Modifié en dernier par Dominique le 20 mars 2013, 08:52, modifié 3 fois.
Avatar du membre
Dominique
Messages : 3704
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

Note: on pourrait coder de même, dans un objet générique, le chargement des vues
Dans ce cas, le vues/page.html inclurait des <?=$this->membre?> beaucoup plus logiques que $vue->membre

includes/Vue.php
class Vue {
function __construct($page) {
global $config;
include ($config['chemin_vues']."_entete.html");
include ($config['chemin_vues'].$page.".html");
include ($config['chemin_vues']."_pied.html");
}}


Puis
new Vue ('nouvelles');
(il manque le passage des arguments)
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Re: [proposition:codage]Comme un arrière gout d'objet

Message par sly »

Dominique a écrit :Quand je regarde le code de controleurs/nouvelles.php, je me dis que ce fichier n'est pas loin de retourner un objet... $vue
Objet objet, c'est vite dit, c'est juste utilisé comme un "tableau" et il ne le retourne pas mais le complète.
Une petite erreur de casting (au sens cinématographique)?
Ne serait ce pas le rôle du modele/nouvelle.php de retourner les infos concernant les nouvelles ?
Puis au contrôleur de les passer à la vue
C'est ça, mais qui est en "erreur de casting" ?
/controlleurs/nouvelles.php ne retourne (au sens objet ou fonction) aucune info concernant les nouvelles, puisque c'est la fonction "affiche_nouvelles" située dans /modeles/fonctions_nouvelles.php qui s'en occupe.

La vue nouvelles.html lui vole toutefois son rôle car c'est elle qui lance affiche_nouvelles, alors qu'elle ne devrait qu'afficher le contenu du tableau constitué par le controlleur.

modeles/Nouvelles.php:
class ModeleNouvelles
{
$titre = 'Dernières nouvelles du site et informations ajoutées sur les refuges';
$commentaires = $_GET['commentaires'];
$general = $_GET['general'];
$stat = stat_site ();
$quoi = $_GET ['quoi'] ? $_GET ['quoi'] : 'commentaires,points,forums';
}


Puis (en restant dans la logique de codage actuelle):
$vue = new ModeleNouvelles ();
include ($config['chemin_vues']."_entete.html");
include ($config['chemin_vues']."$vue->type.html");
include ($config['chemin_vues']."_pied.html");

En principe, ça revient au même, sauf qu'il n'y a pas de stdclass, ni ->, ni include :D

Je sens qu'on brûle.
(pas implémenté)
Peut-être cela sera-t-il éclairci par ma remarque ci-avant, mais ton class ModeleNouvelles n'est en rien un modèle. Ce qu'il fait c'est déporter le remplissage de $vue dans un autre fichier. Ça pourrait avoir un sens si ce code allait être appelé par ailleurs, mais ça a peu de chance d'être le cas ici.
Avatar du membre
Dominique
Messages : 3704
Enregistré le : 08 avr. 2006, 21:58

Re: [proposition:codage]Comme un arrière gout d'objet

Message par Dominique »

sly a écrit :Peut-être cela sera-t-il éclairci par ma remarque ci-avant, mais ton class ModeleNouvelles n'est en rien un modèle. Ce qu'il fait c'est déporter le remplissage de $vue dans un autre fichier. Ça pourrait avoir un sens si ce code allait être appelé par ailleurs, mais ça a peu de chance d'être le cas ici.
Tout dépend si on considère que ce sont des informations à propos des nouvelles ou des informations à afficher sur la page d'accueil
Avatar du membre
sly
Messages : 5041
Enregistré le : 29 févr. 2004, 17:59
Localisation : Chambéry - Savoie

Message par sly »

vu comme ça oui, mais vu comme ça, on va aussi avoir besoin d'un modèle pour chaque vue !

Il y a sans doute un truc à jouer sur cette histoire de passe d'information controlleur->vue, notamment en ce qui concerne par exemple des éléments redondants comme l'affichage des nouvelles en page d'accueil et en page nouvelle ou le formulaire de rss et celui d'export et ce afin d'éviter à ré-écrire plusieurs fois.

Mais je ne la vois pas bien en déportant juste le remplissage du $vue, si ce n'est pouvoir dire "là on fait enfin de l'objet dans son fichier tout seul" (alors même qu'on a ni constructeurs ni méthodes : juste un objet bien creux avec juste des propriétés)
Avatar du membre
Dominique
Messages : 3704
Enregistré le : 08 avr. 2006, 21:58

Message par Dominique »

sly a écrit :vu comme ça oui, mais vu comme ça, on va aussi avoir besoin d'un modèle pour chaque vue !
non
Il y a sans doute un truc à jouer sur cette histoire de passe d'information controlleur->vue, notamment en ce qui concerne par exemple des éléments redondants comme l'affichage des nouvelles en page d'accueil et en page nouvelle ou le formulaire de rss et celui d'export et ce afin d'éviter à ré-écrire plusieurs fois.
Oui : un modele représente un type de donnée (par exemple les nouvelles) et peut être utilisé dans plusieurs vues (accueil, nouvelles, RSS, ...)
C'est là qu'on factorise

De même, une vue peut appeler plusieurs modèles (les nouvelles, les massifs, ...)
C'est le contrôleur qui aiguille tout ça

new VueAccueil (array (
new ModeleNouvelles (...),
new ModeleMassifs (...),
new ModelePhoto (...),
));


html:
...<?=$this->photos->nombre?>...


(code très approximatif !)
Mais je ne la vois pas bien en déportant juste le remplissage du $vue, si ce n'est pouvoir dire "là on fait enfin de l'objet dans son fichier tout seul" (alors même qu'on a ni constructeurs ni méthodes : juste un objet bien creux avec juste des propriétés)
Tout à fait. Ce sont des artifices d'écriture sans grand impacts
(on y gagne toutefois l'inclusion automatique)