-
-
Save SebSept/982e016f60ba9383be5eb30be3e17826 to your computer and use it in GitHub Desktop.
<?php | |
namespace SebSept\Adminproductquantities\Controller; | |
use PrestaShopBundle\Api\Stock\Movement; | |
use PrestaShopBundle\Controller\Admin\FrameworkBundleAdminController; | |
use PrestaShopBundle\Entity\ProductIdentity; | |
use PrestaShopBundle\Entity\Repository\StockRepository; | |
use PrestaShopBundle\Service\ProductService; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
class Update extends FrameworkBundleAdminController | |
{ | |
/** | |
* Update Product stock | |
* | |
* (pas de gestion des déclinaisons, c'est normal) | |
* | |
* @param int $quantity new quantity (absolute value) | |
* @param int $id_product | |
* | |
* @return JsonResponse | |
*/ | |
public function update(int $quantity, int $id_product) | |
{ | |
try { | |
$product_provider = $this->get('prestashop.adapter.data_provider.product'); | |
$stock_repository = $this->get('prestashop.core.api.stock.repository'); | |
$delta = $quantity - (int)$product_provider->getQuantity($id_product); | |
$stock_data = $stock_repository->updateStock(new Movement(new ProductIdentity($id_product), $delta)); | |
$fetched_quantity = $stock_data['product_available_quantity'] ?? 'no-data'; | |
if ($quantity !== $fetched_quantity) | |
{ | |
throw new \Exception("Echec mise à jour stock : quantité voulue et recupérée differentes. [$quantity] vs [$fetched_quantity]"); | |
} | |
} | |
catch (\Exception $exception) | |
{ | |
return new JsonResponse(['error' => $exception->getMessage()]); | |
} | |
// @todo implement reponse positive | |
return new JsonResponse(['q' => $quantity, 'id' => $id_product]); | |
} | |
} |
I need to use the bulkUpdateStock function (https://github.com/PrestaShop/PrestaShop/blob/develop/src/PrestaShopBundle/Entity/Repository/StockRepository.php#L102) to update a set of stocks (available/physical). I don't really understand the topic of multiple service containers in PrestaShop, but as I understand it at https://github.com/PrestaShop/PrestaShop/blob/develop/src/PrestaShopBundle/Resources/config/services/bundle/repository.yml#L46 the StockRepository service is declared, which would allow me to instantiate the class and then use the function I need, however, I still don't know the correct way to instantiate this service within the ModuleFrontController. Again, I would appreciate your help, regards.
Hello,
Today, to my knowledge, there is no way to access services of the backoffice in the front office.
Sorry.
This will come later, I suppose.
Hello friend, I found this article https://blog.floriancourgey.com/2018/05/how-to-work-with-the-symfony-kernel-anywhere-in-prestashop-1-7/, which indicates how to instantiate a symfony service container inside a module front controller (legacy). With the symfony service container I just need to run MyModule::getContainer()->get('prestashop.core.api.stock.repository') to get an instance of StockRepository. Greetings :)
Thanks for the feedback 😄
👍 For sure, booting the kernel and grab it, but I suppose performances is going to suffer from that.
Hi friend, do you know how I can initialize the StockRepository class inside a module front controller? I have not been able to access the correct service container within the front controller. I would appreciate your help, regards.