Я пользуюсь 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 вместо сеанса и пролистывать документы, но я не знаю, что делать, чтобы это исправить. Я думаю, что это, вероятно, что-то маленькое, я просто не знаю, что это такое.
Спасибо за любую помощь заранее.
В вашем 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
класс для этого. Если вам нужна помощь, дайте мне знать.
Других решений пока нет …