Как программно добавить товар с вариантами в корзину в sylius?

В настоящее время я использую Sylius Ecommerce для веб-сайта и хочу автоматически добавлять продукт в корзину по запросу пользователя.

В свой контроллер я вставил:

$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>

person Tragaknight    schedule 28.01.2015    source источник


Ответы (2)


Вы можете использовать сервис Resolver.

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

Решатель используется для создания нового элемента на основе запроса пользователя.

С Уважением.

person BigBoss    schedule 28.01.2015
comment
$ item = $ this- ›get ('sylius.repository.cart') -› createNew (); однако проще, это не то, что я искал, в основном мне нужно получить вариант продукта, который я добавляю - у продукта есть конкретный вариант соответствия, который мне нужно добавить в корзину, а не исходный продукт в качестве пункт - person Tragaknight; 28.01.2015

Изменить: проблема была на самом деле в классе /vendor/sylius/sylius/src/Sylius/Bundle/CoreBundle/Cart/ItemResolver.php.

В этом классе есть момент, когда он

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

На данный момент, поскольку в моем объекте запроса нет массива формы sylius_cart_item в $ form-> submit ($ data), он выдает мне ошибку с 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);

Конечно, токен будет генерироваться динамически -> пример выше. Кроме того, варианты выбора, например, консультации и т. Д., Я в любом случае встраиваю в свой контроллер и модель, поэтому я всегда могу их обработать.

Пожалуйста, дайте мне знать, если есть лучший способ сделать это!

person Tragaknight    schedule 28.01.2015