Jump to content

Symfony Routing : Contrôleur manquant ou non valable


Recommended Posts

Bonjour,

Je tente depuis plusieurs jours de développer un module pour la préparation de commande. Je suis sous la version 1.7.5 et je code selon les nouvelles recommandations de PrestaShop pour la 1.7, donc avec Symfony. J'ai essayé de régler toutes mes erreurs tout seul, mais je ne trouve pas la cause de celle-ci.

A l'installation, mon module ajoute un onglet dans les paramètres de commande. Seulement voilà, j'ai le résultat suivant quand je clique sur l'onglet :

image.png.bb858befa29cd7fa0b011af1d507834c.png

Pourtant, j'ai suivi cette documentation à la lettre : https://devdocs.prestashop.com/1.7/modules/concepts/controllers/admin-controllers/

Voici mon code pour l'onglet, dans le fichier principal orderpreparation.php :

    private function installTab(): bool
    {
        $tabId = (int) Tab::getIdFromClassName('AdminOrderPreparation');
        if (!$tabId) {
            $tabId = null;
        }

        $tab = new Tab($tabId);
        $tab->active = 1;
        $tab->class_name = 'AdminOrderPreparation';
        //$tab->route_name = 'admin_order_preparation';
        $tab->name = array();
        foreach (Language::getLanguages() as $lang) {
            $tab->name[$lang['id_lang']] = $this->trans('Order Preparation', array(), 'Modules.Orderpreparation.Admin', $lang['locale']);
        }
        $tab->id_parent = (int) Tab::getIdFromClassName('AdminParentOrders');
        $tab->module = $this->name;

        return (bool) $tab->save();
    }

    private function uninstallTab()
    {
        $tabId = (int) Tab::getIdFromClassName('AdminOrderPreparation');
        if (!$tabId) {
            return true;
        }

        $tab = new Tab($tabId);

        return $tab->delete();
    }

Le code de mon contrôleur :

declare(strict_types=1);

namespace Kaudaj\Module\OrderPreparation\Controller\Admin;

use Doctrine\Common\Cache\CacheProvider;
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use PrestaShopBundle\Security\Annotation\AdminSecurity;
use Kaudaj\Module\OrderPreparation\Model\PreparationLine;
use Kaudaj\Module\OrderPreparation\Repository\PreparationLineRepository;

class AdminOrderPreparationController extends FrameworkBundleAdminController
{
    private $cache;

    private $form_filename;

    /**
     * @var PreparationLinesRepository
     */
    private $repository;
    
    public function __construct(CacheProvider $cache)
    {
        $this->cache = $cache;
        $this->repository = new PreparationLineRepository();
        $this->form_filename = _PS_MODULE_DIR_ . $this->module->name . DIRECTORY_SEPARATOR . "orderpreparationform.html";
        parent::__construct();
    }

    /**
     * @AdminSecurity(
     *     "is_granted('read', request.get('_legacy_controller'))",
     *     message="You do not have permission to update this."
     * )
     *
     * @return Response
     */
    public function indexAction()
    {
        return $this->render(
            '@Modules/orderpreparation/views/templates/admin/orderpreparation.html.twig',
            array(
                "ajax_dl_link" => $this->context->link->getAdminLink($this->module->name)
            )
        );
    }
}

Mon routes.yml :

admin_order_preparation:
  path: /order-preparation
  methods: [GET]
  defaults:
    _controller: 'Kaudaj\Module\OrderPreparation\Controller\Admin\AdminOrderPreparationController::indexAction'

Ainsi que mon composer.json :

{
  "name": "kaudaj/order-preparation",
  "description": "Kaudaj - Order Preparation",
  "autoload": {
    "psr-4": {
      "Kaudaj\\Module\\OrderPreparation\\": "src/"
    },
    "config": {
      "prepend-autoloader": false
    },
    "type": "prestashop-module"
  }
}

Si vous avez besoin de plus d'informations sur le contexte ou de code que je n'ai pas publié, n'hésitez pas à me le demander.
Merci d'avance pour votre aide !

Edited by Vintelec (see edit history)
Link to comment
Share on other sites

Bonjour @jikail,

Merci de prendre le temps de m'aider.
J'ai bien fais un dumpautoload avant d'installer mon module dans le back-office. Je viens de supprimer le vendor, et j'ai refais un dumpautoload pour être sûr : toujours la même erreur.

Etant novice en Symfony, pouvez-vous m'expliquer ce que vous entendez par votre seconde question ?
Voici le contenu de mon dossier vendor généré automatiquement :

image.png.e11e00cfcfd8ea77378331075ebc670e.png

