Plugin Media pour CakePHP 3

Par Romano83, il y a 10 ans


[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 :

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

Bonne soirée !

Romain

29 réponses

ahgraphic, il y a 9 ans

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

Grafikart, il y a 10 ans

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.

lakamark, il y a 10 ans

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, il y a 10 ans

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, il y a 10 ans

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 ;)

lakamark, il y a 10 ans

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, il y a 10 ans

@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, il y a 10 ans

@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, il y a 10 ans

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, il y a 10 ans

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, il y a 10 ans

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...

lakamark, il y a 10 ans

@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, il y a 10 ans

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

Romano83, il y a 10 ans

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...

Natan Vbb, il y a 10 ans

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;?>
Romano83, il y a 10 ans

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...

lakamark, il y a 10 ans

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, il y a 10 ans

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

Natan Vbb, il y a 10 ans

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

Romano83, il y a 10 ans

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.

Natan Vbb, il y a 10 ans

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

Natan Vbb, il y a 10 ans

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, il y a 10 ans

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 ;)

Alexandre #lbac, il y a 10 ans
<?php if (!empty($media)): foreach ($medias as $media): require('media.ctp'); endforeach endif; ?>

? =P

lakamark, il y a 10 ans

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]

Lartak, il y a 10 ans

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.

lakamark, il y a 10 ans

@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'; }
Arkantos, il y a 10 ans

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

lakamark, il y a 10 ans

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);