@djedjethai daccord et quel est la méthode utilisée dans la version finale du cours ? Et esque je pourrais avoir un pdf de cette dernière ? si non un lien à la place suffit merci.
@MGM777 vois ce lien https://github.com/eheintzmann/OC_PHP-OO_Activite c'est le projet complet. Par contre il y a un systhem de cache en plus, c'etait le test final avant (a moins que cela le soit toujours), il a donc quelques rajout, mais pas dans les views.
Va dans app/frontend/'module/news'/views et tu trouveras le fichier show.php
ps: aussi dans la precedente explication j 'ai fait une err, a la fin
// cet ligne n'est pas l'equivalent de $news = $_GET['id']
$news = $this->managers->getManagerOf('News')->getUnique($request->getData('id'));
// c'est ce code qui l'est
$request->getData('id')
// $request est passer en argument dans BackController.php
public function execute()
{
$method = 'execute'.ucfirst($this->action);
if (!is_callable([$this, $method]))
{
throw new \RuntimeException('L\'action "'.$this->action.'" n\'est pas définie sur ce module');
}
$this->$method($this->app->httpRequest()); // ici
}
// et donc recupere ici (NewsController.php)
class NewsController extends BackController
{
public function executeIndex(HTTPRequest $request)
{
@lartak excuse moi mais je te comprend pas comment sa sous un autre format et lequel justement ? es-que cela justifie le fait de ne pas passer des variables dans l'url de manier classique c.a.d : '''news.php?var=77&var2=7'' et elle sont sur le format chainne de caractère bien-sur mais plustot '''news.php-var-var2''', ou sont les valeurs ? Autant de questions.
@djedjethai j'ai parcourus le support de cours sur github et malheureusement c'est toujours la même chose pour passer des valeurs dans l'url, donc je ne me retrouve toujours pas .help !!!
Ce que veut dire Lartak c'est que toutes les datas transmises (que cela soit $_POST, $_GET, ou autres...) transitent via l'url. Avec $_POST elles se trouvent dans un 'body' et donc n'apparaissent pas dans l'url en lui-meme (mais sont bien presentes), alors que avec $_GET elles sont visibles, comme tu peux le voir.
Les variables HTTP get sont tres pratiques et tres utiliser, il est necessaire de les maitriser.
voici un copy paste du fichier 'show.php', je ne comprends pas la question que tu m'adresses ??, peux tu preciser.
<p>Par <em><?= $news['auteur'] ?></em>, le <?= $news['dateAjout']->format('d/m/Y à H\hi') ?></p>
<h2><?= $news['titre'] ?></h2>
<p><?= nl2br($news['contenu']) ?></p>
<?php if ($news['dateAjout'] != $news['dateModif']) { ?>
<p style="text-align: right;"><small><em>Modifiée le <?= $news['dateModif']->format('d/m/Y à H\hi') ?></em></small></p>
<?php } ?>
<p><a href="commenter-<?= $news['id'] ?>.html">Ajouter un commentaire</a></p>
<?php
if (empty($comments))
{
?>
<p>Aucun commentaire n'a encore été posté. Soyez le premier à en laisser un !</p>
<?php
}
foreach ($comments as $comment)
{
?>
<fieldset>
<legend>
Posté par <strong><?= htmlspecialchars($comment['auteur']) ?></strong> le <?= $comment['date']->format('d/m/Y à H\hi') ?>
<?php if ($user->isAuthenticated()) { ?> -
<a href="admin/comment-update-<?= $comment['id'] ?>.html">Modifier</a> |
<a href="admin/comment-delete-<?= $comment['id'] ?>.html">Supprimer</a>
<?php } ?>
</legend>
<p><?= nl2br(htmlspecialchars($comment['contenu'])) ?></p>
</fieldset>
<?php
}
?>
<p><a href="commenter-<?= $news['id'] ?>.html">Ajouter un commentaire</a></p>
@djedjethai Merci beaucoup pour cette brillante explication. Dans ce fichier show.php justement la derniere ligne qui permet d'ajouter un commentaire a une news est l'objet de ma preocupation. Pour peciser la news a la quelle on voudrait ajouter un commentaire il faudrait passer l'id de la news dans l'url. ceux qui est ici :
<a href="commenter-<?= $news['id'] ?>.html"> //remarquons que la valeur d'id est directement transmise sans index // Sauf qu'on pouvait faire de manniere clasique
<a href="commenter.html?id=<?= $news['id'] ?>">
//ceux qui aurait cree la super global $_GET['id']
//La aucun probleme
Mais etant donne que nous avons redefinie l'url avec notre nouveau system je m'interoge : toute les url sont redefinis dans
le fichier routes.xml (en balise 'route' ) exemple du fichier
vars ici contient la liste des index aux variables transmisent via url
(separare par des virgule si besoin exemple vars="id,maxlength"). Sauf qu'il faut avant usage reconstituer chaque variable
super global c.a.d (creer des $_["id"] et $_["maxlength"]) afin que la classe HTTPRequest puisse aisement les manipuler.
La question est : quelle methode de quelle classe fait cela ? c.a.d associe a une valeur transmise dans l'url l'index adequats contenu dans l'attribut vars de la balise route.
Attention il ne sagit pas ici de la methode qui verifie si une url correspond a une route mais plustot celle qui assignie a une valeur transmise dans l'url l'index adequats contenu dans l'attribut vars de la balise route. existe-t-elle, dans qu'elle classe ?
Le bootstrap instancie la class FrontendApplication.php ou BackendApplication.php
/ Il ne nous suffit plus qu'à déduire le nom de la classe et de l'instancier
$appClass = 'App\\'.$_GET['app'].'\\'.$_GET['app'].'Application';
$app = new $appClass;
$app->run();
ces class heritent de Application.php, et dans leur method run() ils appellent la method getController() (se trouvant dans la class mere)
public function run()
{
$controller = $this->getController();
voici le dbut de la method dans cette class Application.php
ici on instancie le Router, on recupere les routes du fichier xml et on instancie avec un/des class Route avec
a la derniere ligne le router va seclectioner la route(provenant du fichier xml) qui va matcher l'url
public function getController()
{
$router = new Router;
$xml = new \DOMDocument;
$xml->load(__DIR__.'/../../App/'.$this->name.'/Config/routes.xml');
$routes = $xml->getElementsByTagName('route');
// On parcourt les routes du fichier XML.
foreach ($routes as $route)
{
$vars = [];
// On regarde si des variables sont présentes dans l'URL.
if ($route->hasAttribute('vars'))
{
$vars = explode(',', $route->getAttribute('vars'));
}
// On ajoute la route au routeur.
$router->addRoute(new Route($route->getAttribute('url'), $route->getAttribute('module'), $route->getAttribute('action'), $vars));
}
try
{
// On récupère la route correspondante à l'URL.
$matchedRoute = $router->getRoute($this->httpRequest->requestURI());
}
donc on se retrouve dans la class Router, et dans la method getRoute()
public function getRoute($url)
{
foreach ($this->routes as $route)
{
// Si la route correspond à l'URL
if (($varsValues = $route->match($url)) !== false)
{
echo 'get route<br />';
var_dump($varsValues);
echo '<br />';
// Si elle a des variables
if ($route->hasVars())
{
$varsNames = $route->varsNames();
$listVars = [];
// On crée un nouveau tableau clé/valeur
// (clé = nom de la variable, valeur = sa valeur)
foreach ($varsValues as $key => $match)
{
// La première valeur contient entièrement la chaine capturée (voir la doc sur preg_match)
if ($key !== 0)
{
$listVars[$varsNames[$key - 1]] = $match;
}
}
echo 'numero de la news ou comment<br />';
var_dump($match);
// On assigne ce tableau de variables � la route
$route->setVars($listVars);
}
return $route;
}
}
get route
array(2) { [0]=> string(17) "/news/news-62.php" [1]=> string(2) "62" }
numero de la news ou comment
string(2) "62"
A la suite de l'execution de cette methode le deroulement de la method getController() dans Application.php continue, voici la fin de cette method.
il y a le catch de l'err, puis le $_GET = array_merge($_GET, $matchedRoute->vars());. ici le numero de la news (ds cet ex) qui a ete stoque dans la class Route (comme on vient de la voir dans la methode precedente getRoute()), est insere dans la super global $_GET, et donc est diponible via la class HTTPRequest (comme explique precedemment) partout dans l'application.
catch (\RuntimeException $e)
{
if ($e->getCode() == Router::NO_ROUTE)
{
// Si aucune route ne correspond, c'est que la page demandée n'existe pas.
$this->httpResponse->redirect404();
}
}
// On ajoute les variables de l'URL au tableau $_GET.
$_GET = array_merge($_GET, $matchedRoute->vars());
// On instancie le contrôleur.
$controllerClass = 'App\\'.$this->name.'\\Modules\\'.$matchedRoute->module().'\\'.$matchedRoute->module().'Controller';
//var_dump($controllerClass);
return new $controllerClass($this, $matchedRoute->module(), $matchedRoute->action());
}
il y a cette method (dans la class Route), une regex qui verifie que l'url correspond bien a une des routes du fichier xml, si aucune ne match il y a une err 404 genere par une method se trouvant dans la class Page.php (si mes souvenirs sont bon).
public function match($url)
{
if (preg_match('`^'.$this->url.'$`', $url, $matches))
{
return $matches;
}
else
{
return false;
}
}
d'après vous pour la réalisation d'un site Web pro qui sera amené à évoluer dans le temps, peut-on prendre comme base de création le framework de ce cours OCFram ? Personnellement je n'aime pas trop les frameWork de type Symfony car parfois ils demandent beaucoup de temps d'apprentissage et avec les mises à jour il deviennent obsolète rapidement. J'aime bien le côté PHP pure avec la maîtrise totale sur le code et un minimum de clarté dans le code grâce aux objets et au MVC.
J'en suis à la partie 5 "mini-jeu". Je ne comprends pas pourquoi dans la déclaration d'une fonction tantôt on indique la classe, tantôt no. Par exemple la déclaration : public function frapper(Personnage $perso), pourquoi indiquer "Personnage" dans le parametre reçu par la fonction ? Je l'ai supprimé et le code fonctionne quand même. Pouvez-vous m'indiquer la raison ?
En fait tu exiges comme paramètre un objet de la classe Personnage dans ton exemple. Cela évite de planter le code si tu passes un INT comme paramètre par erreur.
Dans ton cas, le code marche puisque tu appelles bien la méthode avec le bon type en paramètre.
@djedjethai je propose cette solution pour resoudre le probleme, tout ce qui souhaite pourons l'integrer dans leur programme.
$url="news/show-72-77-37.7-.php";
function extractGetValue($url)
{
// LUC 3:14 JESUS, revêtu de la puissance de l'esprit...
/*Voici des recommandations à prendre en compte pour le bon fonctionnement de cette fonction
~~~~>Tout paramètre transmit dans l'url est precédé et suivie du tiret (-),
toute url contenant dont au moins un paramètre se termineras TOUJOURS par (-.php ou -.html)
~~~~>Il faudra convertir les valeurs retourné par la fonction en int ou float (selon le cas écheant),
car les valeurs contenu dans le tableau sont des "string"
~~~~>Veuillez à ce que les noms de vos modules et des vos actions ne contienne aucun tiret(-)
exemple : Modu-le ou ac-tion
~~~~>N'existeer pas a améliorer cette fontion Cependant,
~~~~>Consever ces commentaires.
*/
$getParam=explode("-",$url);
array_shift($getParam);
array_pop($getParam);
return $getParam;
// LUC 3:14 JESUS, revêtu de la puissance de l'esprit...
}
var_dump(extractGetValue($url));
@MGM777. "il n'y a aucun probleme, le code de l'application fonctionne parfaitement". Ta function est inutile dans le context de cette application.
1/l'url est matche avec les routes extraitent du dossier de config 'route.xml'.
2/si match ok, le numero du commentaire ou de la news est extrait puis injecte dans $_GET[''] (relis mes precedentes explications).
3/il n'y a pas besoin de array_shift() ni de array_pop(). Car a chaque request du client, l'appli reload, et le $_GET[] (si nouvelles datas: numero de news ou de comment) se trouve ecrase, pointe sur la nouvelle valeur.
Bonjour j'essaie de démarrer le Tp concernant l'application, j'en suis au chapitre description de l'application et je suis un peu perdue.
Je suis sous windows, j'utilise wamp Serveur. Je voudrai savoir si il faut obligatoirement utiliser le module mod_vhost_alias d'Apache ?
Il est demandé de rajouter un code donné à la fin du fichier et je ne comprend pas vraiment ce qu'il nous permet de réaliser à part changez le nom de l'hôte virtuelle ? Cela est-il indispensable pour la suite du cours ? Merci d'avance pour vos lumières =).
Oui la première partie est très importante pour le cours, j'ai personnellement galéré plusieurs jours car je n'ai pas fait cette étape du coup rien ne marché ah ah.
Cela vas permettre de dire a ton sevrer que si tu tape dans ta barre "monsupersite/" cela vas faire comme si tu tapes "localhost/monsupersite/Web/" comme le cours travail beaucoup avec le système de routeur qui vas modifier nos URL celons les besoin une tel différence d'URL n'est pas acceptable pour le bon fonctionnement du cours.
Le fait que si tu ne la fais pas tu auras une URL de ce genre "localhost/monsupersite/Web/" ce qui vas poser problème car le cours est conçu sur une URL de ce genre "monsupersite/" enfin c'est ce que je suppose je n'ai pas encore bien compris pourquoi une URL de type "localhost/monsupersite/Web/" ne fonctionne pas avec le cours, j'imagine qu'avec le routeur et peut être calibré pour une URL précise, ou le fait d'enter dans le dossier "Web" perturbe le fonctionnement du code, mais je vais bien finir par trouver ah ah. En tout cas fait bien cette première étape.
Bonjour à tous, besoin d'aide svp. Je cree un site de gestion de stock et je n'arrive pas à insérer chaque quantité livrée directement dans QTE STOCK de ma table ARTICLE qui difère de la table livraison à chaque insertion d'un article livre dans livraison.
Deux jours que je fais des recherches et rien. Vraiment besoin d'aide siouplait !
ma table article contient QTE STOCK de chaque article; ma livraison contient fk de idarticle et qte livre.
Ce que je veux faire, c'est insérer automatiquement chaque qte livrée dans qtestock en fonction de l'idarticle concerné.
Je crois, que tu devrais regarder du coté des clauses INNER JOIN ou LEFT JOIN ou RIGHT JOIN combiner à une clause WHERE pour pouvoir cibler l'id de t'as table article en fonction de l'id de la table livraison, cela te permettrais de lié ton id article et livraison pour insérer au bon endroit.
dans le chapitre UML 2/2, il y a un lien vers un module de DIA permettant d'exporter nos classes en langage PHP (uml2php).
Ce lien ne semble plus être actif. Existe-t-il un autre lien permettant de retrouver ce module (je n'ai pas réussi à le trouver) ? Ou d'autres utilitaires permettant la même opération ?
je pense qu'il y a un petit oubli à la fin de ce TP. Je ne sais pas vous mais si vous créez un personnage, et juste après, vous attaquez un autre, cela va fonctionner mais vous faire également l'erreur suivante :
Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'timeEndormi' ne peut être vide (null)
J'ai regardé, et je pense avoir trouvé: il manque 'timeEndormi' => 0 dans l'hydrate du manager. Alors oui en base de donnée c'est bon car par défaut on demande à mettre 0, et si vous faite un echo de $perso->timeEndormi() cela vous remontera bien 0 (je ne sais pas trop pourquoi d'ailleur, surement que par défaut echo renvoi 0 au lieu de null) , mais je pense que comme nous somme dans la session, il n'y a pas eu de recherche de cet attribut dans la base, et c'est pourquoi on a ce message d'erreur.
en tout cas, cette correction a fonctionné pour moi.
Si tu veut mette un attribut null ça se spécifie à la création de la table.
SInon j'ai bien aimé ce tutoriel et ce tp final , j'avais besoin de revoir quelques points de la poo (les iterator et closure notamment) et ce cours ma plu , après si vous n'avez pas fait de POO avant je pense que il sera un peu complexe
@djedjethai Meaculpa tu as raison le code fonction parfaitement, neanmoins cette fonction que je propose est une amelioration.
Cependant je suis a la recherche d'une solution pour creer des pdf a partir d'un code jquery ou php
J'ai trouver FPDF et HTML2PDF tres lourd et moins flexible a mes attentes
Quelqu'un a t'il une autre solution SVP. Mais si jamais vous avez des anciens fichiers sources de HTML2PDF qui ne necessite pqs un gestionnaire de dependance JE SUIS PRENEURS.
Bonjour, je suis actuellement en train de suivre le MOOC "concevoir un site web avec PHP, je rencontre un problème, je ne sais pas trop vers quel forum me tourner. J'espère que je trouverai un âme charitable qui pourra m'aiguiller.
je suis dans un chapitre sur "la lecture des données". je n'arrive pas à afficher mon code PHP dans MAMP. Je suis sur MAC, j'ai suivi toutes les démarches à faire, j'ai rentré mes données dans PHPMyAdmin. Je n'arrive pas à trouver l'erreur, et j'ai aucun message d'erreur qui s'affiche. c'est pareil je ne comprends pas comment il faut faire, j'ai beau suivre les démarches à effectuer rien ne se passe. j'ai beau chercher, je ne vois pas. je vous met ma capture d'écran de ce que j'ai écrit.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.