Dites moi si vous voulez que je vous transmette le contenu de l'un de ces fichiers.

 

Edited by Vintelec (see edit history)
Link to comment
Share on other sites

La documentation m'indiquait seulement "composer dumpautoload", donc mon classmap était vide. J'ai rajouté le -a et j'ai maintenant un classmap complet dans le fichier autoload_classmap.php :
 

<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Kaudaj\\Module\\OrderPreparation\\Controller\\Admin\\AdminOrderPreparationController' => $baseDir . '/src/Controller/Admin/AdminOrderPreparationController.php',
    'Kaudaj\\Module\\OrderPreparation\\Model\\PreparationLine' => $baseDir . '/src/Model/PreparationLine.php',
    'Kaudaj\\Module\\OrderPreparation\\Repository\\PreparationLineRepository' => $baseDir . '/src/Repository/PreparationLineRepository.php',
);

Par contre, toujours la même erreur côté backoffice quand je clique sur l'onglet du backoffice après réinstallation du module...
Aussi, mon fichier autoload_namespaces.php retourne un tableau vide :

<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
);

Est-ce que c'est important ?

 

EDIT : J'ai essayé d'installer le module d'exemple d'onglets de Prestashop pour la 1.7.7 (https://github.com/PrestaShop/example-modules/tree/master/democontrollertabs). J'y ai juste changé la version minimum à la 1.7.5 et j'ai généré le dossier vendor avec "composer dumpautoload -a".
Résultat : même erreur qu'avec mon module. Est-ce que le problème, c'est la 1.7.5 ?
Si vous ne trouvez pas de solution, je vais essayer d'installer le module avec une installation Prestashop de test sous la 1.7.7 quand j'aurai le temps, pour voir si ça vient de là.

Edited by Vintelec (see edit history)
Link to comment
Share on other sites

Je suis en 1.7.6 , d'après la doc la prise en charge des controllers est sortie à ce moment. As tu un git ou autre dès que j'ai du temps je peux tester sur mon install. Peut-être aussi un problème de cache sur composer utilise clearcache.

Autre idée regarde sur les issue du projets sur github.

Link to comment
Share on other sites

Oui voilà, dans la doc c'est même censé marcher en 1.7.5 pour l'installation manuelle d'onglets 😕

J'ai fais un repository Git, voici le lien : https://github.com/Kaudaj/orderpreparation
Mais peut-être que vous pouvez plutôt tester avec le module de démo dans un premier temps vu qu'il est officiel et censé fonctionner ?

J'ai fais un clearcache, et regénéré le dossier vendor, toujours pareil.

Les issues du projet de démo n'ont pas de rapport avec mon problème malheureusement.

Merci encore une fois de prendre le temps de m'aider.

Link to comment
Share on other sites

  • 2 weeks later...

Alors, débrief :

J'ai testé le module de démo "democontrollertabs" avec deux versions de PrestaShop :

  •  La 1.7.5.0, la version que j'utilise actuellement avec ma boutique.
    ==> Même résultat qu'avec mon module, c'est-à-dire l'erreur "The controller is missing or invalid".
  • La 1.7.7.0 bêta 2, dernière version sortie à ce jour.
    ==> Le module de démo fonctionne correctement. Par contre, mon module donne toujours la même erreur. 🤯

J'avoue que je n'y comprends plus grand chose...
J'ai mis à jour le git, j'ai changé deux trois trucs, justement pour me rapprocher le plus possible du module de démo.
D'ailleurs, il me semble que je devrais rajouter le dossier vendor dans le .gitignore ?

Je ne vais pas m'arrêter là et continuer de chercher pour la science 😂 mais toute aide sera la bienvenue !

Link to comment
Share on other sites

J'attendais d'être sûr, mais c'est bon : j'ai réussi à faire marcher mon module !

En 1.7.7.0, c'était mon template qui était pas bon.
Et pour les versions antérieures, il faut bien rajouter ceci pour la route principale, comme précisé dans la doc :

    _legacy_controller: AdminOrderPreparation
    _legacy_link: AdminOrderPreparation

Je me suis fais avoir parce que le module de démo ne les comportait pas, sauf qu'il est fait pour la 1.7.7.0 minimum donc... my bad.
Je pensais avoir déjà testé avec ces lignes pourtant mais il y avait sûrement une autre erreur en même temps.

Je n'ai pas testé pour la 1.7.5.0 parce que j'utilise le nouveau système de Grid qui requiert la 1.7.6, donc je vais faire évoluer ma boutique vers la 1.7.6.8.
Mais je pense que ça doit fonctionner aussi.

Bonne programmation à tous !

Edited by Vintelec (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...