Bonjour,
Suivant le tuto faire une site en cakePHP.
voici la partie Controller :
// Controller/PagesController générer par défaut !
<?php
/**
* Static content controller.
*
* This file will render views from views/pages/
*
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @package app.Controller
* @since CakePHP(tm) v 0.2.9
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
App::uses('AppController', 'Controller');
/**
* Static content controller
*
* Override this controller by placing a copy in controllers directory of an application
*
* @package app.Controller
* @link http://book.cakephp.org/2.0/en/controllers/pages-controller.html
*/
class PagesController extends AppController {
/**
* This controller does not use a model
*
* @var array
*/
public $uses = array();
/**
* Displays a view
*
* @param mixed What page to display
* @return void
* @throws NotFoundException When the view file could not be found
* or MissingViewException in debug mode.
*/
public function display() {
$path = func_get_args();
$count = count($path);
if (!$count) {
return $this->redirect('/');
}
$page = $subpage = $title_for_layout = null;
if (!empty($path[0])) {
$page = $path[0];
}
if (!empty($path[1])) {
$subpage = $path[1];
}
if (!empty($path$count - 1])) {
$title_for_layout = Inflector::humanize($path$count - 1]);
}
$this->set(compact('page', 'subpage', 'title_for_layout'));
try {
$this->render(implode('/', $path));
} catch (MissingViewException $e) {
if (Configure::read('debug')) {
throw $e;
}
throw new NotFoundException();
}
}
}
// Controller/PostsController :
<?php
class PostsController extends AppController
{
public $helpers = array('Html', 'Form', 'Session');
public $components = array('Session');
public function index()
{
$this->set('posts', $this->Post->find('all'));
}
public function view($id)
{
if (!$id)
{
throw new NotFoundException(__('Post invalide'));
}
$post = $this->Post->findById($id);
if (!$post)
{
throw new NotFoundException(__('Post invalide'));
}
$this->set('post', $post);
}
et la partie Model :
// Model/Post :
<?php
class Post extends AppModel
{
public function beforeSave($options = array())
{
if(empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'title']))
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'title'],'-'));
return true;
}
}
J'ai utilisé le controller PostsController pour mes fonctions : add, édit, delete, mais je ne comprends pas pourquoi ne pas utiliser le Model Page ainsi que le Controller PagesController, pour les actions liée au pages ?
J'espère avoir été assez clair, en gros j'aurais bien voulus séparer les Model Page et Post, hors ici je met la définition des slug dans post... J'aurais aimer dans page et comme ça dans Page, je peut aussi mettre tous ce qui concerne la pagination, les slug etc. Est ce propre ?
merci à tous,
J'ai utilisé le controller PostsController pour mes fonctions : add, édit, delete, mais je ne comprends pas pourquoi ne pas utiliser le Model Page ainsi que le Controller PagesController, pour les actions liée au pages ?
Si
J'espère avoir été assez clair, en gros j'aurais bien voulus séparer les Model Page et Post, hors ici je met la définition des slug dans post... J'aurais aimer dans page et comme ça dans Page, je peut aussi mettre tous ce qui concerne la pagination, les slug etc. Est ce propre ?
Alors on peut voir 2 choses ici :
la méthode n'est pas assez générique :
<?php
class AppModel extends Model
{
public function beforeSave($options = array())
{
if(empty($this->data$this->alias]'slug']) && isset($this->data$this->alias]'slug']) && !empty($this->data$this->alias]'title']))
$this->data$this->alias]'slug'] = strtolower(Inflector::slug($this->data$this->alias]'title'],'-'));
return true;
}
}
dans ton Model Page, tu peux overrider la méthode beforeSave, soit en ajoutant des éléments, soit en réécrivant totalement la méthode.
<?php
class Post extends AppModel
{
// solution 2 : ajout d'un element, mais le beforeSave de AppModel sera lancé
public function beforeSave($options = array())
{
parent::beforeSave()
$this->data$this->alias]'name'] = "coucou"; // tous tes name auront la même valeur.
return true
}
// solution 2 : override complet de la méthode
public function beforeSave($options = array())
{
$this->data$this->alias]'slug'] = "coucou"; // tous tes slugs auront la même valeur.
return true
}
}
Ta méthode utilise l'index Post dans le tableau. Hors pour le Model Page, ça sera l'index Page, pour un Model User, ça sera l'index User, ... Donc avec ta méthode, tu vas devoir réécrire le beforeSave. La solution que je te propose est Prefix independant, $this->alias va lui même faire le lien avec le bon Model.
Je ne comprends pas l'histoire du link.
Salut et merci prbaron pour ton aide,
Cependant je débute et je ne vois pas où tu veux en venir avec le fait que ma fonction ne soit pas assez générique, car je souhaite juste intervenir sur le slug ?
Dans tes exemples, du coup, je suis un peu bloqué avec le même slug pour tous mes posts/liens, ou alors je ne comprends pas ?
J'aimerais avoir un slug différent pour chaque post et surtout bien séparer mes posts de mes pages. je parle d'avoir un Controller Posts et Pages, ainsi qu'un Model Page et Post. (le tout avec un code ré utilisable dans d'autres projets)
je ne sais pas si je suis bien clair, désolé. :(
mais pour apprendre et comprendre le MVC je souhaite tout séparer (même si dans le tuto de grafikart, ce n'est pas nécessaire, un post n'est finalement qu'une "page")
du coup dans ce même tuto tout est combiné et je ne m'en sors pas pour tout séparer.
De plus, la "combine" du link est cool (j'ai bien compris l'intérêt => avoir le plus d'abstraction possible, pour modifier le code) mais me bloque pour le Model Post...
voilà
lu,
link est créer pour éviter de mettre la clef 'Post' et de ce trimbaler tout l'adressage :)
public function afterFind($data, $primary = false)
{
foreach($data as $k=>$d)
{
if(isset($d'Post']'slug']) && isset($d'Post']'id']))
{
$d'Post']'link'] = array(
'controller' => 'pages',
'action' => 'show',
'id' => $d'Post']'id'],
'slug' => $d'Post']'slug']
);
}
$data$k] = $d;
}
return $data;
}
Merci pour tes infos, je vais tenté de comprendre tout ça et voir comment m'en sortir.