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

Я пользуюсь 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 вместо сеанса и пролистывать документы, но я не знаю, что делать, чтобы это исправить. Я думаю, что это, вероятно, что-то маленькое, я просто не знаю, что это такое.

Спасибо за любую помощь заранее.

3

Решение

В вашем 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 класс для этого. Если вам нужна помощь, дайте мне знать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]