tra('Add to cart'), 'documentation' => tra('PluginAddToCart'), 'description' => tra('Add a product to the shopping cart.'), 'prefs' => [ 'wikiplugin_addtocart', 'payment_feature' ], 'filter' => 'wikicontent', 'format' => 'html', 'introduced' => 5, 'iconname' => 'cart', 'tags' => [ 'basic' ], 'params' => [ 'code' => [ 'required' => true, 'name' => tra('Product code'), 'description' => tra('Unique identifier for the product. Two products with the same code will be the same and the information used will be the one of the first in.'), 'filter' => 'text', 'since' => '5.0', 'default' => '', ], 'description' => [ 'required' => true, 'name' => tra('Description'), 'description' => tra('Label for the product in the cart.'), 'filter' => 'text', 'since' => '5.0', 'default' => '', ], 'producttype' => [ 'required' => false, 'name' => tra('Product Type'), 'description' => tra('The product type that is being sold, which will affect fulfillment, for example, standard product, event ticket'), 'filter' => 'text', 'default' => '', 'since' => '7.0', ], 'productclass' => [ 'required' => false, 'name' => tra('Product Class'), 'description' => tra('The class the product belongs to'), 'filter' => 'text', 'default' => '', 'since' => '7.0', ], 'productbundle' => [ 'required' => false, 'name' => tra('Product Bundle'), 'description' => tra('The bundle the product belongs to. Will automatically add other products in the same class to the cart'), 'filter' => 'text', 'default' => '', 'since' => '7.0', ], 'bundleclass' => [ 'required' => false, 'name' => tra('Bundle Class'), 'description' => tra('The class the bundle belongs to'), 'filter' => 'text', 'default' => '', 'since' => '7.0', ], 'price' => [ 'required' => true, 'name' => tra('Price'), 'description' => tra('The price to charge for the item.'), 'filter' => 'text', 'since' => '5.0', 'default' => '', ], 'href' => [ 'required' => false, 'name' => tra('Location'), 'description' => tr('URL of the product\'s information. The URL may be relative or absolute (begin with %0http://%1).', '', ''), 'filter' => 'url', 'since' => '5.0', 'default' => '', ], 'label' => [ 'required' => false, 'name' => tra('Button label'), 'description' => tra('Text for the submit button. default:') . ' ' . '"' . tra('Add to cart') . '"', 'since' => '6.0', 'filter' => 'text', 'default' => 'Add to cart', ], 'eventcode' => [ 'required' => false, 'name' => tra('Associated event code'), 'description' => tra('Unique identifier for the event that is associated to the product.'), 'filter' => 'text', 'default' => '', 'since' => '7.0', ], 'autocheckout' => [ 'required' => false, 'name' => tra('Automatically check out'), 'description' => tra('Automatically check out for purchase and send the user to pay (this is disabled when there is already something in the cart)'), 'since' => '7.0', 'filter' => 'text', 'default' => 'n', ], 'hidequantity' => [ 'required' => false, 'name' => tra('Hide Quantity'), 'description' => tra('Hide the quantity field so you can create buy now button for a single item, quantity = 1 (not available with the exchange feature)'), 'since' => '17.0', 'filter' => 'alpha', 'options' => [ ['text' => tra('No'), 'value' => 'n'], ['text' => tra('Yes'), 'value' => 'y'] ], 'default' => 'n', ], 'onbehalf' => [ 'required' => false, 'name' => tra('Buy on behalf of'), 'description' => tra('Allows the selection of user to make purchase on behalf of'), 'filter' => 'text', 'default' => 'n', 'since' => '7', ], 'forceanon' => [ 'required' => false, 'name' => tra('Shop as anonymous always'), 'description' => tra('Add to cart as anonymous shopper even if logged in'), 'filter' => 'text', 'default' => 'n', 'since' => '7.0', ], 'forwardafterfree' => [ 'required' => false, 'name' => tra('Forward to this URL after free purchase'), 'description' => tra('Forward to this URL after free purchase'), 'filter' => 'url', 'default' => '', 'since' => '7.0', ], 'exchangeorderitemid' => [ 'required' => false, 'name' => tra('Order Item ID to exchange product'), 'description' => tra('Used in conjunction with exchange feature'), 'filter' => 'int', 'default' => '', 'profile_reference' => 'tracker_item', 'since' => '7.0', ], 'exchangetoproductid' => [ 'required' => false, 'name' => tra('Product ID to exchange to'), 'desctiption' => tra('Used in conjunction with exchange feature'), 'filter' => 'int', 'since' => '5.0', 'default' => '', ], 'exchangeorderamount' => [ 'required' => false, 'name' => tra('Amount of new product to exchange for'), 'description' => tra('Should normally be set to the amount of products in the order being exchanged'), 'filter' => 'int', 'default' => 1, 'since' => '7.0', ], 'ajaxaddtocart' => [ 'required' => false, 'name' => tra('Ajax add to cart feature'), 'description' => tra('Attempts to turn on Ajax for the cart'), 'filter' => 'alpha', 'since' => '7.0', 'default' => 'n', 'options' => [ ['text' => '', 'value' => ''], ['text' => tra('Yes'), 'value' => 'y'], ['text' => tra('No'), 'value' => 'n'] ], ], 'weight' => [ 'required' => false, 'name' => tra('Weight'), 'description' => tra('The weight of the item.'), 'filter' => 'text', 'default' => '', 'since' => '12.1', ], ], ]; } function wikiplugin_addtocart($data, $params) { global $cartuserlist, $globalperms; $smarty = TikiLib::lib('smarty'); $userlib = TikiLib::lib('user'); $headerlib = TikiLib::lib('header'); $cartlib = TikiLib::lib('cart'); if (! session_id()) { session_start(); } if (! isset($params['code'], $params['description'], $params['price'])) { return WikiParser_PluginOutput::argumentError(array_diff([ 'code', 'description', 'price'], array_keys($params))); } $plugininfo = wikiplugin_addtocart_info(); $default = []; foreach ($plugininfo['params'] as $key => $param) { $default["$key"] = $param['default']; } $params = array_merge($default, $params); // once forceanon is set it will have to affect the whole shopping cart otherwise it will be inconsistent if ($params['forceanon'] == 'y') { $_SESSION['forceanon'] = 'y'; } foreach ($params as &$p) { $p = trim($p); // remove some line ends picked up in pretty tracker } $params['price'] = preg_replace('/[^-?\d^\.^,]/', '', $params['price']); $smarty->assign('params', $params); if ($params['onbehalf'] == 'y' && $globalperms->payment_admin) { $smarty->assign('onbehalf', 'y'); // Do not load the user list unless it is needed, this light function is not as light as one would expect if (! isset($cartuserlist)) { $cartuserlist = $userlib->get_users_light(); } $smarty->assign('cartuserlist', $cartuserlist); } if (! empty($params['exchangeorderitemid']) && ! empty($params['exchangetoproductid'])) { $smarty->assign('hideamountfield', 'y'); } else { $smarty->assign('hideamountfield', 'n'); } if (is_numeric($params['productclass'])) { $information_form = $cartlib->get_missing_user_information_form($params['productclass'], 'required'); $missing_information = $cartlib->get_missing_user_information_fields($params['productclass'], 'required'); $skip_information_form = $cartlib->skip_user_information_form_if_not_missing($params['productclass']) && empty($missing_information); if ($information_form && ! $skip_information_form) { $headerlib->add_jq_onready( "$('form.addProductToCartForm{$params['productclass']}') .cartProductClassMissingForm({ informationForm: '$information_form' });" ); } } if ($params['ajaxaddtocart'] == 'y') { $headerlib->add_jq_onready("$('.wp_addtocart_form').cartAjaxAdd();"); $smarty->assign('form_data', ' data-params=\'' . str_replace("'", "\u0027", json_encode(array_filter($params))) . '\''); } else { $smarty->assign('form_data', ''); } if ($_SERVER['REQUEST_METHOD'] == 'POST') { global $jitPost, $user; $quantity = $jitPost->quantity->int(); if ($jitPost->code->text() == $params['code'] && $quantity > 0) { $previous_cart_content = $cartlib->get_content(); $addedOk = $cartlib->add_to_cart($params, $jitPost); global $tikiroot, $prefs; $access = TikiLib::lib('access'); $tikilib = TikiLib::lib('tiki'); if ($addedOk && $params['autocheckout'] == 'y' && empty($previous_cart_content)) { $invoice = $cartlib->requestPayment(); if ($invoice) { $paymenturl = 'tiki-payment.php?invoice=' . (int)$invoice; $paymenturl = $tikilib->httpPrefix(true) . $tikiroot . $paymenturl; $tokenpaymenturl = ''; if (! $user || $params['forceanon'] == 'y' && ! Perms::get('payment', $invoice)->manual_payment) { // token access needs to be an optional feature // and needs to depend on auth_token_access pref require_once 'lib/auth/tokens.php'; $tokenlib = AuthTokens::build($prefs); $tokenpaymenturl = $tokenlib->includeToken($paymenturl, ['Temporary Shopper','Anonymous']); } if ($globalperms->payment_admin || Perms::get('payment', $invoice)->manual_payment || empty($tokenpaymenturl)) { // if able to do manual payment it means it is admin and don't need token $access->redirect($paymenturl, tr('The order was recorded and is now awaiting payment. Reference number is %0.', $invoice)); } else { $access->redirect($tokenpaymenturl, tr('The order was recorded and is now awaiting payment. Reference number is %0.', $invoice)); } } else { if (! empty($params['forwardafterfree'])) { $access->redirect($params['forwardafterfree'], tr('Your free order of %0 (%1) has been processed. An email has been sent to you for your records.', $params['description'], $quantity)); } else { $access->redirect($_SERVER['REQUEST_URI'], tr('Your free order of %0 (%1) has been processed', $params['description'], $quantity)); } } die; } $access->redirect($_SERVER['REQUEST_URI'], tr('%0 (%1) was added to your cart', $params['description'], $quantity)); } } return $smarty->fetch('wiki-plugins/wikiplugin_addtocart.tpl'); }