[Edit] : Ajout du support de CKEditor pour le MediaHelper

Salut à tous,

je vous mets à disposition l'adaptation du plugin Media de Grafikart pour la version 3 de CakePHP que j'ai (presque) fini.

Grafikart, j'espère que tu n'y vois pas d'inconvenients pour ça ! Sinon, tu me le dis et je le retire de mon dépôt ;)

Vous pouvez le retrouver sur mon dépôt github à cette adresse.

Il me reste encore pas mal de choses à faire :

  • finir les tests unitaires (mais le plugin fonctionne ^^);
  • ajouter des fonctions de redimentionnement, crop, flip et rotation pour les images;
  • ajouter le support des médias vidéo et audio (il est possible de les uploader mais je souhaite rajouter une fonction de lecture pour ce type de média)
  • ajouter une fonction d'édition quand on clique sur un média
  • ...

N'hésitez pas à le tester et à me faire des retours ici même ou sur github.

Bonne soirée !

Romain

29 réponses


Bonjour,

Je pense qu'il y a un bug dans la vue index avec cette ligne:

Router::url(['controller'=>'Medias','action'=>'upload',$ref,$ref_id,'?' => [ "id" => $id, 'editor'=>$editor, ]])

Il m'affiche cette erreur :

Notice (8): Undefined variable: ref_id [ROOT/vendor/romano83/cakephp3-media/src/Template/Medias/index.ctp, line 3]

J'ai trouver une solution temporaire :

$ref_id = $refId;

J'ai mit dans le controller MediasController

Merci de créer ce plugin pour la version CakePhp 3

Romano83
Auteur

Merci pour vos retours !

@Deroda normalement tinymce fonctionne. Pour ma part, je n'ai jamais eu de soucis avec même sous CakePHP 2. Le mieux c'est que tu le teste et que tu me dise si ça fonctionne ou pas.

@musicalitymaker : effectivement, il y avait ce petit bug que je n'avais pas vu avant de le mettre en ligne. C'est désormais corrigé !

Romano83
Auteur

Oui, un oubli de ma part de préciser qu'il faut charger le helper...

Par contre, peux tu me mettre le code que tu as mis car c'est difficile à dire comme ça ce qui ne va pas. Par ailleurs, tu as peut être fait un oubli d'un "s" quelque part car c'est MediasController qu'il devrait chercher... d'où l'erreur ;)

Non je n'y vois aucun inconvénient par contr dès que tu as qquechose de stable avec les tests dit le et je l'intégrerais au plugin original.

Bonjour,
Tu dit que le HelperMedia suport l'éditeur CKEditor. Est-ce que c"est normale que je voit pas la fonction dans le Helper du plugin?

Romano83
Auteur

@musicalitymaker : non c'est pas normal. J'ai juste oublié de rajouté ce fichier lors du précédent commit. Je fais ça ce soir. Désolé...
@Deroda : effectivement, tu as une erreur car j'ai mal renseigné le readme. Il faut que tu enlève les premiers crochets dans le addBehavior :

$this->addBehavior(
            'Media.Media' => [
                'path' => 'img/upload/%y/%m/%f',    // default upload path relative to webroot folder (see below for path parameters)
                'extensions' => ['jpg', 'png'],     // array of authorized extensions (lowercase)
                'limit' => 0,                       // limit number of upload file. Default: 0 (no limit)
                'max_width' => 0,                   // maximum authorized width for uploaded pictures. Default: 0 (no limitation) 
                'max_height' => 0,                  // maximum authorized height for uploaded pictures. Default: 0 (no limitation)
                'size' => 0                         // maximum autorized size for uploaded pictures (in kb). Default: 0 (no limitation)
            ]
        );

Comme ça, ça devrait fonctionner bien mieux ^^
Dis moi si tu as toujours un problème avec tinymce stp !

Romano83
Auteur

@Deroda : C'est bizarre, je ne comprends pas d'où vient cette erreur...
Peux-tu me mettre tout le code lié au plugin que tu as mis dans ton application stp ?
EDIT : je me demande si je n'aurais pas fait une erreur de frappe lors de la rédaction du readme.
Essaie de charger le behavior avec Media.Medias... On sait jamais...

