Utilisation de mon plugin

Par jey1985, il y a 8 ans


Bonjour,

J'essaie de creer mon premier plugin donc j'ai extrait tout mon code pour le regrouper dans la structure d'un plugin que j'ai appelé : Wall

J'ai utilisé la console cake pour générer la structure du plugin dont voici la liste des fichiers à plats:

Wall/Controller
Wall/Controller/ActusesController.php
Wall/Controller/CommentsController.php
Wall/Controller/LikesController.php
Wall/Controller/WallAppController.php
Wall/Model/Actus.php
Wall/Model/Comment.php
Wall/Model/Like.php
Wall/Model/WallAppModel.php
Wall/View/Actuses
Wall/View/Actuses/add.ctp
Wall/View/Actuses/edit.ctp
Wall/View/Actuses/index.ctp
Wall/View/Actuses/view.ctp
Wall/webroot/js/empty
Wall/webroot/js/wall.js

Dans mon bootstrap.php de l'application principale je load mon plugin comme ceci:
CakePlugin::load('Wall', array('bootstrap' => false, 'routes' => false));

Mais maintenant je ne sais pas comment l'utiliser ... j'aimerais creer un lien qui me permettrait de voir la vue index() de mon ActusesController.php

J'ai essayé ceci:
echo $this->Html->link(__('Actus'), array('controller' => 'Actuses', 'action' => 'index', 'plugin' => 'Wall'));

Mais j'obtiens l'erreur suivante:
Error: WallController could not be found.aroundaroundError: Create the class WallController below in file: app\Controller\WallController.php

Avez vous une idée ??
merci d'avance

20 réponses

romses, il y a 8 ans

Déjà il faut créer un repertoire Config dans ton plugin qui contiens le fichier routes.php

contenant ceci:

<?php namespace Wall\Routing\Routes; use Cake\Routing\Router; use Cake\Routing\Route\DashedRoute; Router::plugin( 'Wall', ['path' => '/wall'], function ($routes) { $routes->fallbacks(DashedRoute::class); } );

puis ton AppController du plugin doit resemblé à ceci

<?php namespace Wall\Controller; use App\Controller\AppController as BaseController; use Cake\Event\Event; use Cake\Controller\Controller; class AppController extends BaseController { public function initialize() { parent::initialize(); $this->loadComponent('Flash'); } }

déjà essaye ceci

jey1985, il y a 8 ans

Bonjour,
je viens d'essayer et j'obtiens la même erreure.

Voici le code des controllers actuels:
WallAppcontroller.php

<?php App::uses('AppController', 'Controller'); class WallAppController extends AppController { } ?>

ActusesController.php

<?php App::uses('WallAppController', 'Wall.Controller'); /** * Actuses Controller */ class ActusesController extends WallAppController { /** * Scaffold * * @var mixed */ public $scaffold; } ?>

AppController.php

<?php namespace Wall\Controller; use App\Controller\AppController as BaseController; use Cake\Event\Event; use Cake\Controller\Controller; class AppController extends BaseController { public function initialize() { parent::initialize(); $this->loadComponent('Flash'); } } ?>
romses, il y a 8 ans

pour le controller Wall\src\Controller\ActusesController
fais ceci:

<?php namespace Wall\Controller; use Wall\Controller\AppController; class ActusesController extends AppController { /** * Scaffold * * @var mixed */ public $scaffold; } ?>
romses, il y a 8 ans

Ok je vois
essaye ceci:

<?php App::uses('AppController', 'Controller'); class WallAppController extends AppController { public $helpers = array('Wall.Wall'); } ?>
jey1985, il y a 8 ans

Je tombe encore sur:

Missing Controller Error: WallController could not be found. Error: Create the class WallController below in file: app\Controller\WallController.php <?php class WallController extends AppController { }
jey1985, il y a 8 ans

Pour info si je charge le plugin comme ceci:
CakePlugin::load('Wall', array('bootstrap' => false, 'routes' => true));
avec les routes à true, je tombe sur une erreur différente:

Fatal Error Error: Class 'Cake\Routing\Router' not found File: I:\PERSO\WEB\cakephp2.9\app\Plugin\Wall\Config\routes.php Line: 6 Notice: If you want to customize this error message, create app\View\Errors\fatal_error.ctp

Existe til une doc détaillé sur l'utilisation des plugins ? car sur le site de CakePHP je trouve que pour l'utilisation c'est pas trés explicite, par exemple les options routes et bootstrap je ne sais pas à quoi elles servent..

romses, il y a 8 ans

le fichier route permet de filter et de rediriger les requettes vers la bonne ressource. le Boostrap quand a lui charge les fichiers necessaires à la config de ton appli.

romses, il y a 8 ans

essaye de charcger le plugin seul CakePlugin::load('Wall', array('bootstrap' => true));

jey1985, il y a 8 ans

J'ai fait ceci:
CakePlugin::load('Wall');
car je n'ai psa de fichier bootstrap.php dans mon plugin
et je tombe sur la même erreur.
Il cherche toujours ce foutu controller WallController.php alors que je n'ai que WallAppController.php

Lartak, il y a 8 ans

