Jump to content

Edit History

mrav

mrav

Salve a tutti,

sto scoprendo Prestashop e mi sono avviato alla creazione di un modulo personalizzato seguendo la documentazione ufficiale.

In particolare, sto cercando di utilizzare Doctrine per recuperare i prodotti dal database, estraendo solo alcuni campi e filtrandoli in base alle mie esigenze. Ho quindi creato i seguenti files.

Product.php

<?php

namespace MyModule\Entity;

use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="MyModule\Entity\Repository\ProductRepository")
 */
class Product
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(name="id_product", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Collection ProductLang
     * @OneToMany(targetEntity="ProductLang", mappedBy="id_product")
     */
    private $locale;

    public function getId(): int
    {
        return $this->id;
    }

    public function getLocale(): Collection
    {
        return $this->locale;
    }
}

ProductRepository.php

<?php declare(strict_types=1);

namespace MyModule\Entity\Repository;
use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function getAll()
    {
        $query = $this->createQueryBuilder('p')
            ->where('p.visibility = "none"')
            ->andWhere('p.is_virtual = true');

        return $query->getQuery()->getResult();
    }
}

services.yml

services:

  mymodule.entity.repository.productrepository:
    class: MyModule\Entity\Repository\ProductRepository
    factory: ['@doctrine.orm.default_entity_manager', getRepository]
    arguments:
      - MyModule\Entity\Product

MyModuleController.php

<?php declare(strict_types=1);

namespace MyModule\Controller\Admin;

use PrestaShopBundle\Security\Annotation\ModuleActivated;
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use PrestaShopBundle\Security\Annotation\AdminSecurity;
use MyModule\Entity\Repository\ProductRepository;
use Symfony\Component\HttpFoundation\Response;

/**
 * Class RentController.
 *
 * @ModuleActivated(moduleName="mymodule", redirectRoute="admin_module_manage")
 */
class MyModuleController extends FrameworkBundleAdminController
{
    private ProductRepository $productRepository;

    public function __construct(ProductRepository $productRepository)
    {
        $this->productRepository = $productRepository;
        parent::__construct();
    }

    /**
     * @AdminSecurity("is_granted('read', request.get('_legacy_controller'))", message="Access denied.")
     *
     * @return Response
     */
    public function productsAction()
    {
        $products = $this->productRepository->getAll();
        return $this->render('@Modules/mymodule/views/templates/admin/products.html.twig', [
            'products' => $products
        ]);
    }
}

 

Il problema che riscontro è che quando eseguo il metodo productsAction(), ottengo il seguente errore:

[Syntax Error] line 0, col 63: Error: Expected Literal, got '"'

e nello stack trace mi ritrovo questo:

Doctrine\ORM\Query\ QueryException

SELECT p FROM MyModule\Entity\Product p WHERE p.is_virtual = true

Da quello che capisco, non è in grado di risolvere il nome della tabella dall'entità.

Eppure, come specificato qui, la conversione dovrebbe essere trasparente. Difatti, se istanzio il repository tramite l'entityManager "manualmente"

/** @var EntityManagerInterface $entityManager */
$entityManager = $this->container->get('doctrine.orm.entity_manager');
$productRepository = $entityManager->getRepository(Product::class);

i prodotti li recupero.

Cosa mi sfugge?

 

Grazie a quanti,

Mario.

mrav

mrav

Salve a tutti,

sto scoprendo Prestashop e mi sono avviato alla creazione di un modulo personalizzato seguendo la documentazione ufficiale.

In particolare, sto cercando di utilizzare Doctrine per recuperare i prodotti dal database, estraendo solo alcuni campi e filtrandoli in base alle mie esigenze. Ho quindi creato i seguenti files.

Product.php

<?php

namespace MyModule\Entity;

use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="MyModule\Entity\Repository\ProductRepository")
 */
class Product
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(name="id_product", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Collection ProductLang
     * @OneToMany(targetEntity="ProductLang", mappedBy="id_product")
     */
    private $locale;

    public function getId(): int
    {
        return $this->id;
    }

    public function getLocale(): Collection
    {
        return $this->locale;
    }
}

ProductRepository.php

<?php declare(strict_types=1);

namespace MyModule\Entity\Repository;
use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function getAll()
    {
        $query = $this->createQueryBuilder('p')
            ->where('p.visibility = "none"')
            ->andWhere('p.is_virtual = true');

        return $query->getQuery()->getResult();
    }
}

services.yml

services:

  mymodule.entity.repository.productrepository:
    class: MyModule\Entity\Repository\ProductRepository
    factory: ['@doctrine.orm.default_entity_manager', getRepository]
    arguments:
      - MyModule\Entity\Product

MyModuleController.php

<?php declare(strict_types=1);

namespace MyModule\Controller\Admin;

use PrestaShopBundle\Security\Annotation\ModuleActivated;
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController;
use PrestaShopBundle\Security\Annotation\AdminSecurity;
use MyModule\Entity\Repository\ProductRepository;
use Symfony\Component\HttpFoundation\Response;

/**
 * Class RentController.
 *
 * @ModuleActivated(moduleName="mymodule", redirectRoute="admin_module_manage")
 */
class MyModuleController extends FrameworkBundleAdminController
{
    private ProductRepository $productRepository;

    public function __construct(ProductRepository $productRepository)
    {
        $this->productRepository = $productRepository;
        parent::__construct();
    }

    /**
     * @AdminSecurity("is_granted('read', request.get('_legacy_controller'))", message="Access denied.")
     *
     * @return Response
     */
    public function productsAction()
    {
        $products = $this->productRepository->getAll();
        return $this->render('@Modules/mymodule/views/templates/admin/products.html.twig', [
            'products' => $products
        ]);
    }
}

 

Il problema che riscontro è che quando eseguo il metodo productsAction(), ottengo il seguente errore:

[Syntax Error] line 0, col 63: Error: Expected Literal, got '"'

e nello stack trace mi ritrovo questo:

Doctrine\ORM\Query\ QueryException

SELECT p FROM MyModule\Entity\Product p WHERE p.is_virtual = true

Da quello che capisco, non è in grado di convertire il nome della classe dall'entità.

Eppure, come specificato qui, la conversione dovrebbe essere trasparente. Difatti, se istanzio il repository tramite l'entityManager "manualmente"

/** @var EntityManagerInterface $entityManager */
$entityManager = $this->container->get('doctrine.orm.entity_manager');
$productRepository = $entityManager->getRepository(Product::class);

i prodotti li recupero.

Cosa mi sfugge?

 

Grazie a quanti,

Mario.

×
×
  • Create New...