扩展“添加到购物车”功能以在Sylius的自定义表中添加产品变体

奥怀斯·阿斯兰

我正在使用Sylius 1.6,并且试图在自定义表中添加产品变体,因为我有一个单独的表来存储多个订单商品变体。我的问题是,当我将某个产品的变体重新添加到未添加的购物车中时。例如,我有一个带有变体A的产品。我将其添加到购物车中。现在,我再次尝试通过添加相同产品的变体来提交添加到购物车表单。这次没有添加变体。我不知道如何在第一次尝试中将其添加到自定义表中。此功能是在我获得项目时预先开发的,因此我不知道它是如何第一次存储的。我尝试了多种方法来实现它。我尝试覆盖控制器,但出现了错误提示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和我的控制器中被覆盖,我投入了自己的逻辑来实现我想要的。我遵循此链接,只是删除了步骤3,问题已解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Magento | 如何在自定义模块中的购物车中添加产品?

使用自定义信息和价格将产品添加到购物车

自定义添加到购物车按钮以将多个产品添加到购物车中,数量为:woocommerce

在可变的单个产品页面中自定义添加到购物车按钮/链接

在WooCommerce订单中添加到购物车自定义字段数据

自定义产品上缺少“添加到购物车”按钮

将自定义产品计算价格添加到Woocommerce购物车

在Woocommerce中的产品自定义循环上启用Ajax添加到购物车按钮

在WooCommerce中为特定产品类别自定义“添加到购物车”按钮

将可变产品的自定义属性添加到WooCommerce中的购物车

在Woocommerce产品变体中隐藏“添加到购物车”按钮以获取特定属性值

附加的自定义按钮,可在添加到Wovcommerce中的购物车之前更改产品价格

在“添加到购物车”下的自定义文本,但不在Woocommerce中

将产品添加到Woocommerce单个产品页面上的购物车后,激活自定义按钮

在Woocommerce中显示添加到购物车消息中的产品变体属性

在Woocommerce 3中自定义添加到购物车消息

单个Woocommerce产品自定义变体添加到购物车按钮

WooCommerce添加到购物车,从自定义选择字段中添加第二个产品

验证“单个产品”页面中“添加到购物车”上方添加的自定义字段

根据WooCommerce产品自定义库存状态禁用添加到购物车按钮

通过WooCommerce产品设置中的自定义复选框禁用添加到购物车按钮

添加产品时,WooCommerce将加售产品添加到购物车

将自定义计算添加到magento的购物车总额和总计中

添加到购物车按钮未在购物车中添加产品

WooCommerce自定义产品类型-多个添加到购物车部分的问题

根据用户国家和产品 ID 自定义添加到购物车按钮

Woocommerce 产品添加到购物车自定义数据 img

自定义 WooCoomerce 产品页面,添加到购物车按钮重定向到产品页面

根据 Woocommerce 中的自定义字段替换特定产品的 ajax 添加到购物车