Bonjour.
C'est normal que tu aies l'erreur Class 'Cake\Routing\Router' not found, étant donné que le code pour le routing que t'a proposé romses n'est valable que pour la V3 de CakePHP.
Commences donc par adapter ce qu'il t'a proposé avec la syntaxe pour la V2 de CakePHP.

jey1985, il y a 8 ans

Bonjour,
Désolé mais à part mettre ceci : App::uses('CakeRoute', 'Routing/Router');
pour le reste je ne vois pas comment le traduire en V2, sachant que je ne comprend pas le but du code et je ne trouve aucune doc sur ça

jey1985, il y a 8 ans

Salut,
oui tout à fait, mais il à l'air de le chercher dans app/Controller au lieu de Plugin/Wall/Controller
Je vais essayer de recommencer tout du début.

J'ai donc les modules suivants:
Actus ( Modele: Actus.php, Controller: ActusesController.php et les views)
Like ( Modele : Like.php, Controller : LikesController.php et les views)
Comments ( Modele : Comment.php, Controller: CommentsController.php et les views)

Avec ces 3 modules je souhaite creer un plugin que je vais nommer Wall et qui sur l'index affichera l'index du controller ActusesController.

Que me conseillerez vous de faire, pour aller au plus simple ?

jey1985, il y a 8 ans

Bonjour à tous,
personne n'aurais une idée ?
merci par avance

romses, il y a 8 ans

j'avoue je n'ai pas trop travailler avecla version 2.X mais bon essaye ceci:

<?php class ActusesController extends WallAppController { public $uses = array('Wall.Astuce'); public function index() { //... } } ?>

je pense ça devrai fonctionné

jey1985, il y a 8 ans

En gros dans mon element navbar.ctp j'ai le lien permettant d'accéder au fil d'actualité avec l'option plugin
echo $this->Html->link(('Actus'), array('controller' => 'WallActuses', 'action' => 'index', "plugin"=>"wall"));

Par contre j'ai toujours mes anciens liens sans cette option là

<?php $url = $this->Html->url(array('controller'=>'Comptes','action'=>'index')); ?> <li><a href="<?php echo $url; ?>">Comptes</a></li>

Sauf que, des que je me rends sur la page index de mon plugin, suite au passage par cette page, tous mes liens de la navbar sont transformés avec /wall/ devant le nom du controller alors que je n'ai pas mis d'option "plugin"

En revanche tant que je ne me rends pas sur la page actualités de mon plugin mes liens sont OK...

Lartak, il y a 8 ans

C'est tout à fait normal, tous les liens qui s'affichent dans ton plugin et qui ne sont pas liées à lui, il te faut définir l'option plugin à null.
Soit par exemple, remplacer :

$this->Html->url(['controller' => 'Comptes', 'action' => 'index']);

Par :

$this->Html->url(['controller' => 'Comptes', 'action' => 'index', 'plugin' => null]);

Et ceci pour tous les liens qui ne sont pas liés à un quelconque plugin et qui s'affichent sur un plugin.

jey1985, il y a 8 ans

Bonsoir,
j'ai enfin réussi à le faire fonctionner, en faisant ceci :

CakePlugin::load('Wall');

Et dans mon répertoire Wall j'ai ceci:
Plugin/Wall/Controller/WallCommentsController.php
Plugin/Wall/Controller/WallActusesController.php
Plugin/Wall/Controller/WallLikesController.php
Plugin/Wall/Controller/WallAppController.php
Plugin/Wall/Controller/AppController.php
Avec WallAppController qui hérite de AppController et tous les autres controller héritent de WallAppController.

Dans les modèles j'ai cela:
Plugin/Wall/Model/WallActus.php
Plugin/Wall/Model/WallComment.php
Plugin/Wall/Model/WallLike.php
et
Plugin/Wall/Model/WallAppModel.php
Tous héritent de WallAppModel.

Et j'accède à tous mes controllers du plugin en faisant /wall/nom_du_plugin
http://localhost/intranet/wall/WallActuses

C'est tombé en marche à cause d'une histoire de majuscule/minuscule sur le nom du plugin dans l'url http://localhost/intranet/**Wall**/WallActuses ne fonctionne pas

En revanche maintenant ça me foire toutes les routes de mon appli principales, ça me rajoute un /wall dans toutes mes Urls avant mes controllers....auriez vous une idée ?

romses, il y a 8 ans

Normale c'est le principe des plugins de cakephp, si tu veut utilisé un autre controlleur qui n'est pas dans ton plugin tu fais le lien direct sans la paramètre plugin . Mais c'est la définition des appelations de plugin dans cake

jey1985, il y a 8 ans

Superbe ta solution fonctionne, MERCI !!
par contre du cou cest un peu embétant de devoir rajouter cela sur tout mon site non? moi personnellement il est en début de dev donc cest pas trop génant mais sur un site déja existant et conséquent ça pourrais l'être

Ma manière de procéder n'est peut-être pas bonne vis à vis de la création et utilisatin de mon plugin ? car si quelqu'un veut loader mon plugin sur son site, il est obligé de changer toutes les constructions de liens en précisant le plugin à null ?