viewData = $viewData; $this->variants = $this->viewData['variants']; $this->storeSettings = new StoreSettings(); $signName = $this->storeSettings->get('currency'); $this->sign = CurrenciesHelper::getCurrencySign($signName); $this->showCartButton = Arr::get($this->viewData, 'show_cart_button', 1); $productPerRow = absint(Arr::get($this->viewData, 'product_per_row', 4)); $this->productPerRow = $productPerRow > 0 ? $productPerRow : 4; } public function render() { $groupBy = Arr::get($this->viewData, 'group_by', 'repeat_interval'); $groups = $this->groupVariants($groupBy); $useTabs = $groupBy !== 'none' && count($groups) > 1; ?>
renderTabs($groups); ?>
renderVariant($this->variants); ?>
$this->variants]; } $key = $groupBy === 'payment_type' ? 'payment_type' : 'repeat_interval'; $groups = []; foreach ($this->variants as $variant) { $bucket = Arr::get($variant, "other_info.{$key}") ?: 'onetime'; if (Arr::get($variant, 'other_info.installment') === 'yes') { $bucket = 'installment'; } $groups[$bucket][] = $variant; } return $groups; } protected function renderTabs(array $groups) { $groupKeys = array_keys($groups); $activeIndex = (int) Arr::get($this->viewData, 'active_tab', 0); if (!isset($groupKeys[$activeIndex])) { $activeIndex = 0; } $activeKey = $groupKeys[$activeIndex]; $activeVariantMap = Arr::get($this->viewData, 'active_variant', []); if (!\is_array($activeVariantMap)) { $activeVariantMap = []; } ?>
getTabLabel($key)); ?>
$groupVariants) : $isActive = $key === $activeKey; $currentActiveVariant = Arr::get($activeVariantMap, $key, ''); ?>
renderVariant($groupVariants); ?>
__('Daily', 'fluent-cart'), 'weekly' => __('Weekly', 'fluent-cart'), 'monthly' => __('Monthly', 'fluent-cart'), 'yearly' => __('Yearly', 'fluent-cart'), 'onetime' => __('One Time', 'fluent-cart'), 'subscription' => __('Subscription', 'fluent-cart'), 'installment' => __('Installment', 'fluent-cart'), ]; return $labels[$key] ?? ucfirst(str_replace('_', ' ', $key)); } protected function isVariantActive($variant): bool { $groupBy = Arr::get($this->viewData, 'group_by', 'repeat_interval'); if ($groupBy === 'none') { $variantGroupKey = 'onetime'; } else { $groupKey = $groupBy === 'payment_type' ? 'payment_type' : 'repeat_interval'; $variantGroupKey = Arr::get($variant, "other_info.{$groupKey}") ?: 'onetime'; if (Arr::get($variant, 'other_info.installment') === 'yes') { $variantGroupKey = 'installment'; } } $activeVariantMap = Arr::get($this->viewData, 'active_variant', []); if (!\is_array($activeVariantMap)) { $activeVariantMap = []; } $variantId = Arr::get($variant, 'id'); return isset($activeVariantMap[$variantGroupKey]) && $activeVariantMap[$variantGroupKey] == $variantId; } public function renderVariant(?array $variants = null) { $variants = $variants ?? $this->variants; foreach ($variants as $index => $variant) { $this->repeatInterval = Arr::get($variant, 'other_info.repeat_interval', null); $this->itemPrice = esc_html(Helper::toDecimal(Arr::get($variant, 'item_price', 0), false, false, false)); $this->comparePrice = esc_html(Helper::toDecimal(Arr::get($variant, 'compare_price', 0), false, false, false, false)); $otherInfo = Arr::get($variant, 'other_info', null); $this->paymentInfo = Helper::generateSubscriptionInfo($otherInfo, $this->itemPrice); $this->setupFeeInfo = Helper::generateSetupFeeInfo($otherInfo); $featureDescription = Arr::get($variant, 'other_info.description', ''); $this->featureItems = explode("\n", $featureDescription); $this->paymentType = Arr::get($variant, 'payment_type'); $licenseMeta = Arr::get($variant, 'product.licenses_meta.meta_value', null); $this->licenseEnable = Arr::get($licenseMeta, 'enabled', 'no'); $isActiveVariant = $this->isVariantActive($variant); // Parse badge settings from viewData $badgeData = Arr::get($this->viewData, 'badge', ''); $badgeConfig = is_string($badgeData) ? self::stringToAssocArray($badgeData) : (is_array($badgeData) ? $badgeData : []); $badgeText = Arr::get($badgeConfig, 'text', __('Recommended', 'fluent-cart')); $badgePosition = Arr::get($badgeConfig, 'position', 'right'); ?>
sign) ?> itemPrice) ?> repeatInterval)): ?> /repeatInterval) ?>
sign) ?> sign, $this->comparePrice ); ?> comparePrice); ?>
paymentInfo); ?> setupFeeInfo); ?>
renderFeatureItems(); ?>
showCartButton == 1 && $this->paymentType !== 'subscription' && $this->licenseEnable !== 'yes' ) { $this->renderCartButton($variant); } if (Arr::get($this->viewData, 'show_checkout_button', 1) == 1) { $this->renderDirectCheckoutButton($variant); } ?>
viewData, 'button_options', ''); $buttonValues = self::stringToAssocArray($buttonOptions); $buttonText = !empty($buttonValues['cartButtonText']) ? $buttonValues['cartButtonText'] : __('Add To Cart', 'fluent-cart'); if ($variant['stock_status'] === Helper::IN_STOCK) { $data = [ 'add_to_cart_button_text' => $buttonText, 'product_id' => Arr::get($variant, 'id', ''), 'quantity' => 1, 'variation_type' => Arr::get($variant, 'variation_type', ''), 'payment_type' => Arr::get($variant, 'payment_type', ''), 'variation_id' => Arr::get($variant, 'id', ''), ]; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped in view template echo AddToCartShortcode::make()->enqueueAssets()->render($data); } else { $this->renderOutOfStockButton(); } } public function renderOutOfStockButton() { ?> storeSettings->get('direct_checkout_button_text', __('Buy Now', 'fluent-cart')); $buttonOptions = Arr::get($this->viewData, 'button_options', ''); $buttonValues = self::stringToAssocArray($buttonOptions); $buttonText = !empty($buttonValues['text']) ? $buttonValues['text'] : $directCheckoutButtonText; $checkoutUrl = add_query_arg([ 'fluent-cart' => 'instant_checkout' ], site_url()); if ($variant['stock_status'] === Helper::IN_STOCK) { // Handle product parameters $productId = Arr::get($variant, 'id'); $quantity = Arr::get($this->viewData, 'quantity', 1); // Build base parameters $params = [ 'item_id' => $productId, 'quantity' => $quantity, ]; // Merge in any additional params $extraParams = Arr::get($this->viewData, 'url_params', ''); if (!empty($extraParams)) { // If it's a query string like "foo=bar&baz=qux" parse_str($extraParams, $extraArray); $params = array_merge($params, $extraArray); } $checkoutUrl = add_query_arg($params, $checkoutUrl); $data = [ 'direct_checkout_button_text' => $buttonText, 'checkout_url' => $checkoutUrl, 'product_id' => Arr::get($variant, 'id'), 'is_pricing_table' => true, 'quantity' => 1, 'variation_type' => Arr::get($variant, 'variation_type', ''), 'stock_availability' => Arr::get($variant, 'stock_status', ''), 'variation_id' => Arr::get($variant, 'id', ''), ]; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped in view template echo DirectCheckoutShortcode::make()->enqueueAssets()->render($data); } } private static function stringToAssocArray($string): array { $result = []; if (!empty($string)) { $pairs = explode(', ', $string); foreach ($pairs as $pair) { // Check if $pair contains '=' using Str::contains() before splitting if (Str::contains($pair, '=')) { list($key, $value) = explode('=', $pair); $result[trim($key)] = trim($value); } } } return $result; } }