Силий не запомнил корзину после добавления товара

Я использую Sylius Cart и Order Bundles и пытаюсь добавить товар в корзину и показать сводку товаров в корзине. Проблема, с которой я столкнулся, заключается в том, что Symfony / Sylius забывает, что он создал корзину и добавил в нее элементы.

Если я щелкну ссылку, ведущую на страницу добавления корзины sylius, созданную с помощью

{{ path('sylius_cart_item_add', {'productId': class.ClassID}) }}

Ошибка не возникает. Если я загляну в базу данных, я вижу, что в таблице sylius_cart и таблице sylius_cart_item была создана новая запись с правильной информацией; однако на странице сводки корзины ничего не отображается и кажется, что корзина пуста.

Если я попытаюсь добавить еще один товар, он создаст еще одну новую корзину и сразу забудет, что сделал корзину.

У меня загружаются следующие пакеты в AppKernel.php

public function registerBundles()
{
        $bundles = array(
            //bundles for using the shopping cart
            new FOS\RestBundle\FOSRestBundle(),
            new JMS\SerializerBundle\JMSSerializerBundle($this),
            new Sylius\Bundle\ResourceBundle\SyliusResourceBundle(),
            new WhiteOctober\PagerfantaBundle\WhiteOctoberPagerfantaBundle(),
            new Sylius\Bundle\MoneyBundle\SyliusMoneyBundle(),
            new Sylius\Bundle\OrderBundle\SyliusOrderBundle(),
            new Sylius\Bundle\CartBundle\SyliusCartBundle(),
            new Sylius\Bundle\SequenceBundle\SyliusSequenceBundle(),


            //bundles for styling with bootstrap 3
            new Mopa\Bundle\BootstrapBundle\MopaBootstrapBundle(),

            //mssql connection library
            new Realestate\MssqlBundle\RealestateMssqlBundle(),

            //default frameworks
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new CE\CEBundle\CEBundle(),
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
}

Мой класс ItemResolver выглядит так

namespace CE\CEBundle\Cart;

use Sylius\Component\Cart\Model\CartItemInterface;
use Sylius\Component\Cart\Resolver\ItemResolverInterface;
use Sylius\Component\Cart\Resolver\ItemResolvingException;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;

class ItemResolver implements ItemResolverInterface
{
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }


    public function resolve(CartItemInterface $item, $data)
    {
        //grab the product ID
        $productId = $data->get('productId');


        if (!$productId || !$product = $this->getProductRepository()->find($productId)) {
            throw new ItemResolvingException('Requested product was not found');
        }

        $item->setProductId($product->getId());
        $item->setUnitPrice($product->getClassFee() * 100);

        return $item;
    }

    private function getProductRepository()
    {
        return $this->entityManager->getRepository('CEBundle:Product');
    }
}

Мой класс CartItem выглядит так

namespace CE\CEBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Sylius\Component\Cart\Model\CartItem as BaseCartItem;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_cart_item")
 */
class CartItem extends BaseCartItem
{
    /**
     * @ORM\Column(type="string", name="product_id", length=8)
     */
    private $productId;

    public function getProductId()
    {
        return $this->productId;
    }

    public function setProductId($Id)
    {
        $this->productId = $Id;
    }
}

В моем config.yml есть следующая конфигурация

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }

framework:
    #esi:             ~
    #translator:      { fallback: "%locale%" }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form: ~

    csrf_protection: ~
    validation:      { enable_annotations: true }
    templating:
        engines: ['twig']
        #assets_version: SomeVersionScheme
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
        name: SYLIUS_SESSION
        cookie_lifetime: 72000
    fragments:       ~
    http_method_override: true

# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"

# Assetic Configuration
assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [ ]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        #yui_css:
        #    jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
            mssqlDB:
                driver_class:   Realestate\MssqlBundle\Driver\PDODblib\Driver
                host:     %db.other.host%
                dbname:   %db.other.db_name%
                user:     %db.other.user%
                password: %db.other.password%
        # if using pdo_sqlite as your database driver, add the path in parameters.yml
        # e.g. database_path: "%kernel.root_dir%/data/data.db3"
        # path:     "%database_path%"

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    CEBundle: ~
            mssqlDB:
                connection: mssqlDB
                mappings:
                    CEBundle: ~

        auto_generate_proxy_classes: "%kernel.debug%"
        #auto_mapping: true


