Jump to content

Création de services et erreur namespace pour un module


Recommended Posts

Bonjour, je cherche à apprendre davantage comment fonctionne prestashop. Je suis donc la doc ici : https://devdocs.prestashop.com/1.7/modules/concepts/hooks/use-hooks-on-modern-pages/

Seulement, en suivant tous les points comme indiqué. Je me retrouve avec une erreur : 

 

Attempted to load class "ProductRepository" from namespace "Foo\Repository".
Did you forget a "use" statement for another namespace?

Ma structure est la suivant : 

 

Module
  -->foo
      -->config
          -->services.yml
      -->src
          -->Repository
              -->ProductRepository.php
      -->foo.php

 

services.yml : 

# modules/foo/config/services.yml

services:
    product_repository:
        class: \Foo\Repository\ProductRepository
        arguments: ['@doctrine.dbal.default_connection', '%database_prefix%']

ProductRepository.php

<?php

// src/Repository/ProductRepository.php
namespace Foo\Repository;

use Doctrine\DBAL\Connection;

class ProductRepository
{
    /**
     * @var Connection the Database connection.
     */
    private $connection;

    /**
     * @var string the Database prefix.
     */
    private $databasePrefix;

    public function __construct(Connection $connection, $databasePrefix)
    {
        $this->connection = $connection;
        $this->databasePrefix = $databasePrefix;
        dump('ok');
    }

    /**
     * @param int $langId the lang id
     * @return array the list of products
     */
    public function findAllbyLangId($langId)
    {
        $prefix = $this->databasePrefix;
        $productTable = "${prefix}product";
        $productLangTable = "${prefix}product_lang";

        $query = "SELECT p.* FROM ${productTable} p LEFT JOIN ${productLangTable} pl ON (p.`id_product` = pl.`id_product`) WHERE pl.`id_lang` = :langId";
        $statement = $this->connection->prepare($query);
        $statement->bindValue('langId', $langId);
        $statement->execute();

        return $statement->fetchAll();
    }
}

et foo.php

<?php

if (!defined('_PS_VERSION_')) {
    exit;
}

class Foo extends Module
{
    public function __construct()
    {
        $this->name = 'foo';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Jordan NativeWeb';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = [
            'min' => '1.6',
            'max' => _PS_VERSION_
        ];
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Foo');
        $this->description = $this->l('2eme module');

        $this->confirmUninstall = $this->l('Etes vous sûr de vouloir supprimer ce module ?');

        if(!Configuration::get('MYMODULE_NAME')) {
            $this->warning = $this->l('Aucun nom trouvé');
        }
    }

    /**
     * Module installation.
     *
     * @return bool Success of the installation
     */
    public function install()
    {
        return parent::install() && $this->registerHook('displayDashboardToolbarIcons');
    }

    /**
     * Add an "XML export" action in Product Catalog page.
     *
     */
    public function hookDisplayDashboardToolbarIcons($hookParams)
    {
        if ($this->isSymfonyContext() && $hookParams['route'] === 'admin_product_catalog') {
            $products = $this->get('product_repository')->findAllByLangId(1);
            dump($products);
        }
    }

    public function uninstall()
    {
        if (!parent::uninstall() ||
            !Configuration::deleteByName('MYMODULE_NAME')
        ) {
            return false;
        }

        return true;
    }


}

 

Je suis sous la dernière version de Prestashop, et j'avoue ne pas comprendre. Avez vous une idée ? Merci par avance

Link to comment
Share on other sites

  • 1 month later...
51 minutes ago, DGStark said:

Salut,

 

Il faut utiliser "composer" pour charger les classes de ton module.

J'en sais pas plus que toi pour l'instant, je dois me renseigner sur la démarche à suivre :)

Voila,

Du coup, il a fallu que je crée un fichier composer.json à la racine de mon module foo.

composer.json

{
  "name" : "prestashop/foo",
  "description": "Foo module demo",
  "autoload": {
    "psr-4": {
      "Foo\\": "src/"
    }
  },
  "type" : "prestashop-module"
}

Ensuite j'ai lancé la commande composer dumpautoload toujours depuis la racine de mon module foo.

Et voila, j'obtiens bien le résultat attendu.

 

Composer est déjà installé sur mon pc, donc je n'ai pas eu besoin de le faire, mais sinon installe le :).

Si t'as besoin de plus d'infos je me suis appuyé sur ces liens.

 

https://getcomposer.org/doc/00-intro.md

https://github.com/sarjon/demo-grid-module

 

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