View source
<?php
namespace Drupal\uc_cart;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Messenger\MessengerTrait;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Url;
use Drupal\node\Entity\Node;
use Drupal\uc_cart\Entity\CartItem;
class Cart implements CartInterface {
use MessengerTrait;
use StringTranslationTrait;
protected $id;
public function __construct($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function getContents() {
$items = [];
$result = \Drupal::entityQuery('uc_cart_item')
->condition('cart_id', $this->id)
->sort('cart_item_id', 'ASC')
->execute();
if (!empty($result)) {
$items = \Drupal::entityTypeManager()
->getStorage('uc_cart_item')
->loadMultiple(array_keys($result));
}
\Drupal::moduleHandler()
->alter('uc_cart', $items);
return $items;
}
public function addItem($nid, $qty = 1, array $data = NULL, $msg = TRUE) {
$node = Node::load($nid);
if (is_null($data) || !isset($data['module'])) {
$data['module'] = 'uc_product';
}
$result = \Drupal::moduleHandler()
->invokeAll('uc_add_to_cart', [
$nid,
$qty,
$data,
]);
if (is_array($result) && !empty($result)) {
foreach ($result as $row) {
if ($row['success'] === FALSE) {
if (isset($row['message']) && !empty($row['message'])) {
$message = $row['message'];
}
else {
$message = $this
->t('Sorry, that item is not available for purchase at this time.');
}
if (isset($row['silent']) && $row['silent'] === TRUE) {
return $this
->getAddItemRedirect();
}
else {
$this
->messenger()
->addError($message);
}
$query = \Drupal::request()->query;
return Url::fromRoute('<current>', [], [
'query' => UrlHelper::filterQueryParameters($query
->all()),
]);
}
}
}
$result = \Drupal::entityQuery('uc_cart_item')
->condition('cart_id', $this->id)
->condition('nid', $nid)
->condition('data', serialize($data))
->execute();
if (empty($result)) {
$item_entity = CartItem::create([
'cart_id' => $this->id,
'nid' => $nid,
'qty' => $qty,
'data' => $data,
]);
$item_entity
->save();
if ($msg) {
$this
->messenger()
->addMessage($this
->t('<strong>@product-title</strong> added to <a href=":url">your shopping cart</a>.', [
'@product-title' => $node
->label(),
':url' => Url::fromRoute('uc_cart.cart')
->toString(),
]));
}
}
else {
if ($msg) {
$this
->messenger()
->addMessage($this
->t('Your item(s) have been updated.'));
}
$item_entity = CartItem::load(current(array_keys($result)));
$qty += $item_entity->qty->value;
\Drupal::moduleHandler()
->invoke($data['module'], 'uc_update_cart_item', [
$nid,
$data,
min($qty, 999999),
$this->id,
]);
}
Cache::invalidateTags([
'uc_cart:' . $this->id,
]);
$session = \Drupal::service('session');
$session
->set('uc_cart_order_rebuild', TRUE);
return $this
->getAddItemRedirect();
}
protected function getAddItemRedirect() {
$query = \Drupal::request()->query;
$destination = $query
->get('destination');
if (!empty($destination)) {
return Url::fromUri('base:' . $destination);
}
$session = \Drupal::service('session');
$session
->set('uc_cart_last_url', Url::fromRoute('<current>')
->toString());
$redirect = \Drupal::config('uc_cart.settings')
->get('add_item_redirect');
if ($redirect != '<none>') {
return Url::fromUri('base:' . $redirect);
}
else {
return Url::fromRoute('<current>', [], [
'query' => UrlHelper::filterQueryParameters($query
->all()),
]);
}
}
public function emptyCart() {
$result = \Drupal::entityQuery('uc_cart_item')
->condition('cart_id', $this->id)
->execute();
if (!empty($result)) {
$storage = \Drupal::entityTypeManager()
->getStorage('uc_cart_item');
$entities = $storage
->loadMultiple(array_keys($result));
$storage
->delete($entities);
}
}
public function isShippable() {
$items = $this
->getContents();
foreach ($items as $item) {
if (uc_order_product_is_shippable($item)) {
return TRUE;
}
}
return FALSE;
}
}