扩展添加到购物车功能以在 Sylius 中自定义 table 添加产品变体
Extend Add to cart functionality to add product variants in custom table in Sylius
我正在使用 Sylius 1.6,我正在尝试在自定义 table 中添加产品变体,因为我有一个单独的 table 来存储多个订单项目变体。我的问题是当我将产品的变体重新添加到购物车时它没有添加。例如,我有一个变体 A 的产品。我将它添加到购物车中。现在我再次尝试通过添加相同产品的变体来提交添加到购物车表单。这次变体没有添加。我不知道它是如何在第一次尝试中添加到自定义 table 上的。这个功能是在我拿到项目时预先开发的,所以我不知道第一次是如何存储它的。我尝试了很多方法来实现它。我试图覆盖控制器,但是,我收到一个错误 this controller is not callable, the controller does neither exist as service nor as a class
.
service.yml
这里我为我的扩展 OrderItemController
添加了服务
sylius.controller.order_item:
class: App\Controller\OrderItemController
arguments: ['@templating']
tags: ['controller.service_arguments']
_sylius.yaml
这里我定义了OrderItemController
sylius_order:
resources:
order:
classes:
model: App\Entity\Order\Order
repository: App\Repository\OrderRepository
order_item:
classes:
model: App\Entity\Order\OrderItem
controller: App\Controller\OrderItemController
OrderItemController
这里我试图获取在 addAction
中添加项目的请求
class OrderItemController extends ResourceController
{
public function addAction(Request $request): Response
{
die('debugging');
}
OrderItem
实体。这是由 Sylius 默认 BaseOrderItem
实体
扩展的
namespace App\Entity\Order;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Sylius\Component\Core\Model\OrderItem as BaseOrderItem;
/**
* @ORM\Entity
* @ORM\Table(name="sylius_order_item")
* @ORM\HasLifecycleCallbacks
*/
class OrderItem extends BaseOrderItem
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\Order\OrderItemVariants", cascade={"persist"},mappedBy="orderItem",orphanRemoval=true)
*/
protected $orderItemVariant;
public function __construct()
{
parent::__construct();
$this->orderItemVariant = new ArrayCollection();
}
/**
* @ORM\PrePersist
*/
public function prePersist()
{
$this->updateVariant();
}
/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
$this->updateVariant();
}
public function cremoveOrder(){
global $kernel;
$em = $kernel->getContainer()->get('app.base_controller')->getDoctrineManager();
$entityManager = $em->getRepository('App\Entity\Order\OrderItem')->findOneBy(array('order' => $this->order->getId() ));
if(isset($entityManager) and $entityManager->getId()){
$item = $em->getReference('App\Entity\Order\OrderItem', $entityManager->getId());
$em->remove($item);
$em->flush();
//$em->refresh($item);
}
}
public function updateVariant()
{ global $kernel;
$em = $kernel->getContainer()->get('app.base_controller')->getDoctrineManager();
**I tried to add the variants here but, couldn't worked for me.**
/*foreach ($this->orderItemVariant as $variant) {
$orderItemVariants = $em->getRepository('App\Entity\Order\OrderItemVariants')->findBy(['orderItem' => $this->getOrder()]);
foreach ($orderItemVariants as $variants) {
$this->addOrderItemVariant($variants);
}
}*/
}
/**
* @return Collection|OrderItemVariants[]
*/
public function getOrderItemVariant(): Collection
{
return $this->orderItemVariant;
}
public function addOrderItemVariant(OrderItemVariants $orderItemVariant): self
{
if (!$this->orderItemVariant->contains($orderItemVariant)) {
$this->orderItemVariant[] = $orderItemVariant;
$orderItemVariant->setOrderItem($this);
}
return $this;
}
public function removeOrderItemVariant(OrderItemVariants $orderItemVariant): self
{
if ($this->orderItemVariant->contains($orderItemVariant)) {
$this->orderItemVariant->removeElement($orderItemVariant);
// set the owning side to null (unless already changed)
if ($orderItemVariant->getOrderItem() === $this) {
$orderItemVariant->setOrderItem(null);
}
}
return $this;
}
}
OrderItemVariants
我需要添加变体的实体
namespace App\Entity\Order;
use App\Entity\Product\ProductVariant;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="mp_order_item_variants")
* @ORM\Entity(repositoryClass="App\Repository\Order\OrderItemVariantsRepository")
*/
class OrderItemVariants
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order\OrderItem", cascade={"persist"},inversedBy="orderItemVariant")
* @ORM\JoinColumn(name="order_item_id", referencedColumnName="id",onDelete="CASCADE")
*/
protected $orderItem;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Product\ProductVariant", cascade={"persist"})
* @ORM\JoinColumn(name="variant_id", referencedColumnName="id",onDelete="SET NULL")
*/
protected $variant;
/**
* @var int
* @ORM\Column(name="quantity",type="integer", nullable=true)
*/
protected $quantity = 0;
public function getId(): ?int
{
return $this->id;
}
public function getOrderItem(): ?OrderItem
{
return $this->orderItem;
}
public function setOrderItem(?OrderItem $orderItem): self
{
$this->orderItem = $orderItem;
return $this;
}
public function getVariant(): ?ProductVariant
{
return $this->variant;
}
public function setVariant(?ProductVariant $variant): self
{
$this->variant = $variant;
return $this;
}
public function getQuantity(): ?int
{
return $this->quantity;
}
public function setQuantity(?int $quantity): self
{
$this->quantity = $quantity;
return $this;
}
}
如何实现?在 sylius 中扩展或覆盖添加到购物车功能的最佳方法是什么?
我整理好了,我做错的是在 service.yml
中添加了以下部分
sylius.controller.order_item:
class: App\Controller\OrderItemController
arguments: ['@templating']
tags: ['controller.service_arguments']
我只需要添加
App\Controller\OrderItemController:
autowire: false
在我的 service.yml
中,我的控制器被覆盖了,我用自己的逻辑来实现我想要的。我按照 this link 删除了第 3 步,我的问题就解决了。
我正在使用 Sylius 1.6,我正在尝试在自定义 table 中添加产品变体,因为我有一个单独的 table 来存储多个订单项目变体。我的问题是当我将产品的变体重新添加到购物车时它没有添加。例如,我有一个变体 A 的产品。我将它添加到购物车中。现在我再次尝试通过添加相同产品的变体来提交添加到购物车表单。这次变体没有添加。我不知道它是如何在第一次尝试中添加到自定义 table 上的。这个功能是在我拿到项目时预先开发的,所以我不知道第一次是如何存储它的。我尝试了很多方法来实现它。我试图覆盖控制器,但是,我收到一个错误 this controller is not callable, the controller does neither exist as service nor as a class
.
service.yml
这里我为我的扩展 OrderItemController
sylius.controller.order_item:
class: App\Controller\OrderItemController
arguments: ['@templating']
tags: ['controller.service_arguments']
_sylius.yaml
这里我定义了OrderItemController
sylius_order:
resources:
order:
classes:
model: App\Entity\Order\Order
repository: App\Repository\OrderRepository
order_item:
classes:
model: App\Entity\Order\OrderItem
controller: App\Controller\OrderItemController
OrderItemController
这里我试图获取在 addAction
class OrderItemController extends ResourceController
{
public function addAction(Request $request): Response
{
die('debugging');
}
OrderItem
实体。这是由 Sylius 默认 BaseOrderItem
实体
namespace App\Entity\Order;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Sylius\Component\Core\Model\OrderItem as BaseOrderItem;
/**
* @ORM\Entity
* @ORM\Table(name="sylius_order_item")
* @ORM\HasLifecycleCallbacks
*/
class OrderItem extends BaseOrderItem
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\Order\OrderItemVariants", cascade={"persist"},mappedBy="orderItem",orphanRemoval=true)
*/
protected $orderItemVariant;
public function __construct()
{
parent::__construct();
$this->orderItemVariant = new ArrayCollection();
}
/**
* @ORM\PrePersist
*/
public function prePersist()
{
$this->updateVariant();
}
/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
$this->updateVariant();
}
public function cremoveOrder(){
global $kernel;
$em = $kernel->getContainer()->get('app.base_controller')->getDoctrineManager();
$entityManager = $em->getRepository('App\Entity\Order\OrderItem')->findOneBy(array('order' => $this->order->getId() ));
if(isset($entityManager) and $entityManager->getId()){
$item = $em->getReference('App\Entity\Order\OrderItem', $entityManager->getId());
$em->remove($item);
$em->flush();
//$em->refresh($item);
}
}
public function updateVariant()
{ global $kernel;
$em = $kernel->getContainer()->get('app.base_controller')->getDoctrineManager();
**I tried to add the variants here but, couldn't worked for me.**
/*foreach ($this->orderItemVariant as $variant) {
$orderItemVariants = $em->getRepository('App\Entity\Order\OrderItemVariants')->findBy(['orderItem' => $this->getOrder()]);
foreach ($orderItemVariants as $variants) {
$this->addOrderItemVariant($variants);
}
}*/
}
/**
* @return Collection|OrderItemVariants[]
*/
public function getOrderItemVariant(): Collection
{
return $this->orderItemVariant;
}
public function addOrderItemVariant(OrderItemVariants $orderItemVariant): self
{
if (!$this->orderItemVariant->contains($orderItemVariant)) {
$this->orderItemVariant[] = $orderItemVariant;
$orderItemVariant->setOrderItem($this);
}
return $this;
}
public function removeOrderItemVariant(OrderItemVariants $orderItemVariant): self
{
if ($this->orderItemVariant->contains($orderItemVariant)) {
$this->orderItemVariant->removeElement($orderItemVariant);
// set the owning side to null (unless already changed)
if ($orderItemVariant->getOrderItem() === $this) {
$orderItemVariant->setOrderItem(null);
}
}
return $this;
}
}
OrderItemVariants
我需要添加变体的实体
namespace App\Entity\Order;
use App\Entity\Product\ProductVariant;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="mp_order_item_variants")
* @ORM\Entity(repositoryClass="App\Repository\Order\OrderItemVariantsRepository")
*/
class OrderItemVariants
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order\OrderItem", cascade={"persist"},inversedBy="orderItemVariant")
* @ORM\JoinColumn(name="order_item_id", referencedColumnName="id",onDelete="CASCADE")
*/
protected $orderItem;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Product\ProductVariant", cascade={"persist"})
* @ORM\JoinColumn(name="variant_id", referencedColumnName="id",onDelete="SET NULL")
*/
protected $variant;
/**
* @var int
* @ORM\Column(name="quantity",type="integer", nullable=true)
*/
protected $quantity = 0;
public function getId(): ?int
{
return $this->id;
}
public function getOrderItem(): ?OrderItem
{
return $this->orderItem;
}
public function setOrderItem(?OrderItem $orderItem): self
{
$this->orderItem = $orderItem;
return $this;
}
public function getVariant(): ?ProductVariant
{
return $this->variant;
}
public function setVariant(?ProductVariant $variant): self
{
$this->variant = $variant;
return $this;
}
public function getQuantity(): ?int
{
return $this->quantity;
}
public function setQuantity(?int $quantity): self
{
$this->quantity = $quantity;
return $this;
}
}
如何实现?在 sylius 中扩展或覆盖添加到购物车功能的最佳方法是什么?
我整理好了,我做错的是在 service.yml
sylius.controller.order_item:
class: App\Controller\OrderItemController
arguments: ['@templating']
tags: ['controller.service_arguments']
我只需要添加
App\Controller\OrderItemController:
autowire: false
在我的 service.yml
中,我的控制器被覆盖了,我用自己的逻辑来实现我想要的。我按照 this link 删除了第 3 步,我的问题就解决了。