@musicalitymaker : peux-tu me confirmer que tu as toi aussi la même erreur quand tu utilise le MediaHelper et tinymce ?

Je ne peux pas tester avant ce soir car je suis au boulot et j'ai pas accès à mes fichiers sources...

Romano83
Auteur

Tout me semble correct (du moins de mémoire...). Je vérifierais quand même ce soir au cas où.
As tu essayé avec Media.Medias dans le behavior ?
Sinon, oui, il faut toujours utiliser un système de brouillon comme dans le précédent plugin. Ce problème est malheureusement inhérant à tinymce...

Romano83
Auteur

OK. Je sais d'où vient le problème !!!
Il faut en fait charger le plugin comme ceci :

Plugin::load('Media', ['bootstrap' => false, 'routes' => true]);

Il ne trouvait pas le controller Medias car les routes nétaient pas chargées... Je pensais qu'en faisant un Plugin::loadAll() ça suffisait mais non...
Désolé pour le désagrément !

Romano83
Auteur

Non, je n'ai pas de fonction pour le système de brouillon mais tu peux remplacer le $this->read()(qui a effectivement disparu) par un find classique je pense...

@Romano83 : J'avais fait une mise à jour de ton plugin et plus rien ne fonctionnait. Je ne peut pas faire des teste avec l'autre editeur ckeditor. Car cakephp ne chargais pas les bonnes classe MediaHelper et le Media Behavior.

Romano83
Auteur

@musicalitymaker : et maintenant, ça fonctionne ou tu as toujours des problèmes ?

Romano83
Auteur

J'ai modifié le namespace général du plugin pour mieux réfléter le standard psr-4. C'est pour ça que depuis le composer update, il ne fonctionne plus.
Il suffit de le supprimer, mettre à jour l'autoload et de refaire un composer require romano83\cakephp3-media

Désolé pour ce désagrément...

Romano83
Auteur

Désolé de répondre aussi tardivement mais j'ai eu pas mal de boulot ces derniers jours.
En principe, le problème est corrigé.
Pour être sûr que tout soit clair au niveau de votre application, faite un composer remove romano83/cakephp3-media suivi d'un composer require romano83/cakephp3-media.
Pour le reste, la configuration du plugin ne change pas !

Si vous rencontrez d'autres problèmes (je n'espère pas^^), faites le moi savoir ;)
Encore une fois, désolé pour les problèmes que vous rencontrez...

Désolé,
Mais le plugin ne charge pas le bon controller :
Quand je fait ceci :

<?= $this->Form->create('Pictures'); ?>
<?= $this->Media->tinymce('content', 'Pictures', $this->request->session()->read('Auth.User.id')); ?>
<?= $this->Form->end(); ?>

J'arrive pour ajouter une image CakePhp me retourne une erreur :
MediaController could not be found.

Il doit charger ce controller : MediasController

Romano83
Auteur

C'est un problème de routes...
As-tu chargé le plugin en faisant Plugin::load('Media', ['bootstrap' => false, 'routes' => true]); ?

Salut, tout d'abord merci pour ton travail. J'ai tout fait comme expliqué, mais j'ai un problème. j'ai l'erreur suivante dans la fenetre iframe:

Warning (2): Invalid argument supplied for foreach() [ROOT/vendor/romano83/cakephp3-media/src/Template/Medias/index.ctp, line 16]
Code Context
include - ROOT/vendor/romano83/cakephp3-media/src/Template/Medias/index.ctp, line 16
Cake\View\View::_evaluate() - CORE/src/View/View.php, line 834
Cake\View\View::_render() - CORE/src/View/View.php, line 794
Cake\View\View::render() - CORE/src/View/View.php, line 465
Cake\Controller\Controller::render() - CORE/src/Controller/Controller.php, line 582
Cake\Routing\Dispatcher::_invoke() - CORE/src/Routing/Dispatcher.php, line 120
Cake\Routing\Dispatcher::dispatch() - CORE/src/Routing/Dispatcher.php, line 87
[main] - ROOT/webroot/index.php, line 37

Sur l'onglet "Gallery" j'ai ce problème. Si j'upload une image, ca fonctionne mais l'erreur persiste.

Romano83
Auteur

