Bonjour à tous,
je suis entrain de developper mon premier site dynamique et ce, grace aux tutoriels sur PHP de grafikart. J'en suis au jour 2 !
j'ai fait tout ce qu'il fallait faire concernant le tuto mais un petit quelque chose manque : la prise en compte de bootstrap. en effet,
en intégrant le default.php on génére nos vues automatiquement via le $content_for_layout
il n'y a pas d'erreur au niveau PHP .
Le text:
Bienvenue
C'est la page d’accueil
ce texte s'affiche bien mais bon voilà une partie prends en compte le CSS (bootstrap) et une autre non (ce que je ne comprends pas !). par exemple quand je tape http://localhost/site/monsite/pages/ la page de bienvenu s'affiche sans le CSS mais si je tape http://localhost/site/monsite/pages/view/index la page s'affiche avec le rendu CSS.. grrr !!! j'ai déplacé les fichiers du bootstrap mais à faire !!!
Alors peut être qu'il y a une astuce qui me manque mais je ne le trouve pas pour l'instant. mes codes sont en bas.si quelqu'un a déjà rencontré ce problème je suis preneur :). merci d'avance !
index.php
<?php
define('WEBROOT',dirname( __FILE__ ));
define('ROOT',dirname(WEBROOT));
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core');
define('BASE_URL',dirname(dirname($_SERVER'SCRIPT_NAME'])));
require CORE.DS.'includes.php';
new Dispatcher();
?>
Dispatcher.php
<?php
class Dispatcher{
var $request;
function __construct(){
$this->request = new Request();
//echo $this->request->url;
Router::parse($this->request->url,$this->request);
$controller = $this->loadController();
// si l'action n'est pas defini dans le tableau des controller
if (!in_array($this->request->action,get_class_methods($controller))){
$this ->error('Le controller '.$this->request->controller.' n\' a pas de methode '.$this->request->action);
}
call_user_func_array(array($controller,$this->request->action),$this->request->params); // permet de call une autre fonction
$controller->render($this->request->action);
}
/* function pour la gestion des erreurs*/
function error ($message) {
header("HTTP/1.0 404 Not Found");
$controller = new Controller($this->request);
$controller->set('message',$message);
$controller->render('/errors/404');
die();
}
function loadController() {
$name = ucfirst($this->request->controller).'Controller';
$file = ROOT.DS.'controller'.DS.$name.'.php';
require $file;
return new $name($this->request);
}
}
?>
Controller.php
<?php
class Controller {
public $request;
private $vars = array(); // variables que je fais passer à ma view
public $layout = 'default';
private $rendered = false;
function __construct ($request) {
$this->request = $request;
}
public function render($view){
if ($this->rendered) { return false;}
extract($this->vars);
if (strpos($view,'/')===0) {
$view = ROOT.DS.'view'.$view.'.php';
}else {
$view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
}
ob_start();
require($view);
$content_for_layout = ob_get_clean();
require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
$this->rendered = 'true';
}
/* fonction qui permet d'envoyer la varible à afficher $phrase*/
public function set ($key,$value=null /* valeur optionnel*/) {
if (is_array($key)) {
$this->vars += $key;
}else{
$this->vars$key]= $value;
}
}
}
?>
Router.php
<?php
class Router{
/**
* Permet de parser une url
* @param $url Url ? parser
* @return tableau contenant les parametres
**/
static function parse ($url,$request){
$url = trim($url,'/');
$params = explode('/',$url); // explode permet de separer les differents morceaux de l'url par des "/"
$request->controller = $params[0];
$request->action = isset($params[1]) ? $params[1] : 'index';
$request->params = array_slice($params,2);
return true;
}
}
?>
Request.php
<?php
class Request{
public $url ; // URL appel? par l'user
function __construct(){
$this->url = str_replace(BASE_URL."/","",$_SERVER'REQUEST_URI']);
}
}
?>
includes.php
<?php
require 'Request.php';
require 'Router.php';
require 'Controller.php';
require 'Dispatcher.php' ;
?>
PagesController.php
<?php
class PagesController extends Controller {
function index (){
$this->render('index');
}
}
?>
default.php
<!DOCTYPE html ">
<html xmlns="http://www.w3.org/1999/xhtml xml:lang="fr" lang = "fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
<link rel="stylesheet" href="../../webroot/css/bootstrap.css" >
</head>
<body>
<div class="container">
<?php echo $content_for_layout;?>
</div>
</body>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script>
</html>
index.php (se situe dans le dossier pages)
<div class="hero-unit">
<h1> Bienvenu </h1>
<p> C'est la page d'accueil </p>
</div>
404.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
<body>
<div class="hero-unit">
<h1> Page introuvable </h1>
<p> <?php echo $message ?> </p>
</div>
</body>
</html>
Au pire, tu as toujours la possibilité de faire un helper plus pratique... :-)
<?php
class HtmlHelper /* extends Helper */
{
public static function link(string $text, string $url)
{
// En y réfléchissant un peu plus par contre. :-)
$link = ROOT_CONST . $url;
echo "<a href='$url'>$text</a>";
}
public static function style(/* ... */) { /* ... */ }
public static function script(/* ... */) { /* ... */ }
}
?>
HtmlHelper::link("C'est un lien", "/mon-url");
salut,
Le bootstrap à évolué en ça version 3
Prend le Bootstrap 3 , le tuto est donc, "obsolète" sur certain aspect...
Le doctype à lui aussi évolué.
à présent ceci suffit amplement :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="/img/ico/favicon.ico">
perso, je ne met pas les liens dans les pages, mais directement dans le dossier de mon site ! Plus de dépendance ainsi :)
Salut,
oui j'ai bien le version 3 du css et ce n'est pas non plus à cause du du doctype. bon dans tous les cas j'ai regardé dans firebug et ca me dit qu'il ne trouve pas mon css dans ce chemin "../../webroot/css/bootstrap.min.css" donc quand je tape ce lien (http://localhost/site/monsite/pages/) dans le navigateur comme dans le tuto cela m'affiche dans firebug :
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /site/webroot/css/bootstrap.min.css was not found on this server.</p>
<hr>
<address>Apache/2.4.9 (Win64) PHP/5.5.12 Server at localhost Port 80</address>
</body></html>
ce qui est normal car mon fichier css se trouve dans cette URL => /site/monsite/webroot/css/bootstrap.min.css et non dans /site/webroot/css/bootstrap.min.css !!! alors ma nouvelle question est où est ce qu'on place le fichier CSS (bootstrap)sachant qu'on a des redirection dans le fichier ".htaccess" ?? je ne suis pas un pro des redirections alors si quelqu'un sait comment faire je suis tout ouïe ;) ..
merci vous !
non je ne te dis pas que le doctype à quelque chose voir la dedans ;)
Mais j'en profitais juste pour te dires qu'il avait évolué (et en bien )
mais oui tu as forcément un soucis de redirection, montre ton .htaccess ?
et si tu force ton css, ça dit quoi ?
"là tu met la bonne adresse, par rapport bien sur à la page.php qui l'appel /css/bootstrap.min.css"
et déjà WEBROOT est là pour t'éviter les .../ à répétions, donc véritablement tu as un soucis avec ton chemin, je regarderais plus tard ton code en détail :) déjà tente de le "forcer à la main"
en gros tu as un soucis de redirection par ton .htaccess je "pense"
Salut,
alors en forçant l'affichage du css cela marche bien (je l'avais déjà essayé avec un css qui etait dans le tuto :) ) ...dans tous les cas voici mes fichiers .htaccess
".htaccess" fichier se trouvant au niveau de la racine du site
RewriteEngine On
RewriteRule (.*) webroot/$1 [L]
".htaccess" fichier se trouvant dans le dossier webroot
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/$1 [L]
PS : pages ici est mon controller ;)
merci encore ;)
lu,
bon et bien tu as bien "RewriteEngine On " je voyais que ça, (je suis sous MAC et sans cette ligne, cela ne fonctionnais pas chez moi)
Mais ce n'est pas le cas, alors attends qu'une personne plus expérimenté que moi passe par là
N'ayant pas fait ce tuto, je ne peux t'aider plus.
Sinon, tu as essayé simplement ce ci ? :
<link href="<?= WEBROOT; ?>css/bootstrap.css" rel="stylesheet">
au lieux de ce que tu fait :
<link rel="stylesheet" href="../../webroot/css/bootstrap.css" >
:)
Tente : un
static function webroot($url){
trim($url,'/');
return BASE_URL.'/'.$url;
}
puis un Router::url('/assets/css/bootstrap.min.css'); où Router::url('assets/css/bootstrap.min.css');
<?php
class HtmlHelper /* extends Helper */{
public static function link($text, $url){
// En y réfléchissant un peu plus par contre. :-)
echo "<a href='$url'>$text</a>";
}
public static function style($url){
echo '<link rel="stylesheet" type="text/css" href="'.$url.'">';
}
public static function script($url){
echo '<script type="text/javascript" src="'.$url.'"></script>';
}
}
HtmlHelper::link("C'est un lien", "css/style.css");
HtmlHelper::style("css/style.css");
HtmlHelper::script("js/script.js");
?>
Merci a toi cher Ramzz1994