如何在sylius中以编程方式将带有变体的产品添加到购物车?

时间:2015-01-28 12:16:24

标签: symfony sylius

我目前正在将Sylius电子商务用于网站,并希望根据用户请求自动将产品添加到购物车。

在我的控制器中,我已经输入:

$repository = $this->container->get('sylius.repository.product');

$product = $repository->find(126);

return $this->forward('sylius.controller.cart_item:addAction', ['id' => $product->getId()]);

但这给了我一个错误:

  

捕获致命错误:参数1传递给Sylius \ Component \ Variation \ Model \ Variant :: hasOption()必须实现接口Sylius \ Component \ Variation \ Model \ OptionValueInterface,null给定,

查看sylius上的文档和_single.html.twig文件 /var/www/html/sylius/vendor/sylius/sylius/src/Sylius/Bundle/WebBundle/Resources/views/Frontend/Product/_single.html.twig

我发现添加到购物车按钮实际上也会在下面的代码段中提交一个小表单:

<form action="{{ path('sylius_cart_item_add', {'id': product.id}) }}" method="post" class="clearfix">
                {% set form = sylius_cart_form({'product': product}) %}
                {{ form_widget(form.quantity, {'attr': {'class': 'center-text'}, 'empty_value': '1'}) }}
                {{ form_widget(form._token) }}
                <button type="submit" class="btn btn-success"><i class="icon-shopping-cart icon-white"></i> {{ 'sylius.add_to_cart'|trans }}</button>
            </form>

现在我的问题是如何在我的控制器中模拟这个?如何直接从控制器添加产品,而不是从以下链接添加产品:

<a href="{{ path('sylius_cart_item_add', {'productId': product.id}) }}">Add product to cart</a>

2 个答案:

答案 0 :(得分:1)

您可以使用解析器服务。

public function addItemAction(Request $request)
{
    $resolver = $this->get('sylius.cart_resolver');
    $item = $resolver->resolve($this->createNew(), $request);
}

解析器用于根据用户请求创建新项目。

问候。

答案 1 :(得分:0)

编辑: 问题实际上在类/vendor/sylius/sylius/src/Sylius/Bundle/CoreBundle/Cart/ItemResolver.php中。

在这个课程中有一个点

    $form = $this->formFactory->create('sylius_cart_item', $item, array('product' => $product));
    $form->submit($data);

目前,因为在我的请求对象中,$ form-&gt; submit($ data)上没有任何sylius_cart_item表单数组,它给我一个OptionVariant等错误。

因此,对于临时解决方案,我已经输入了以下代码,我对此不满意,但我会在其他时间深入挖掘。

我现在已经以这种方式手动将表单添加到请求中:

$form = $this->formFactory->create('sylius_cart_item', $item, array('product' => $product));
$data->request->set('sylius_cart_item', array('variant' => array('consultation' => '1'),
      'quantity' => '1', '_token' => '220f9b9dcbe4eec547dbd0aa2e32d632de354d91'));
$form->submit($data);

当然,令牌将动态生成 - &gt;上面是一个例子。此外,变量选择,即咨询等,是我在我的控制器和放大器中构建的。无论如何模型,所以我总是可以通过它。

如果有更好的方法,请告诉我们!