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

1 réponse


Tango-charly
Auteur
Réponse acceptée

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.