slt les grafikarts ,
j'ai fini les tutos développer un site de A a Z,
mais j'ai un problème lors je post un nouveau article dans l'accueil normalement je récupère le dernier en premier OREDER BY id DESC
mais cela comment faire dans cet formation développer un site de A a Z?
aider moi svp 4jour de vérification sans....?
merci d’avance.
Salut.
Tu dois le placer avant le limit.
Ensuite, ça ne va pas se faire tout seul, depuis la requête que tu fais depuis la fonction du controller, tu dois définir le order, par exemple :
'order' => 'id DESC'
merci bcp Lartak11 ca marche bien
et pour les autres dans posts_controller.php
function index(){
$perPage = 4;
$this->loadModel('Post');
$condition = array(
'online' => 1,
'type'=>'post');
$d'posts'] = $this->Post->find(array(
'conditions' => $condition,
'order' => 'id DESC',
'limit' => ($perPage*($this->request->page-1)).','.$perPage
));
$d'total'] = $this->Post->findCount($condition);
$d'page'] = ceil($d'total'] / $perPage);
$this->set($d);
}
Bonsoir.
En regardant les vidéos du tutoriel tu n'as pas vu comment faire ?
Si c'est le cas, tu ne comprends pas ce que tu regardes, même en vidéo.
A la fin de cette journée vous devriez être en mesure de développer un site de A à Z, pour bien assimiler je vous propose de vous exercer en essayant de développer les fonctionnalités suivantes :
¤ Permettre l'édition de la date de création des articles
¤ Organiser les articles du plus récent au plus vieux
¤ Créer le backoffice pour les pages
¤ Bonus : Créer un système de catégories pour les articles
J'ai mis ces fonctionnalités dans les sources, donc vous pourrez vérifier votre démarche en regardant le code source final. Ne trichez pas essayez de le faire sans les sources :) .
Source : Tutoriel vidéo PHP : Développer un site de A à Z : Jour 7, Authentification
Voici mes fichier
Controller.php
<?php
class Controller {
public $request; // Objet Request
private $vars = array(); // Variables à passer à la vue
public $layout = 'default'; // Layout à utiliser pour rendre la vue
private $rendered = false; // Si le rendu a été fait ou pas ?
/**
* Constructeur
* @param $requet Objet requet de notre application
**/
function __construct($request = null) {
$this->Session = new Session();
$this->Form = new Form($this);
if($request){
$this->request = $request; // on stock la request dans l'instatced
require ROOT.DS.'config'.DS.'hook.php';
}
}
/**
* Permet de rendre une vue
* @param $view Fichier à rendre (chemin depuis view ou nom de la vue)
**/
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;
}
/**
* Permet de passer une ou pluisieur variable à la vue
* @param $key nom de la variable ou tableau de variables
* @param $value Valeur de la variable
**/
public function set($key,$value=null) {
if(is_array($key)) {
$this->vars += $key;
}else{
$this->vars$key] = $value;
}
}
/**
* Permet de charger un model
**/
function loadModel($name){
if(!isset($this->$name)){
$file = ROOT.DS.'model'.DS.$name.'.php';
require_once($file);
$this->$name = new $name();
if(isset($this->Form))
$this->$name->Form = $this->Form;
}
}
/**
* Permet de gérer les erreurs 404
**/
function e404($message){
header("HTTP/1.0 404 Not found");
$this->set('message',$message);
$this->render('/errors/404');
die();
}
/**
* permet d'appeler un controller depuis une vue
**/
function request ($controller,$action){
$controller .= 'Controller';
require_once ROOT.DS.'controller'.DS.$controller.'.php';
$c = new $controller();
return $c->$action();
}
/**
* redirect
**/
function redirect ($url,$code = null ){
if($code == 301){
header("HTTP/1.1 301 Moved Permanently");
}
header("location: ".Router::url($url));
}
}
et voila le fichier
Model.php
<?php
class Model{
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public $primaryKey = 'id';
public $id;
public $errors = array();
public $form;
public function __construct(){
//j'initialise quelque variable
if($this->table=== false){
$this->table = strtolower(get_class($this)).'s';
}
// Jme connect a la base
$conf = Conf::$databases$this->conf];
if(isset(Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}
try{
$pdo = new PDO(
'mysql:host='.$conf'host'].';dbname='.$conf'database'].';',
$conf'login'],
$conf'password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections$this->conf] = $pdo;
$this->db = $pdo;
}catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
public function find($req = array()){
$sql = 'SELECT ';
if(isset($req'fields'])){
if(is_array($req'fields'])){
$sql .= implode(', ',$req'fields']);
}else{
$sql .= $req'fields'];
}
}else{
$sql.='*';
}
$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
//contruction de la condition
if(isset($req'conditions'])){
$sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = '"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
if(isset($req'limit'])){
$sql .= 'LIMIT '.$req'limit'];
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req){
return current($this->find($req));
}
public function findCount($conditions){
$res = $this->findFirst(array(
'fields' => 'COUNT('.$this->primaryKey.') as count',
'conditions' => $conditions
));
return $res->count;
}
public function delete($id){
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id";
$this->db->query($sql);
}
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = $v;
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->$key) && !empty($data->$key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
} else{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId();
}
}
}
Et en lisant la fonction find dans Model.php tu ne vois pas comment y apporter un ajout de code pour qu'elle prenne l'ordre en supplément quand tu le demande depuis un controller ?
Pour l'instant dans ta fonction find, tu as :
<u>fields</u>
pour les champs de SELECT- <u>conditions</u>
pour le WHERE- <u>limit</u>
pour LIMITIl ne te reste plus qu'à faire <u>order</u> par exemple pour ORDER BY.
Par exemple avec un simple :
if(isset($req'order'])){
$sql .= ' ORDER BY '.$req'order'];
}
sl, Lartak11 tu me demande de faire comme ca
voila j'ai faie se que tu me demande
mais sans résultat :
<?php
class Model{
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public $primaryKey = 'id';
public $id;
public $errors = array();
public $form;
public function __construct(){
//j'initialise quelque variable
if($this->table=== false){
$this->table = strtolower(get_class($this)).'s';
}
// Jme connect a la base
$conf = Conf::$databases$this->conf];
if(isset(Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}
try{
$pdo = new PDO(
'mysql:host='.$conf'host'].';dbname='.$conf'database'].';',
$conf'login'],
$conf'password'],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
Model::$connections$this->conf] = $pdo;
$this->db = $pdo;
}catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}else{
die('Impossible de se connecter à la base de donnée');
}
}
}
public function find($req = array()){
$sql = 'SELECT ';
if(isset($req'fields'])){
if(is_array($req'fields'])){
$sql .= implode(', ',$req'fields']);
}else{
$sql .= $req'fields'];
}
}else{
$sql.='*';
}
$sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
//contruction de la condition
if(isset($req'conditions'])){
$sql .= 'WHERE ';
if(!is_array($req'conditions'])){
$sql .= $req'conditions'];
}else{
$cond = array();
foreach($req'conditions'] as $k=>$v){
if(!is_numeric($v)){
$v = '"'.mysql_escape_string($v).'"';
}
$cond] = "$k=$v";
}
$sql .= implode(' AND ',$cond);
}
}
if(isset($req'limit'])){
$sql .= 'LIMIT '.$req'limit'];
}
if(isset($req'order'])){
$sql .= ' ORDER BY '.$req'order'];
}
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req){
return current($this->find($req));
}
public function findCount($conditions){
$res = $this->findFirst(array(
'fields' => 'COUNT('.$this->primaryKey.') as count',
'conditions' => $conditions
));
return $res->count;
}
public function delete($id){
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id";
$this->db->query($sql);
}
public function save($data){
$key = $this->primaryKey;
$fields = array();
$d = array();
foreach($data as $k=>$v){
if($k!=$this->primaryKey){
$fields] = "$k=:$k";
$d":$k"] = $v;
}elseif(!empty($v)){
$d":$k"] = $v;
}
}
if(isset($data->$key) && !empty($data->$key)){
$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
$this->id = $data->$key;
$action = 'update';
} else{
$sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
$action = 'insert';
}
$pre = $this->db->prepare($sql);
$pre->execute($d);
if($action == 'insert'){
$this->id = $this->db->lastInsertId();
}
}
}