Bonjour à tous,
Ce matin, je voulais gagner du temps et utiliser le pluggin Media de Grafikart, installation rapide etc etc... très bien fait !
Cependant, les wysiwyg ne fonctionnent pas, tinymce ne charge pas le boutton image, et ckeditor ouvre une iframe à l'adresse de mon index.
J'en conclus qu'ils ne récupèrent pas l'ID de mon formualire.
La seule modification que j'ai faite sur le pluggin est : charger les helpers directement depuis le component du plugin pour éviter à le faire dans le controller. Et elle n'est pas à l'origine du problème visiblement ^ ^
Voici mes codes sources :
<?php
echo $this->Form->create('Article');
echo $this->Form->input('id',
[
'value' => $data['Article']['id']
]
);
echo $this->Form->input('titre',
[
'class' => 'form-control',
'placeholder'=>'Titre de la page',
'label' =>'Titre',
'value' => $data['Article']['titre']
]
);
echo $this->Form->input('slug',
[
'class'=> 'form-control',
'placeholder'=>'URL de la page',
'label'=>'Slug',
'value' => $data['Article']['slug']
]
);
echo $this->Form->input('category_id',
[
'type' => 'select',
'label' => 'Catégorie',
'class' => 'form-control',
'options' => $categories,
'selected' => $data['Article']['category_id']
]
);
echo $this->Form->input('description',
[
'class'=> 'form-control',
'placeholder'=>'Description de la page',
'label'=>'Description',
'rows'=>'3',
'value' => $data['Article']['description']
]);
echo $this->Media->tinymce('content',array('label' => 'Contenu', 'type' => 'textarea'));
echo "<br>";
echo $this->Form->button('<i class="fa fa-pencil"></i> Modifier l\'article',
[
'type' => 'submit',
'class' => 'btn btn-success pull-right',
'escape' => false
]);
echo $this->Form->end();
?>
Comme vous pouvez le lire, j'ai une liaison avec category, avec une contrainte sql (ça n'a rien à voir mais je le précise au cas où
Dans mon controller :
public function gestion_editer($id = NULL){
// Charge le model Category (associé)
$this->loadModel('Category');
// Liste les champs Category.id => Category.titre
$categories = $this->Category->find('list');
// Envoie à la vue
$this->set(compact('categories'));
// ------------ DONNEES POSTEES ? { ----------------
// Si des données sont postées
if($this->dataPosted()){
// ------------ CHECK SI LES DONNES EXISTENT EN BDD ----------------
try{
if(!$this->Article->findById($this->request->data['Article']['id'])){
throw new Exception("L'article n'existe pas ou plus en base de données");
}
}
catch(Exception $e){
// Message de l'exception à log
CakeLog::write('gestion.articles.editer_erreurs', $e->getMessage());
// Message flash
$this->Session->setFlash($e->getMessage(),'alert');
// Retourne redirection
return $this->redirect(['controller'=>'articles','action'=>'index','gestion'=>true]);
}
// ------------ VALIDATION DES DONNEES ----------------
// Données validées ?
if($this->Article->validates()){
// Tentative
try{
if(!$this->Article->save($this->request->data)){
// Message flash
$this->Session->setFlash("
Une erreur est survenue lors de l'enregistrement.
L'erreur a été ajouté au journal de log.
Désolé, pour cet incident.
Si vous rencontrez des difficultés n'hésitez pas à nous contacter",'alert');
}
else{
// Message flash
$this->Session->setFlash('L\'article a bien été modifié','alert');
// Retourne redirection
return $this->redirect(['controller'=>'articles','action'=>'index','gestion'=>true]);
}
}
// Attrappe une exception
catch(Exception $e){
// Message de l'exception à log
CakeLog::write('gestion.articles.editer_erreurs', $e->getMessage());
// Message flash
$this->Session->setFlash($e->getMessage(),'alert');
// Retourne redirection
return $this->redirect(['controller'=>'articles','action'=>'index','gestion'=>true]);
}
}
// Données invalides
else{
// Message flash
$this->Session->setFlash('Attention votre formulaire contient des erreurs, respectez les consignes affichées
et publiez l\'article. Si vous rencontrez des difficultés, n\'hésitez pas à nous contacter','alert');
$data = $this->request->data;
// Renvoie les données postées
$this->set(compact('data'));
}
}
// Si aucune donnée n'est postée
else{
// Vérifie qu'un id est valide
// !!! ATTENTION redirige automatiquement lorsque la condition de la fonction ne check pas !
$this->checkID($id, ['controller'=>'articles', 'action'=>'index','gestion'=>true]);
// Si des données correspond
if($data = $this->Article->findById($id)){
$this->set(compact('data'));
}
else{
// Message flash
$this->Session->setFlash('Aucun article ne correspond à l\'id de l\'URL ! Cet article n\'existe plus ou n\'a jamais existé,
cette erreur survient généralement lorsque que vous naviguez en utilisant l\'historique de votre navigateur Web
(boutton précédant par exemple). Pour éviter ce problème, utilisez directement les les bouttons Action de l\'application.
Si vous ne parvenez pas à résoudre ce problème n\'hésitez pas à nous contacter. Merci','alert');
// Redirection
return $this->redirect(['controller'=>'articles','action'=>'index','gestion'=>true]);
}
}
}
Data posted() vérifie juste que l'id est numérique
Dans mon Model :
<?php
App::uses('AppModel', 'Model');
class Article extends AppModel {
public $actsAs = array('Containable', 'Media.Media');
public $displayField = 'slug';
/**
* belongsTo associations
* @var array
*/
public $belongsTo = [
'Category' => [
'className' => 'Category',
'foreignKey' => 'category_id',
'counterCache' => true
]
];
}
Là c'est le petit ajout dans le component, c'est pas ce qui pose soucis, je pense mais au cas où vous, je le mets aussi
public function initialize(Controller $controller, $settings = array()) {
if ($controller->name === 'CakeError') {
return;
}
$this->Controller = $controller;
// Charge les helpers, une fois
if (!isset($this->Controller->helpers['Media.Media'])) {
$this->Controller->helpers[] = 'Media.Media';
}
}
Je cherche depuis 2 bonnes heures, si je trouve je vous tiens au courant,
Merci pour votre lecture/aide
Bonsoir,
Je réponds pour ceux qui auraient ce problème à l'avenir.
Grafikart dans les helpers de son (très bon) plugin récupère l'id des articles dans les helpers à l'aide d'un input caché.
Cependant, il récupère cet id à travers this->request->data, ce qui signifie qu'il considère qu'on accède à l'action éditer par le biais d'un formulaire et non par une URL contenant un param.
Pour ceux qui utilisent, comme moi, une url pour récupérer l'id des articles à éditer, il suffit de remplacer dans le helper textarea du plugin, this->request->data[$model]'[id'] par this->params->pass [ la clé du param correspond à l'id, qui devrait être 0 pour la majorité des cas ]
je considère que vous avez filtré dans votre controller l'accès à la page.
Voilà, j'espère avoir été assez clair.