Salut à toutes et à tous!
Je viens d'attaquer le jour 3 du tuto cakephp et quasi au début j'ai un problème avec le brouillon.
Quand je clique sur le bouton ajouter une page, j'ai bien le brouillon qui se créé par contre quand je l'édite et que je clique sur envoyer, rien ne se passe. C'est à n'y rien comprendre...
[info] : Au passage, vous remarquerez dans mes codes que j'utilise "post" au lieu de "page", car dans mon cas je n'ai pas besoin de créer des pages dynamiquement.
Voici mes codes:
modèle Post.php
<?php
class Post extends AppModel{
public $validate = array(
'slug' => array(
'rule' => '/^[a-z0-9\-]+$/',
'allowEmpty' => true,
'message' => "L'URL n'est pas valide"
),
'name' => array(
'rule' => 'notEmpty',
'message' => "Vous devez préciser un titre"
),
'content' => array(
'rule' => 'notEmpty',
'message' => "Vous devez entrer votre contenu"
)
);
// Permet de générer/récupérer un brouillon
public function getDraft($type){
$post = $this->find('first', array(
'conditions' => array('online' => -1,'type' => $type)
));
if (empty($post)) {
$this->save(array(
'type'=> $type,
'online'=> -1
),false);
$post = $this->read();
}
$post'Post']'online'] = 0;
debug($post);
// return $post;
}
public function afterFind($data){
foreach ($data as $k => $d) {
if (isset($d'Post']'slug']) && isset($d'Post']'id'])) {
$d'Post']'link'] = array(
'controller' => 'posts',
'action' => 'show',
'slug' => $d'Post']'slug'],
'id' => $d'Post']'id']
);
}
$data$k] = $d;
}
return $data;
}
public function beforeSave(){
if (empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name'])) {
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'],'-'));
}
return true;
}
}
PostsController.php
// Je ne met que la function edit() qui semble être la source du problème
function admin_edit($id=null){
if ($this->request->is('put') || $this->request->is('post')) {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash('Le post a bien été édité','notif');
$this->redirect(array('action'=>'index'));
}
}elseif($id){
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}else{
$this->request->data = $this->Post->getDraft('post');
}
}
admin_edit.ctp (au cas où)
<h1>Editer un post</h1>
<?php echo $this->Form->create('Post'); ?>
<?php echo $this->Form->input('name',array('label'=>'Titre')); ?>
<?php echo $this->Form->input('slug',array('label'=>'URL')); ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->input('type',array('value'=>'post','type'=>'hidden')); ?>
<?php echo $this->Form->input('content',array('label'=>'Contenu')); ?>
<?php echo $this->Form->input('online',array('label'=>'Mettre en ligne','type'=>'checkbox')); ?>
<?php echo $this->Form->end('Envoyer'); ?>
<?php
// Second param 'inline' siginifie que script ne sera pas affiché mais stocké dans une variable $scripts_for_layout
?>
<?php $this->Html->script('tiny_mce/tiny_mce.js',array('inline'=>false)); ?>
<?php $this->Html->scriptStart(array('inline'=>false)); ?>
tinyMCE.init({
mode : 'textareas',
theme: 'advanced',
plugins: 'inlinepopups,paste,advimage,image',
theme_advanced_buttons1 : 'bold,italic,underline,|,bullist,nimlist,|,justifyleft,justifycenter,justifyright,justifyfull,|,link,unlink,image,|,formatselect,code',
theme_advanced_buttons2 : '',
theme_advanced_buttons3 : '',
theme_advanced_buttons4 : '',
theme_advanced_resizing : true,
paste_remove_styles : true,
paste_remove_spans : true,
paste_strip_class_attributes : "all",
image_explorer : '<?php echo $this->Html->url(array('controller'=>'medias','action'=>'index',$this->request->data'Post']'id'])); ?>',
image_edit : '<?php echo $this->Html->url(array('controller'=>'medias','action'=>'show')); ?>',
relative_urls : false,
content_css : '<?php echo $this->Html->url('/css/cake.generic.css'); ?>'
});
function send_to_editor(content){
var ed = tinyMCE.activeEditor;
ed.execCommand('mceInsertContent',false,content);
}
<?php $this->Html->scriptEnd(); ?>
Voilà pour les codes. J'ai fait des tests comme suit. Si j'édite un post existant (http://localhost/cakephp/admin/posts/edit/1), l'action sur le bouton d'envoie fonctionne, je suis renvoyé à la page des post et l'update a été effectué. Si j'édite mon brouillon (http://localhost/cakephp/admin/posts/edit/10), l'action sur le bouton d'envoi n'a aucun effet, le bouton s'enfonce mais la page ne recharge pas, ni ne redirige, ni ne fait d'update.
Merci beaucoup pour votre aide, je suis bloqué!
Salut Livin,
Il te manque l'appel de ta fonction au début de ton formulaire
au lieu de :
<?php echo $this->Form->create('Post'); ?>
Il te faut :
<?php echo $this->Form->create('Post',array('url'=>array('action'=>'admin_edit')));?>
Salut coloo, merci pour ton aide.
Je viens de rajouter l'appel à la fonction et ça n'a rien changé, toujours le même problème.
Quand je clique sur envoyer, rien ne bouge.
Ca doit forcément être un petit truc de rien du tout mais je vois pas d'où ça vient.
Salut, ses peut-etre parceque dans PostController tu n'envoie pas a la vue..
$this->set($d);
Ma fonction admin_edit si sa peut t'aider.
function admin_edit($id = null){
if($this->request->is('put') || $this->request->is('post')){
if($this->Post->save($this->request->data)){
$this->Session->setFlash("Le contenu a bien été édité","notif");
$this->redirect(array('action'=>'index'));
}
}elseif($id){
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}else{
$this->request->data = $this->Post->getDraft('post');
}
$d'categories'] = $this->Post->Category->find('list');
$this->set($d);
}
Salut sly et merci pour ton intérêt
Je viens d'essayer avec les 2 dernières lignes de ta fonction admin_edit, juste après le else, et j'ai une erreur. Normal il fait un find pour les category, j'en suis pas encore là dans le tuto, je suis tout juste au début.
Donc toujours au même point :(
Par contre ton modèle est-il différent du mien que j'ai posté plus haut?
Je suis sûr qu'il manque un truc de rien du tout!!! Ahhhhhhhh, hehe
Merci d'avance pour ton aide
Si t'enleve le find des categorie, tu met que
$this->set($d);
Regarde ta fonction beforeSave tu as une accolade "{" en trop.
a la fin de cette ligne
if (empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name'])) {
Voici le miens :
public function beforeSave(){
if(empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name']))
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'],'-'));
return true;
}
et ton return true; de ta function beforeSave et placer avant l'accolade de fermeture.
Compare ta fonction a celle que je vien de te mettre
Merci sly, je vais regarder ça et je te tiens au jus.
Merci beaucoup pour ton aide
Je viens de lire ce que tu m'as répondu.
L'accolade en trop n'est pas vraiment en trop, en fait en php tu peut abbréger tes conditions sans accolades comme l'a fait Grafikart. Dans mon cas je préfère les mettre pour me repérer dans mon code. Mon return est bien au bon endroit, après ma condition.
Concernant le fait d'envoyer à la vue "$this->set($d);" ça n'a aucun intérêt vu que "$this->Post->getDraft('post');" va lire les données envoyées par la fonction getDraft dans le modèle Post et les placer dans le formulaire. Donc $d n'existe pas! C'est getDraft qui envoie les données.
Merci quand même.
Retour à la case départ... :)
ok desolé, effectivement je suis débutant, désolé de ne pas avoir pu t'aider plus que sa.... bon courage
c'est pas grave,merci d'avoir essayé en tout cas ;)
Si quelqu'un passe par là (Coloo? hehe) et a une idée de l'erreur merci de me dépanner.
Je recommence à zéro à partir du jour 1, ça peut que m'aider.
Euh poivron;
Normal que le return dans la fonction get draft (qu'il y a dans ton modèle) est commenté ?
Je vais essayer de t'aider mais je n'ai pas fait ce tuto :) et vu que je bidouille plutôt qu'autre chose :') ça va être marrant ^^
Salut Coloo, c'est sympas de regarder merci! :)
J'avais commenté le return pour faire un debug et j'ai posté sans
décommenté ^^, mais même avec ça ne fonctionne pas
Aujourd'hui je vais refaire les tutos voir où j'au pu faire l'erreur
et je te tiens au courant.
Salut, la j'avoue que c'est bizarre ton histoire.
peux tu placer un
debug($this->request->data);
a la fin de ta fonction admi_edit, et nous poster le résultat?
je de passe ma fonction complete qui fonctionne chez moi, mais il y a pas de différences a mes yeux:
public function admin_edit($id = null) {
$this->helpers] = 'Media.Uploader';
if ($this->request->is('post') || $this->request->is('put')) {
if($this->Post->save($this->request->data)){
$this->Session->setFlash('l\'article a été mis a jour.','notif');
$this->redirect(array('action'=>'index'));
}
}elseif($id){
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}else{
$this->request->data = $this->Post->getDraft('post');
}
$d'categories'] = $this->Post->Category->find('list');
$this->Post->PostTag->contain('Tag');
$d'tags'] = $this->Post->PostTag->find('all',array(
'conditions' => array('PostTag.post_id' => $id)
));
$this->set($d);
//Ajoute un debug($this->request->data); ici
debug($this->request->data);
}
ça devrais nous en dire plus sur ce qu'il se passe au moment de l'envoi.
salut justclara42 et merci pour ton aide!
Voici le résultat de mon debug($this->request->data); que j'obtiens lorsque je clique sur créer un nouveau post :
array(
'Post' => array(
'id' => '17',
'name' => '',
'slug' => '',
'content' => '',
'type' => 'post',
'created' => '2013-04-09 13:14:17',
'online' => (int) 0,
'link' => array(
'controller' => 'posts',
'action' => 'show',
'slug' => '',
'id' => '17'
)
)
)
J'aimerai pouvoir faire un debug lorsque j'enregistre ce nouveau post en cliquant sur envoyer mais c'est justement là le problème,
j'ai beau appuyer sur le bouton d'envoi de mon formulaire, rien ne se passe. Je comprend pas pourquoi le bonton ne fonctionne pas.
Salut, la c'est space, essai sans charger tinyMCE dans ta vue, juste avec un textarea simple.
dans mon système de commentaire, j'ai se souci aussi, et sans tinyMCE, ben l'envoi se fait.
c'est une piste a explorer.
la je vois que ça, car j'ai recontrollé tous ton code que tu as mis, j'ai la meme chose, et chez moi ça marche, la seule différence, c'est que je passe par CKEditor.
Salut Clara, en effet c'est bien tinyMCE qui créé le problème!
C'est vraiment pas cool, j'y connais rien en javascript! ^^
Bon ben si quelqu'un pass par là et a une idée d'où le problème se situe dans la partie js, ça risquera d'en sauver d'autres comme Clara et moi.
Sinon tant pis, je ferais sans. Par contre je suis intéressé par CKEditor pour la seule raison qu'il est plus design. Comment tu as fait pour gérer les médias? Du moins si tu uploade une image sur ton serveur, tu fais comment? J'ai essayé d'intégrer CKEditor après avoir eu mon pb mais je n'y suis pas arrivé, je serais aussi intéressé de savoir comment tu as fait Clara. Ca fait beaucoup de choses :)
Merci pour ton aide en tout cas, je sais enfin qui est le coupable! ^^
y a peut-être un problème de :
salut LivinInChina pour CKEditor, je passe via un helper.
demain je regarde tous ça avec aussi la configuration pour les médias via CKFinder.
Mais faut aussi que je cherche pourquoi TinyMCE fait planter le système.
Salut à vous!
@Coloo: je regarderai ça demain. A priori il ne devrait pas y avoir de problème avec le chemin js sachant que tout fonctionne sauf à cet endroit. Pour le conflit c'est possible, je n'utilise que le script de tinyMCE pour l'instant sans autre script, à vérifier.
@Clara: ça m'intéresse de voir comment tu as fait pour CKFinder. Par contre ça doit être pas mal différent pour configurer les médias avec ce wysiwyg comme l'a fait Grafikart.
bon alors, je viens de regarder, je me souvenais plus que c'etais assez simple lol
voici mon Helper (CkHelper.php)
<?php
class CkHelper extends AppHelper {
var $helpers = Array('Html', 'Js');
function load($id) {
$did = '';
foreach (explode('.', $id) as $v) {
$did .= ucfirst($v);
}
// appel de CKEDITOR et CKFINDER avec configuration par dŽfaut.
$code = "var editor = CKEDITOR.replace( '".$did."');";
$code .= "CKFinder.setupCKEditor(editor, '/js/ckfinder');";
return $this->Html->scriptBlock($code);
}
}
ensuite, il te faut télécharger ckeditor, et ckfinder, et place les dans le dossier JS de Webroot.
après dans ckfinder, edite le fichier "config.php", il faut y ajouter le chemin au tu veux uploader tes médias,
mais il faut aussi activer les session, voici les infos que j'ai ajouté dans config.php:
<?php
/*
* ### CKFinder : Configuration File - Basic Instructions
*
* In a generic usage case, the following tasks must be done to configure
* CKFinder:
* 1. Check the $baseUrl and $baseDir variables;
* 2. If available, paste your license key in the "LicenseKey" setting;
* 3. Create the CheckAuthentication() function that enables CKFinder for authenticated users;
*
* Other settings may be left with their default values, or used to control
* advanced features of CKFinder.
*/
/**
* This function must check the user session to be sure that he/she is
* authorized to upload and access files in the File Browser.
*
* @return boolean
*/
//function CheckAuthentication()
//{
// WARNING : DO NOT simply return "true". By doing so, you are allowing
// "anyone" to upload and list the files in your server. You must implement
// some kind of session validation here. Even something very simple as...
// return isset($_SESSION'IsAuthorized']) && $_SESSION'IsAuthorized'];
// ... where $_SESSION'IsAuthorized'] is set to "true" as soon as the
// user logs in your system. To be able to use session variables don't
// forget to add session_start() at the top of this file.
//return false;
//}
// Start CakePHP Session
session_name("CAKEPHP");
session_start();
/*
* ### CKFinder : Configuration File - Basic Instructions
*
* In a generic usage case, the following tasks must be done to configure
* CKFinder:
* 1. Check the $baseUrl and $baseDir variables;
* 2. If available, paste your license key in the "LicenseKey" setting;
* 3. Create the CheckAuthentication() function that enables CKFinder for authenticated users;
*
* Other settings may be left with their default values, or used to control
* advanced features of CKFinder.
*/
/**
* This function must check the user session to be sure that he/she is
* authorized to upload and access files in the File Browser.
*
* @return boolean
*/
function CheckAuthentication() //Partie pour verifier l'authentification.
{
if( isset($_SESSION'Auth']'User']) )
{
return true;
}
return false;
}
// LicenseKey : Paste your license key here. If left blank, CKFinder will be
// fully functional, in demo mode.
$config'LicenseName'] = '';
$config'LicenseKey'] = '';
/*
Uncomment lines below to enable PHP error reporting and displaying PHP errors.
Do not do this on a production server. Might be helpful when debugging why CKFinder does not work as expected.
*/
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
/*
To make it easy to configure CKFinder, the $baseUrl and $baseDir can be used.
Those are helper variables used later in this config file.
*/
/*
$baseUrl : the base path used to build the final URL for the resources handled
in CKFinder. If empty, the default value (/userfiles/) is used.
Examples:
$baseUrl = 'http://example.com/ckfinder/files/';
$baseUrl = '/userfiles/';
ATTENTION: The trailing slash is required.
*/
$baseUrl = '/files/'; //ICI, tu indique le nom du dossier de destination de tes fichiers.
/*
$baseDir : the path to the local directory (in the server) which points to the
above $baseUrl URL. This is the path used by CKFinder to handle the files in
the server. Full write permissions must be granted to this directory.
Examples:
// You may point it to a directory directly:
$baseDir = '/home/login/public_html/ckfinder/files/';
$baseDir = 'C:/SiteDir/CKFinder/userfiles/';
// Or you may let CKFinder discover the path, based on $baseUrl.
// WARNING: resolveUrl() *will not work* if $baseUrl does not start with a slash ("/"),
// for example if $baseDir is set to http://example.com/ckfinder/files/
$baseDir = resolveUrl($baseUrl);
ATTENTION: The trailing slash is required.
*/
//$baseDir = resolveUrl($baseUrl);
//$baseDir = realpath(dirname( __FILE__ ).'/../../').$baseUrl;
$baseDir = '/chemin/vers/le/dossier/app/webroot/'.$baseUrl; //C'est ici qu'il faud indiquer le chemin vers webroot.
Ensuite, dans ton layout (défaut.ctp) ajoute:
echo $this->Html->script(
array(
'https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js',
'ckeditor/ckeditor.js',
'ckfinder/ckfinder.js'
)
);
et enfin, dans tes vues add.ctp, et édit.ctp, tu dois ajouter ceci:
<?php echo $this->Form->input('Post.body', array('label'=>false, 'cols'=>'1', 'rows'=>'1'));?>
<?php echo $this->Ck->load('Post.body');?>
la normalement, tu as ton éditeur, et ta gestion de fichiers intégré.