# Swiftmailer Configuration
swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:     { type: memory }

#sylius configuration
sylius_cart:
    resolver: ce.cart_item_resolver
    classes: ~
    provider: sylius.cart_provider.default
    storage:  sylius.storage.session

sylius_order:
    driver: doctrine/orm
    classes:
        order_item:
            model: CE\CEBundle\Entity\CartItem

sylius_sequence:
    driver: doctrine/orm

#mopa configuration for forms and bootstrap
mopa_bootstrap:
    form:
        checkbox_label: 'widget'

Следует отметить, что если я смотрю вкладку «Ресурсы» в инструментах разработчика Chrome, я вижу, что SYLIUS_SESSION действительно устанавливается, когда я добавляю элемент в корзину.

Я попытался изменить хранилище на cookie вместо сеанса и пролить документы, но я не понимаю, что делать, чтобы это исправить. Я предполагаю, что это, вероятно, что-то маленькое, я просто не знаю, что это такое.

Заранее благодарим вас за любую помощь.


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


Ответы (1)


В вашем config.yml файле вы используете sylius.cart_provider.default, что означает, что вам нужно получить текущий поставщик Sylius Cart, прежде чем добавлять в него товар.

Это означает, что в вашем контроллере вам нужно будет получить службу cart_provider следующим образом:

// gets the current cart
$cart = $this->get('sylius.cart_provider')->getCart();

После этого вы можете создать $item, как при вызове метода ItemResolver::resolve(), и добавить товар в корзину.

Вам также может потребоваться добавить события диспетчера для корзины ITEM_ADD_INITIALIZE, CART_CHANGE и т. Д. В свой код, чтобы товары действительно отображались в корзине.

Взгляните на класс CartItemEvent для этого. Если вам понадобится помощь, дайте мне знать.

person Tragaknight    schedule 29.01.2015
comment
Думаю, это уже происходит. Маршруты вызывают CartController или CartItemController. Каждый из них вызывает $ cart = $ this- ›getCurrentCart () перед тем, как что-либо делать, что определено в Controll.php как $ this-› getProvider () - ›getCart (); getProvider определяется как return $ this- ›container-› get ('sylius.cart_provider'); - person Kogenta; 29.01.2015
comment
В этом случае вы также используете форму для CartItemType, чтобы ее переменные отправлялись в запросе на путь sylius_cart_item_add, т.е. CartItemController? Как и во время обработки в ItemResolver, если ваши отправленные данные не содержат данных в переменной $ form- ›submit ($ data) (которая поступает через объект запроса) в ItemResolver (исходный класс, а не ваш класс), тогда элемент не будет добавлен в корзину. Кроме того, вам необходимо отправить соответствующие события в CartItemEvent, чтобы корзина увидела добавленные элементы. - person Tragaknight; 30.01.2015
comment
Приносим извинения за задержку с ответом. Я использую CartItemController по умолчанию. Создание ссылки для добавления элемента, как в примере здесь ссылка Поэтому я просто передаю идентификатор элемента, который хочу добавить в действие. Код для действия добавления можно найти здесь, ссылка, на которую перенаправляет на страницу сводки после добавления элемента в корзину и создания записей в базе данных для корзины и элемента корзины (которые отображаются в базе данных). - person Kogenta; 04.02.2015
comment
Я не уверен, что мне следует изменить в этой настройке, поскольку она в основном использует контроллеры и классы по умолчанию. Я просто расширил ItemResolver и BaseCartItem, чтобы добавить детали для моей собственной информации о продукте, как описано в Инструкции по CartBundle Извините, если мне здесь не хватает чего-то простого. - person Kogenta; 04.02.2015
comment
Я также попытался использовать отправку формы, как в примере здесь, для шаблонов веточек, как показано здесь я получил тот же результат в база данных, но на странице сводки, на которую выполняется перенаправление, нет информации о корзине. - person Kogenta; 04.02.2015
comment
Получаете ли вы какие-либо флэш-сообщения на странице корзины после того, как все прошло и вы видите, что оно добавлено в базу данных, но не на странице сводной информации о корзине? - person Tragaknight; 05.02.2015
comment
Неа. Я проверил флэшбэг на наличие ошибок и уведомлений. Ничего такого. - person Kogenta; 12.02.2015