commerce_add_to_cart_link-2.0.0/src/AddToCartLink.php
src/AddToCartLink.php
<?php
namespace Drupal\commerce_add_to_cart_link;
use Drupal\commerce_product\Entity\ProductVariation;
use Drupal\commerce_product\Entity\ProductVariationInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\Url;
/**
* Defines a helper class for constructing add to cart links.
*/
class AddToCartLink {
/**
* The product variation.
*
* @var \Drupal\commerce_product\Entity\ProductVariationInterface
*/
protected ProductVariationInterface $variation;
/**
* The cart link token.
*
* @var \Drupal\commerce_add_to_cart_link\CartLinkTokenInterface
*/
protected CartLinkTokenInterface $cartLinkToken;
/**
* Constructs a new AddToCartLink object.
*
* @param \Drupal\commerce_product\Entity\ProductVariationInterface $variation
* The product variation.
* @param \Drupal\commerce_add_to_cart_link\CartLinkTokenInterface|null $cart_link_token
* The cart link token.
*/
public function __construct(ProductVariationInterface $variation, ?CartLinkTokenInterface $cart_link_token = NULL) {
$this->variation = $variation;
$this->cartLinkToken = $cart_link_token;
if (is_null($this->cartLinkToken)) {
@trigger_error('Calling ' . __METHOD__ . ' without the $cart_link_token argument is deprecated in commerce_add_to_cart_link:2.1.0 and it will be required in commerce_add_to_cart_link:2.2.0. See https://www.drupal.org/node/3512138', E_USER_DEPRECATED);
// @phpstan-ignore-next-line
$this->cartLinkToken = \Drupal::service('commerce_add_to_cart_link.token');
}
}
/**
* AddToCartLink convenience constructor.
*
* @param int $id
* The product variation ID.
*
* @return \Drupal\commerce_add_to_cart_link\AddToCartLink
* The constructed object.
*/
public static function fromVariationId(int $id): static {
/** @var \Drupal\commerce_product\Entity\ProductVariationInterface|null $variation */
if ($variation = ProductVariation::load($id)) {
return new static($variation, \Drupal::service('commerce_add_to_cart_link.token'));
}
else {
throw new \UnexpectedValueException('Can not load product variation: %s', $id);
}
}
/**
* Generate a render array for an add-to-cart link.
*
* @return array
* The render array.
*/
public function build(): array {
$build = [
'#theme' => 'commerce_add_to_cart_link',
'#url' => $this->url(),
'#product_variation' => $this->variation,
];
$metadata = $this->metadata();
$metadata->applyTo($build);
return $build;
}
/**
* Generate URL object for an add-to-cart link.
*
* @return \Drupal\Core\Url
* The URL object.
*/
public function url(): Url {
return Url::fromRoute('commerce_add_to_cart_link.page',
[
'commerce_product' => $this->variation->getProductId(),
'commerce_product_variation' => $this->variation->id(),
'token' => $this->cartLinkToken->generate($this->variation),
]
);
}
/**
* Generate metadata for an add-to-cart link.
*
* @return \Drupal\Core\Render\BubbleableMetadata
* The metadata object.
*/
public function metadata(): BubbleableMetadata {
return BubbleableMetadata::createFromRenderArray([
'#cache' => [
'contexts' => ['user.roles'],
'tags' => ['config:commerce_add_to_cart_link.settings'],
],
]);
}
}