Salut,
oui je sais qu'il y a cette erreur mais c'est rien de bien grave.
Si tu quittes ta page et que tu reviens dessus, l'erreur disparait !
Je vais faire en sorte qu'elle ne s'affiche plus pour la prochaine version ;)

D'accord, merci pour ta réponse très rapide. Mais chez moi l'erreur ne disparait jamais.

Romano83
Auteur

Si tu n'as pas d'image dans la gallerie, tu auras toujours cette erreur.
Par contre à partir du moment où il y a une image, l'erreur devrait disparaître.

Tu as tout à fait raison. Merci pour ton aide très rapide.

Haha, j'allais poster la même chose. Perso en attendant, j'ai fait:

<?php if($medias):?>
                <?php foreach ($medias as $media):?>
                <?php require('media.ctp'); ?>
                <?php endforeach ?>
            <?php endif;?>
            <?php if (!empty($media)): 
                foreach ($medias as $media):
                     require('media.ctp'); 
                 endforeach 
             endif; ?>

? =P

Rebonjour,
J'ai un problème avec la fonction canUploadMedias();

Le problème viens de cette ligne :

$this->Auth->user('id')
return $this->Auth->user('role') == 'admin'; // Admins have all rights

Cakephp me retourne cette erreur :
Call to a member function user() on a non-object
J'ai bien démarré le composant Auth dans la fonction initialize(); de mon AppController.

C'est la première fois que je cette étrange erreur.

Est-ce que je suis le premier à avoir ce genre de problème

Aussi la fonction retourne cette erreur : Non-static method App\Controller\AppController::canUploadMedias() should not be called statically, assuming $this from incompatible context [ROOT/vendor/romano83/cakephp3-media/src/Controller/MediasController.php, line 23]

Bonjour.
Concernant l'erreur : Call to a member function user() on a non-object, ça vient probablement de la première ligne que tu nous montre :

$this->Auth->user('id')

Il manque le ;.
Cette ligne n'a d'ailleurs rien à faire là.
Pour la seconde erreur : Non-static method App\Controller\AppController::canUploadMedias() should not be called statically, assuming $this from incompatible context, es-tu bien sur que tu as noté :

public function canUploadMedias($model, $id)

Montres nous toute ta fonction.

@Lartak : voici ma fonction :

    public function canUploadMedias($model, $id)
    {
        if ($model === 'App\Model\Table\Users' && $id = $this->Auth->user('id')) {
            return true;
        }
        return $this->Auth->user('role') == 'admin';
    }

Bonjour,

L'erreur pour ta fonction canUploadMedias() ne signifie pas que tu as mal créé ta méthode, mais qu'elle est mal appelée. Elle est appelée sous forme statique (Controller::canUploadMedias()) alors qu'elle devrait être appelée comme ceci par l'instance de $this.
Comme c'est Cake qui se charge d'appeler totu seul cette fonction, il est fort probable que cette erreur soit liée à une autre erreur (comme la première dont tu nous parles avec les AuthComponent) et qu'en réglant cette autre erreur, tout devrait rentrer dans l'ordre.

Bonne chance,
Arkantos

Bonjour Arkantos,
Il y a cette fonction dans le MediasController :

    /**
     *
     * @param Cake\ORM\Table $ref            
     * @param int $refId            
     *
     * @return bool
     */
    public function canUploadMedias($ref, $refId)
    {
        if (method_exists('App\Controller\AppController', 'canUploadMedias')) {
            return \App\Controller\AppController::canUploadMedias($ref, $refId);
        } else {
            return false;
        }
    }

Je pense que la connection ce fait très bien entre le plugin et mon application.

Cette fonction retourne une instance de la fonction canUploadMedias si elle existe dans mon appController.

 return \App\Controller\AppController::canUploadMedias($ref, $refId);

Bonsoir,
Je lance une bouteille à la mer !
Je ne sais pas si il y a un problème au niveau du dépot mais je n'arrive pas à charger le plugin Media avec composer.
Il me renvoit l'erreur :
[InvalidArgumentException]aroundCould not find package romano83/cakephp3-media at any version for your minimum-stability (beta). Check the package spelling or your minimum-stability
J'ai essayé de changer ma valeur de minimum-stability mais rien n'y fait.
Si quelqu'un a une idée je suis preneur.
Merci d'avance
Antoine