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


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
Auteur

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

        }

}

?>

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;

}
?>
jey1985
Auteur

J'ai oublié de préciser, je suis en CakePHP 2.9 et j'y accède par
http://localhost/webtest/Wall/Actuses

J'ai tjrs le même message en essayant avec cela

Ok je vois
essaye ceci:

<?php

App::uses('AppController', 'Controller');

class WallAppController extends AppController {
public $helpers = array('Wall.Wall');
}
?>
jey1985
Auteur

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
Auteur

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

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.

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

jey1985
Auteur

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

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
Auteur

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
Auteur

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
Auteur

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

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
Auteur

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 ?

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
Auteur

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

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
Auteur

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 ?