Je souhaiterais étendre le loop produit.
Voici mon code :
ArtabanMarketplace\Config\config.xml
.....
<service id="loopevent.loop.extends" class="ArtabanMarketplace\EventListeners\Loop" scope="request">
<argument type="service" id="request"/>
<tag name="kernel.event_subscriber" />
</service>
.....
ArtabanMarketplace\EventListeners\Loop.php
<?php
/**
* Extends Loops
*
* Class Loop
* @author Gilles Lengy
*/
namespace ArtabanMarketplace\EventListeners;
use ArtabanMarketplace\Model\Map\AmpSellerProductTableMap;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\TheliaEvents;
class Loop implements EventSubscriberInterface {
/** @var Request $request */
protected $request = null;
public function __construct(Request $request) {
$this->request = $request;
}
/**
* @inheritdoc
*/
public static function getSubscribedEvents() {
return [
// Product
TheliaEvents::getLoopExtendsEvent(TheliaEvents::LOOP_EXTENDS_ARG_DEFINITIONS, 'product') => ['productArgDefinitions', 128],
TheliaEvents::getLoopExtendsEvent(TheliaEvents::LOOP_EXTENDS_INITIALIZE_ARGS, 'product') => ['productInitializeArgs', 128],
TheliaEvents::getLoopExtendsEvent(TheliaEvents::LOOP_EXTENDS_BUILD_MODEL_CRITERIA, 'product') => ['productBuildModelCriteria', 128],
];
}
/**
* Add a new parameter for loop lang
* you can now call the loop with this argument
*/
public function productArgDefinitions(LoopExtendsArgDefinitionsEvent $event) {
$argument = $event->getArgumentCollection();
$argument->addArgument(Argument::createIntListTypeArgument('amp_seller_id'));
}
/**
* Change the query search of the loop product
*/
public function productBuildModelCriteria(LoopExtendsBuildModelCriteriaEvent $event) {
$id = "1";
$ampSellerJoin = new Join(ProductTableMap::ID, AmpSellerProductTableMap::PRODUCT_ID, Criteria::LEFT_JOIN);
$event->getModelCriteria()->addJoinObject($ampSellerJoin, "ampSellerJoin")->where(AmpSellerProductTableMap::AMP_SELLER_ID . " " . Criteria::IN . " (" . $id . ")");
}
/**
* Set the amp_seller_id parameters from the query string
*/
public function productInitializeArgs(LoopExtendsInitializeArgsEvent $event) {
$parameters = $event->getLoopParameters();
if ($this->request->query->has('loop-amp_seller_id')) {
$parameters['amp_seller_id'] = 1;
$event->setLoopParameters($parameters);
}
}
}
La loop
<ul>
{loop type="product" name="my_product_loop" amp_seller_id=1 order="min_price"}
<li>{$TITLE} ({$REF})</li>
{/loop}
</ul>
L'id est en "dur" plusieurs fois pour être sur que ce soit le bon :-)
Voici l'erreur que j'obtiens :
FatalThrowableError in Loop.php line 21:
Type error: Argument 1 passed to ArtabanMarketplace\EventListeners\Loop::__construct() must be an instance of ArtabanMarketplace\EventListeners\Request, instance of Thelia\Core\HttpFoundation\Request given, called in C:\wamp64\www\theliatestmp\cache\dev\CoreDevDebugProjectContainer.php on line 1619
Je ne sais pas trop quoi en penser. Dois-je m'arranger pour que l'argument 1 soit une instance de Thelia\Core\HttpFoundation\Request ou donner une instance de ArtabanMarketplace\EventListeners\Request...
Dans les deux cas, je ne sais pas comment faire...
Je ne sais pas non plus comment récupérer amp_seller_id.
Toute aide sera grandement appréciée !
Merci.