Ошибка после установки Convead на joomla virtuemart

More
8 years 7 months ago #5734 by Максим
Здравствуйте.

Установил плагин convead для joomla 2.5.28 virtuemart 2.6.22, включил плагин, и у меня перестал добавляться товар в корзину, отключил его. Быть может что-то подскажете, наверняка кто-то уже с этим сталкивался, очень хочется попробовать ваш сервис? Может какая инструкция более подробная есть. Сайт kamni-furnitura.ru

Please Log in or Create an account to join the conversation.

More
8 years 7 months ago #5735 by JoomLine
Самая подробная инструкция, что есть. github.com/Convead/joomla_convead/blob/master/README.md

Please Log in or Create an account to join the conversation.

More
8 years 7 months ago #5736 by Максим
к сожалению, у меня нет в этом файле такой строчки, быть может Вы поможете, куда моем файле это

Если у вас магазин на VirtueMart, то вам придется внести одно небольшое изменение в исходный код магазина:

Откройте файл components/com_virtuemart/helpers/cart.php
Найдите функцию public function add(...) {...}
В конце этой функции перед строчкой if ($updateSession== false) return false; вставьте следующий код:

/* Convead hack */
JPluginHelper::importPlugin('vmcustom');
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('plgVmOnAddToCart',array($this));
/* End Convead hack */

можно вставить

<?php

/**
*
* Category model for the cart
*
* @package VirtueMart
* @subpackage Cart
* @author RolandD
* @author Max Milbers
* @link www.virtuemart.net
* @copyright Copyright (c) 2004 - 2013 VirtueMart Team. All rights reserved.
* @license www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* @version $Id: cart.php 6557 2012-10-17 19:16:22Z Milbo $
*/
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');


/**
* Model class for the cart
* Very important, use ALWAYS the getCart function, to get the cart from the session
* @package VirtueMart
* @subpackage Cart
* @author Max Milbers
*/
class VirtueMartCart {

// var $productIds = array();
var $products = array();
var $_inCheckOut = false;
var $_dataValidated = false;
var $_blockConfirm = false;
var $_confirmDone = false;
var $_inConfirm = false;
var $_redirect = false;
var $_redirect_disabled = false;
var $_lastError = null; // Used to pass errmsg to the cart using addJS()

var $vendorId = 1;
var $lastVisitedCategoryId = 0;
var $virtuemart_shipmentmethod_id = 0;
var $virtuemart_paymentmethod_id = 0;
var $automaticSelectedShipment = false;
var $automaticSelectedPayment = false;
var $BT = 0;
var $ST = 0;
var $tosAccepted = false;
var $customer_comment = '';
var $couponCode = '';
var $order_language = '';
var $cartData = null;
var $lists = null;
var $order_number=null; // added to solve emptying cart for payment notification
var $order_pass=null;
var $virtuemart_order_id = false;
var $customer_number=null;
// var $user = null;
// var $prices = null;
var $pricesUnformatted = null;
var $pricesCurrency = null;
var $paymentCurrency = null;
var $STsameAsBT = TRUE;
var $productParentOrderable = TRUE;
var $_triesValidateCoupon = array();
var $layout ;
var $layoutPath='';

private static $_cart = null;

var $useSSL = 1;
// static $first = true;

private function __construct() {
$this->useSSL = VmConfig::get('useSSL',0);
$this->useXHTML = false;
$this->layout = VmConfig::get('cartlayout','default');
}

/**
*
* @author Max Milbers
* @param bool $setCart: set the Cart into Session
* @param array $options : options for getSession
* @param null $cartData: if not empty, do no get the cart data from session
* @return null|VirtueMartCart
*/
public static function getCart($setCart=true, $options = array(), $cartData=NULL) {

//What does this here? for json stuff?
if (!class_exists('JTable')
)require(JPATH_VM_LIBRARIES . DS . 'joomla' . DS . 'database' . DS . 'table.php');
// JTable::addIncludePath(JPATH_VM_ADMINISTRATOR . DS . 'tables');

if(empty(self::$_cart)){
if (empty($cartData)) {
$session = JFactory::getSession($options);
$cartSession = $session->get('vmcart', 0, 'vm');
} else {
$cartSession=$cartData;
}

if (!empty($cartSession)) {
$sessionCart = unserialize( $cartSession );

self::$_cart = new VirtueMartCart;

self::$_cart->products = $sessionCart->products;
self::$_cart->vendorId = $sessionCart->vendorId;
self::$_cart->lastVisitedCategoryId = $sessionCart->lastVisitedCategoryId;
self::$_cart->virtuemart_shipmentmethod_id = $sessionCart->virtuemart_shipmentmethod_id;
self::$_cart->virtuemart_paymentmethod_id = $sessionCart->virtuemart_paymentmethod_id;
self::$_cart->automaticSelectedShipment = $sessionCart->automaticSelectedShipment;
self::$_cart->automaticSelectedPayment = $sessionCart->automaticSelectedPayment;
self::$_cart->BT = $sessionCart->BT;
self::$_cart->ST = $sessionCart->ST;
self::$_cart->tosAccepted = $sessionCart->tosAccepted;
self::$_cart->customer_comment = base64_decode($sessionCart->customer_comment);
self::$_cart->couponCode = $sessionCart->couponCode;
self::$_cart->_triesValidateCoupon = $sessionCart->_triesValidateCoupon;
self::$_cart->order_language = $sessionCart->order_language;
self::$_cart->cartData = $sessionCart->cartData;
self::$_cart->order_number = $sessionCart->order_number;
self::$_cart->virtuemart_order_id = $sessionCart->virtuemart_order_id;
self::$_cart->lists = $sessionCart->lists;

self::$_cart->_inConfirm = $sessionCart->_inConfirm;
self::$_cart->pricesCurrency = $sessionCart->pricesCurrency;
self::$_cart->paymentCurrency = $sessionCart->paymentCurrency;

self::$_cart->_inCheckOut = $sessionCart->_inCheckOut;
self::$_cart->_dataValidated = $sessionCart->_dataValidated;
self::$_cart->_confirmDone = $sessionCart->_confirmDone;
self::$_cart->STsameAsBT = $sessionCart->STsameAsBT;
self::$_cart->customer_number = $sessionCart->customer_number;
self::$_cart->layout = $sessionCart->layout;
self::$_cart->layoutPath = $sessionCart->layoutPath;
}

}

if(empty(self::$_cart)){
self::$_cart = new VirtueMartCart;
}

if ( $setCart == true ) {
self::$_cart->setPreferred();
self::$_cart->setCartIntoSession();
}

return self::$_cart;
}



/*
* Set non product info in object
*/
public function setPreferred() {

$userModel = VmModel::getModel('user');
$user = $userModel->getCurrentUser();

if (empty($this->BT) || (!empty($this->BT) && count($this->BT) <=1) ) {
foreach ($user->userInfo as $address) {
if ($address->address_type == 'BT') {
$this->saveAddressInCart((array) $address, $address->address_type,false);
}
}
}

if (empty($this->virtuemart_shipmentmethod_id) && !empty($user->virtuemart_shipmentmethod_id)) {
$this->virtuemart_shipmentmethod_id = $user->virtuemart_shipmentmethod_id;
}

if (empty($this->virtuemart_paymentmethod_id) && !empty($user->virtuemart_paymentmethod_id)) {
$this->virtuemart_paymentmethod_id = $user->virtuemart_paymentmethod_id;
}

//$this->tosAccepted is due session stuff always set to 0, so testing for null does not work
if((!empty($user->agreed) || !empty($this->BT)) && !VmConfig::get('agree_to_tos_onorder',0) ){
$this->tosAccepted = 1;
}

//if(empty($this->customer_number) or ($user->virtuemart_user_id!=0 and strpos($this->customer_number,'nonreg_')!==FALSE ) ){
if($user->virtuemart_user_id!=0 and empty($this->customer_number) or strpos($this->customer_number,'nonreg_')!==FALSE){
$this->customer_number = $userModel ->getCustomerNumberById();
}

if(empty($this->customer_number) or strpos($this->customer_number,'nonreg_')!==FALSE){
$firstName = empty($this->BT)? '':$this->BT;
$lastName = empty($this->BT)? '':$this->BT;
$email = empty($this->BT)? '':$this->BT;
$this->customer_number = 'nonreg_'.$firstName.$lastName.$email;
}

}

/**
* Set the cart in the session
*
* @author RolandD
*
* @access public
*/
public function setCartIntoSession() {

$session = JFactory::getSession();

$sessionCart = new stdClass();

$products = array();
if ($this->products) {
foreach($this->products as $key =>$product){

//Important DO NOT UNSET product_price
//unset($product->product_price);
//unset($product->prices);
unset($product->pricesUnformatted);
unset($product->mf_name);
unset($product->mf_desc);
unset($product->mf_url);

unset($product->salesPrice);
unset($product->basePriceWithTax);
unset($product->subtotal);
unset($product->subtotal_with_tax);
unset($product->subtotal_tax_amount);
unset($product->subtotal_discount);

unset($product->product_price_vdate);
unset($product->product_price_edate);
}
}
// $sessionCart->products = $products;
$sessionCart->products = $this->products;
// echo '<pre>'.print_r($products,1).'</pre>';die;
$sessionCart->vendorId = $this->vendorId;
$sessionCart->lastVisitedCategoryId = $this->lastVisitedCategoryId;
$sessionCart->virtuemart_shipmentmethod_id = $this->virtuemart_shipmentmethod_id;
$sessionCart->virtuemart_paymentmethod_id = $this->virtuemart_paymentmethod_id;
$sessionCart->automaticSelectedShipment = $this->automaticSelectedShipment;
$sessionCart->automaticSelectedPayment = $this->automaticSelectedPayment;
$sessionCart->order_number = $this->order_number;
$sessionCart->virtuemart_order_id = $this->virtuemart_order_id;

$sessionCart->BT = $this->BT;
$sessionCart->ST = $this->ST;
$sessionCart->tosAccepted = $this->tosAccepted;
$sessionCart->customer_comment = base64_encode($this->customer_comment);
$sessionCart->couponCode = $this->couponCode;
$sessionCart->_triesValidateCoupon = $this->_triesValidateCoupon;
$sessionCart->order_language = $this->order_language;
$sessionCart->cartData = $this->cartData;
$sessionCart->lists = $this->lists;

$sessionCart->pricesCurrency = $this->pricesCurrency;
$sessionCart->paymentCurrency = $this->paymentCurrency;

//private variables
$sessionCart->_inConfirm = $this->_inConfirm;
$sessionCart->_inCheckOut = $this->_inCheckOut;
$sessionCart->_dataValidated = $this->_dataValidated;
$sessionCart->_confirmDone = $this->_confirmDone;
$sessionCart->STsameAsBT = $this->STsameAsBT;
$sessionCart->customer_number = $this->customer_number;
$sessionCart->layout = $this->layout;
$sessionCart->layoutPath = $this->layoutPath;

if(!empty($sessionCart->pricesUnformatted)){
foreach($sessionCart->pricesUnformatted as &$prices){
if(is_array($prices)){
foreach($prices as &$price){
if(!is_array($price)){
$price = (string)$price;
}
}
} else {
$prices = (string)$prices;
}
}
}

// $pr = serialize($sessionCart->pricesUnformatted);
// vmdebug('$sessionCart',$sessionCart);
$session->set('vmcart', serialize($sessionCart),'vm');

}

/**
* Remove the cart from the session
*
* @author Max Milbers
* @access public
*/
public function removeCartFromSession() {
$session = JFactory::getSession();
$session->set('vmcart', 0, 'vm');
}

public function setDataValidation($valid=false) {
$this->_dataValidated = $valid;
// $this->setCartIntoSession();
}

public function getDataValidated() {
return $this->_dataValidated;
}

public function getInCheckOut() {
return $this->_inCheckOut;
}

public function setOutOfCheckout(){
$this->_inCheckOut = false;
$this->_dataValidated = false;
$this->_inConfirm = false;
$this->setCartIntoSession();
session_write_close();
session_start();
}

public function blockConfirm(){
$this->_blockConfirm = true;
}

/**
* Set the last error that occured.
* This is used on error to pass back to the cart when addJS() is invoked.
* @param string $txt Error message
* @author Oscar van Eijk
*/
private function setError($txt) {
$this->_lastError = $txt;
}

/**
* Retrieve the last error message
* @return string The last error message that occured
* @author Oscar van Eijk
*/
public function getError() {
return ($this->_lastError);
}

/**
* For one page checkouts, disable with this the redirects
* @param bool $bool
*/
public function setRedirectDisabled($bool = TRUE){
$this->_redirect_disabled = $bool;
}


/**
* Add a product to the cart
*
* @author RolandD
* @author Max Milbers
* @access public
*/
public function add($virtuemart_product_ids=null,&$errorMsg='') {
$mainframe = JFactory::getApplication();
$success = false;
$post = JRequest::get('default');

if(empty($virtuemart_product_ids)){
$virtuemart_product_ids = JRequest::getVar('virtuemart_product_id', array(), 'default', 'array'); //is sanitized then
}

if (empty($virtuemart_product_ids)) {
$mainframe->enqueueMessage(JText::_('COM_VIRTUEMART_CART_ERROR_NO_PRODUCT_IDS', false));
return false;
}

$pModel = VmModel::getModel('product');
$products = array();

//Iterate through the prod_id's and perform an add to cart for each one
foreach ($virtuemart_product_ids as $p_key => $virtuemart_product_id) {

$quantityPost = (int) $post[$p_key];

if($quantityPost === 0) continue;

$tmpProduct = $pModel->getProduct($virtuemart_product_id, true, false,true,$quantityPost);
$products[] = $tmpProduct;

if ( VmConfig::get('oncheckout_show_images',1)){
$pModel->addImages($tmpProduct,1);
}


// trying to save some space in the session table
$product = new stdClass();
$product -> virtuemart_manufacturer_id = $tmpProduct -> virtuemart_manufacturer_id;
// $product -> mf_name = $tmpProduct -> mf_name;
$product -> slug = $tmpProduct -> slug;
// $product -> mf_desc = $tmpProduct -> mf_desc;
// $product -> mf_url = $tmpProduct -> mf_url;
$product -> published = $tmpProduct -> published;

$product -> virtuemart_product_price_id = $tmpProduct -> virtuemart_product_price_id;
$product -> virtuemart_product_id = $tmpProduct -> virtuemart_product_id;
$product -> virtuemart_shoppergroup_id = $tmpProduct -> virtuemart_shoppergroup_id;
$product -> product_price = $tmpProduct -> product_price;
$product -> override = $tmpProduct -> override;
$product -> product_override_price = $tmpProduct -> product_override_price;

$product -> product_tax_id = $tmpProduct -> product_tax_id;
$product -> product_discount_id = $tmpProduct -> product_discount_id;
$product -> product_currency = $tmpProduct -> product_currency;
// $product -> product_price_vdate = $tmpProduct -> product_price_vdate;
// $product -> product_price_edate = $tmpProduct -> product_price_edate;
$product -> virtuemart_vendor_id = $tmpProduct -> virtuemart_vendor_id;
$product -> product_parent_id = $tmpProduct -> product_parent_id;
$product -> product_sku = $tmpProduct -> product_sku;
$product -> product_name = $tmpProduct -> product_name;
$product -> product_s_desc = $tmpProduct -> product_s_desc;

$product -> product_weight = $tmpProduct -> product_weight;
$product -> product_weight_uom = $tmpProduct -> product_weight_uom;
$product -> product_length = $tmpProduct -> product_length;
$product -> product_width = $tmpProduct -> product_width;
$product -> product_height = $tmpProduct -> product_height;
$product -> product_lwh_uom = $tmpProduct -> product_lwh_uom;

$product -> product_in_stock = $tmpProduct -> product_in_stock;
$product -> product_ordered = $tmpProduct -> product_ordered;
$product -> product_available_date = $tmpProduct -> product_available_date;
$product -> product_availability = $tmpProduct -> product_availability;

$product -> product_sales = $tmpProduct -> product_sales;
$product -> product_unit = $tmpProduct -> product_unit;
$product -> product_packaging = $tmpProduct -> product_packaging;
$product -> min_order_level = $tmpProduct -> min_order_level;
$product -> max_order_level = $tmpProduct -> max_order_level;
$product -> virtuemart_media_id = $tmpProduct -> virtuemart_media_id;
$product -> step_order_level= $tmpProduct ->step_order_level;

if(!empty($tmpProduct ->images)) $product->image = $tmpProduct -> images[0];

$product -> categories = $tmpProduct -> categories;
$product -> virtuemart_category_id = $tmpProduct -> virtuemart_category_id;
$product -> category_name = $tmpProduct -> category_name;

$product -> link = $tmpProduct -> link;
$product -> packaging = $tmpProduct -> packaging;

if (!empty($tmpProduct -> customfieldsCart) ) $product -> customfieldsCart = true; //why do we have this here?


//Why reloading the product wiht same name $product ?
// passed all from $tmpProduct and relaoding it second time ????
// $tmpProduct = $this->getProduct((int) $virtuemart_product_id); seee before !!!
// $product = $this->getProduct((int) $virtuemart_product_id);
// Who ever noted that, yes that is exactly right that way, before we have a full object, with all functions
// of all its parents, we only need the data of the product, so we create a dummy class which contains only the data
// This is extremly important for performance reasons, else the sessions becomes too big.
// Check if we have a product
if ($product) {
if(!empty( $post[$p_key])){
$virtuemart_category_idPost = (int) $post[$p_key];
$product->virtuemart_category_id = $virtuemart_category_idPost;
}

$productKey = $product->virtuemart_product_id;
//VmConfig::$echoDebug = true;
//vmdebug('$post["customPrice"] ',$post);
// INDEX NOT FOUND IN JSON HERE
// changed name field you know exactly was this is
if (isset($post)) {

$product->customPrices = $post;
if (isset($post)){

//if(!class_exists('vmFilter'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmfilter.php');

if(!is_array($post)){
$customPlugins = (array) $post;
} else {
$customPlugins = $post;
}

foreach($customPlugins as &$customPlugin){
if(is_array($customPlugin)){
foreach($customPlugin as &$customParams){
if(is_array($customParams)){
foreach($customParams as &$customParam){
/* the plugin returned an array of values */
if(is_array($customParam)){
foreach ($customParam as &$customParamItem) {
$value = JComponentHelper::filterText($customParamItem);
$value = (string)preg_replace('#on[a-z](.+?)\)#si','',$value);//replace start of script onclick() onload()...
$value = trim(str_replace('"', ' ', $value),"'") ;
$customParamItem = (string)preg_replace('#^\'#si','',$value);
}
} else {
$value = JComponentHelper::filterText($customParam);
$value = (string)preg_replace('#on[a-z](.+?)\)#si','',$value);//replace start of script onclick() onload()...
$value = trim(str_replace('"', ' ', $value),"'") ;
$customParam = (string)preg_replace('#^\'#si','',$value);
}
//$value = vmFilter::hl( $customPl,array('deny_attribute'=>'*'));
//to strong
/* $value = preg_replace('@<[\/\!]*?[^<>]*?>@si','',$value);//remove all html tags */
//lets use instead

}
}
}
}
}

$product->customPlugin = json_encode($customPlugins);

}

$productKey .= '::';

foreach ($product->customPrices as $customPrice) {
$found = false;
foreach ($customPrice as $customId => $custom_fieldId) {
vmdebug('The $customId => $custom_fieldId '.$productKey,$customId,$custom_fieldId);
//MarkerVarMods
if ( is_array($custom_fieldId) ) {
foreach ($custom_fieldId as $userfieldId => $userfield) {
//$productKey .= (int)$customId . ':' . (int)$userfieldId . ';';
//$productKey .= (int)$custom_fieldId . ':' .(int)$customId . ';';
foreach($tmpProduct -> customfieldsCart as $k => $customfieldsCart){
if(isset($customfieldsCart->options) and is_array($customfieldsCart->options)){
$keys= array_keys($customfieldsCart->options);
foreach( $keys as $virtuemart_customfield_id){
if($virtuemart_customfield_id==$custom_fieldId){
$productKey .= (int)$custom_fieldId . ':' .(int)$customId . ';';
unset($tmpProduct -> customfieldsCart[$k]);
$found = true;
}
}
} else {
if($customfieldsCart->virtuemart_customfield_id==$custom_fieldId){
$productKey .= (int)$custom_fieldId . ':' .(int)$customId . ';';
unset($tmpProduct -> customfieldsCart[$k]);
$found = true;
}
}
}
}
} else {
//TODO productCartId
foreach($tmpProduct -> customfieldsCart as $k => $customfieldsCart){
if(isset($customfieldsCart->options) and is_array($customfieldsCart->options)){
$keys= array_keys($customfieldsCart->options);
foreach( $keys as $virtuemart_customfield_id){
if($virtuemart_customfield_id==$custom_fieldId){
$productKey .= (int)$custom_fieldId . ':' .(int)$customId . ';';
unset($tmpProduct -> customfieldsCart[$k]);
$found = true;
}
}
} else {
if($customfieldsCart->virtuemart_customfield_id==$custom_fieldId){
$productKey .= (int)$custom_fieldId . ':' .(int)$customId . ';';
unset($tmpProduct -> customfieldsCart[$k]);
$found = true;
}
}
}
}

if(!$found){

foreach($tmpProduct -> customfieldsCart as $k => $cfCart){
if($cfCart->field_type=='E'){
$productKey .= (int)$cfCart->virtuemart_customfield_id . ':' . (int) $cfCart->virtuemart_custom_id . ';';
vmdebug('The $product->customPrice as $customId => $custom_fieldId '.$productKey,$cfCart);
$found = true;
}
}

if(!$found){
vmdebug('Cart variant was not found and no fallback found',$tmpProduct -> customfieldsCart,$customfieldsCart);
vmError('Cart variant was not found and no fallback found');
}
}
}
}

}

// Add in the quantity in case the customfield plugins need it
$product->quantity = (int)$quantityPost;


if(!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS.DS.'vmcustomplugin.php');
JPluginHelper::importPlugin('vmcustom');
$dispatcher = JDispatcher::getInstance();
// on returning false the product have not to be added to cart
$addToCartReturnValues = $dispatcher->trigger('plgVmOnAddToCart',array(&$product));
foreach ($addToCartReturnValues as $returnValue) {
if ( $returnValue === false )
continue 2;
}


if (array_key_exists($productKey, $this->products) && (empty($product->customPlugin)) ) {

$errorMsg = JText::_('COM_VIRTUEMART_CART_PRODUCT_UPDATED');
$totalQuantity = $this->products[$productKey]->quantity+ $quantityPost;
if ($this->checkForQuantities($product,$totalQuantity ,$errorMsg)) {
$this->products[$productKey]->quantity = $totalQuantity;

} else {

continue;
}
} else {
if ( !empty($product->customPlugin)) {
$productKey .= count($this->products);

}
if ($this->checkForQuantities($product, $quantityPost,$errorMsg)) {
$this->products[$productKey] = $product;
$product->quantity = $quantityPost;

//$mainframe->enqueueMessage(JText::_('COM_VIRTUEMART_CART_PRODUCT_ADDED'));
} else {
// $errorMsg = JText::_('COM_VIRTUEMART_CART_PRODUCT_OUT_OF_STOCK');
continue;
}
}
$success = true;
} else {
$mainframe->enqueueMessage(JText::_('COM_VIRTUEMART_PRODUCT_NOT_FOUND', false));
return false;
}
}
if ($success== false) return false ;
// End Iteration through Prod id's
$this->setCartIntoSession();
return $products;
}

/**
* Remove a product from the cart
*
* @author RolandD
* @param array $cart_id the cart IDs to remove from the cart
* @access public
*/
public function removeProductCart($prod_id=0) {
// Check for cart IDs
if (empty($prod_id))
$prod_id = JRequest::getVar('cart_virtuemart_product_id');
unset($this->products[$prod_id]);
if(isset($this->cartProductsData[$prod_id])){
// hook for plugin action "remove from cart"
if(!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS.DS.'vmcustomplugin.php');
JPluginHelper::importPlugin('vmcustom');
$dispatcher = JDispatcher::getInstance();
$addToCartReturnValues = $dispatcher->trigger('plgVmOnRemoveFromCart',array($this,$prod_id));
unset($this->cartProductsData[$prod_id]);
}

$this->setCartIntoSession();
return true;
}

/**
* Update a product in the cart
*
* @author Max Milbers
* @param array $cart_id the cart IDs to remove from the cart
* @access public
*/
public function updateProductCart($cart_virtuemart_product_id=0,$quantity = null) {

if (empty($cart_virtuemart_product_id)) $cart_virtuemart_product_id = vRequest::getString('cart_virtuemart_product_id');
if ($quantity === null) $quantity = vRequest::getInt('quantity');

$updated = false;
if (array_key_exists($cart_virtuemart_product_id, $this->products)) {
if (!empty($quantity)) {
if ($this->checkForQuantities($this->products[$cart_virtuemart_product_id], $quantity)) {
$this->products[$cart_virtuemart_product_id]->quantity = $quantity;
$updated = true;
}
} else {
//Todo when quantity is 0, the product should be removed, maybe necessary to gather in array and execute delete func
unset($this->products[$cart_virtuemart_product_id]);
$updated = true;
}
// Save the cart
$this->setCartIntoSession();
}


if ($updated)
return true;
else
return false;
}


/**
* Get the category ID from a product ID
*
* @author RolandD, Patrick Kohl
* @access public
* @return mixed if found the category ID else null
*/
public function getCardCategoryId($virtuemart_product_id) {
$db = JFactory::getDBO();
$q = 'SELECT `virtuemart_category_id` FROM `#__virtuemart_product_categories` WHERE `virtuemart_product_id` = ' . (int) $virtuemart_product_id . ' LIMIT 1';
$db->setQuery($q);
return $db->loadResult();
}

/** Checks if the quantity is correct
*
* @author Max Milbers
*/
private function checkForQuantities($product, &$quantity=0,&$errorMsg ='') {

$stockhandle = VmConfig::get('stockhandle','none');
// Check for a valid quantity
if (!is_numeric( $quantity)) {
$errorMsg = JText::_('COM_VIRTUEMART_CART_ERROR_NO_VALID_QUANTITY', false);
// $this->_error[] = 'Quantity was not a number';
$this->setError($errorMsg);
vmInfo($errorMsg,$product->product_name);
return false;
}
// Check for negative quantity
if ($quantity < 1) {
// $this->_error[] = 'Quantity under zero';
$errorMsg = JText::_('COM_VIRTUEMART_CART_ERROR_NO_VALID_QUANTITY', false);
$this->setError($errorMsg);
vmInfo($errorMsg,$product->product_name);
return false;
}

// update the stock info from the database
$product_model = VmModel::getModel('product');
$product = $product_model->getProduct($product->virtuemart_product_id);

// Check to see if checking stock quantity
if ($stockhandle!='none' && $stockhandle!='risetime') {

$productsleft = $product->product_in_stock - $product->product_ordered;
// TODO $productsleft = $product->product_in_stock - $product->product_ordered - $quantityincart ;
if ($quantity > $productsleft ){
if($productsleft>0 and $stockhandle=='disableadd'){
$quantity = $productsleft;
$errorMsg = JText::sprintf('COM_VIRTUEMART_CART_PRODUCT_OUT_OF_QUANTITY',$quantity);
$this->setError($errorMsg);
vmInfo($errorMsg.' '.$product->product_name);
// $mainframe->enqueueMessage($errorMsg);
} else {
$errorMsg = JText::_('COM_VIRTUEMART_CART_PRODUCT_OUT_OF_STOCK');
$this->setError($errorMsg); // Private error retrieved with getError is used only by addJS, so only the latest is fine
// todo better key string
vmInfo($errorMsg. ' '.$product->product_name);
// $mainframe->enqueueMessage($errorMsg);
return false;
}
}
}

// Check for the minimum and maximum quantities
$min = $product->min_order_level;
if ($min != 0 && $quantity < $min) {
$errorMsg = JText::sprintf('COM_VIRTUEMART_CART_MIN_ORDER', $min);
$this->setError($errorMsg);
vmInfo($errorMsg,$product->product_name);
return false;
}

$max = $product->max_order_level;
if ($max != 0 && $quantity > $max) {
$errorMsg = JText::sprintf('COM_VIRTUEMART_CART_MAX_ORDER', $max);
$this->setError($errorMsg);
vmInfo($errorMsg,$product->product_name);
return false;
}

$step = $product->step_order_level;
if ($step != 0 && ($quantity%$step)!= 0) {
$errorMsg = JText::sprintf('COM_VIRTUEMART_CART_STEP_ORDER', $step);
$this->setError($errorMsg);
vmInfo($errorMsg,$product->product_name);
return false;
}
return true;
}


/**
* Validate the coupon code. If ok,. set it in the cart
* @param string $coupon_code Coupon code as entered by the user
* @author Oscar van Eijk
* TODO Change the coupon total/used in DB ?
* @access public
* @return string On error the message text, otherwise an empty string
*/
public function setCouponCode($coupon_code) {
if(empty($coupon_code)) return false;
if (!class_exists('CouponHelper')) {
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'coupon.php');
}
if(!isset($this->pricesUnformatted)){
$this->getCartPrices();
}

if(!in_array($coupon_code,$this->_triesValidateCoupon)){
$this->_triesValidateCoupon[] = $coupon_code;
}

if(count($this->_triesValidateCoupon)<8){
$msg = CouponHelper::ValidateCouponCode($coupon_code, $this->pricesUnformatted);;
} else{
$msg = JText::_('COM_VIRTUEMART_CART_COUPON_TOO_MANY_TRIES');
}

if (!empty($msg)) {
$this->couponCode = '';
$this->_dataValidated = false;
$this->_blockConfirm = true;
$this->getCartPrices();
$this->setCartIntoSession();
return $msg;
}
$this->couponCode = $coupon_code;
$this->setCartIntoSession();
return JText::_('COM_VIRTUEMART_CART_COUPON_VALID');

}

/**
* Check the selected shipment data and store the info in the cart
* @param integer $shipment_id Shipment ID taken from the form data
* @author Oscar van Eijk
*/
public function setShipment($shipment_id) {

$this->virtuemart_shipmentmethod_id = $shipment_id;
$this->setCartIntoSession();

}

public function setPaymentMethod($virtuemart_paymentmethod_id) {
$this->virtuemart_paymentmethod_id = $virtuemart_paymentmethod_id;
$this->setCartIntoSession();
}

function confirmDone() {

$this->checkoutData();
if ($this->_dataValidated) {
$this->_confirmDone = true;
$this->confirmedOrder();
} else {
$mainframe = JFactory::getApplication();
$mainframe->redirect(JRoute::_('index.php?option=com_virtuemart&view=cart', FALSE), JText::_('COM_VIRTUEMART_CART_CHECKOUT_DATA_NOT_VALID'));
}
}

function checkout($redirect=true) {

$this->checkoutData($redirect);

if ($this->_dataValidated && $redirect) {
$mainframe = JFactory::getApplication();
$mainframe->redirect(JRoute::_('index.php?option=com_virtuemart&view=cart', FALSE), JText::_('COM_VIRTUEMART_CART_CHECKOUT_DONE_CONFIRM_ORDER'));
}

}

private function redirecter($relUrl,$redirectMsg){

$this->_dataValidated = false;
$app = JFactory::getApplication();
if($this->_redirect and !$this->_redirect_disabled){

$this->setCartIntoSession();
//This is an internal redirect, therefore $this->useXHTML is always false
$app->redirect(JRoute::_($relUrl,false,$this->useSSL), $redirectMsg);
return false;
} else {
$this->_inCheckOut = false;
$this->setCartIntoSession();
return false;
}
}

public function getFilterCustomerComment(){

$this->customer_comment = JRequest::getVar('customer_comment', $this->customer_comment);
// no HTML TAGS but permit all alphabet
$value = preg_replace('@<[\/\!]*?[^<>]*?>@si','',$this->customer_comment);//remove all html tags
$value = (string)preg_replace('#on[a-z](.+?)\)#si','',$value);//replace start of script onclick() onload()...
$value = trim(str_replace('"', ' ', $value),"'") ;
$this->customer_comment = (string)preg_replace('#^\'#si','',$value);//replace ' at start
}

private function checkoutData($redirect = true) {

$this->_redirect = $redirect;
$this->_inCheckOut = true;
$this->setCartIntoSession();
session_write_close();
session_start();
$this->tosAccepted = JRequest::getInt('tosAccepted', $this->tosAccepted);
$this->STsameAsBT = JRequest::getInt('STsameAsBT', $this->STsameAsBT);
$this->order_language = JRequest::getVar('order_language', $this->order_language);
$this->getFilterCustomerComment();


$this->cartData = $this->prepareCartData();
$this->prepareCartPrice();

if (count($this->products) == 0) {
return $this->redirecter('index.php?option=com_virtuemart', JText::_('COM_VIRTUEMART_CART_NO_PRODUCT'));
} else {
foreach ($this->products as $product) {
$redirectMsg = $this->checkForQuantities($product, $product->quantity);
if (!$redirectMsg) {
return $this->redirecter('index.php?option=com_virtuemart&view=cart', $redirectMsg);
}
}
}

// Check if a minimun purchase value is set
if (($redirectMsg = $this->checkPurchaseValue()) != null) {
return $this->redirecter('index.php?option=com_virtuemart&view=cart' , $redirectMsg);
}

$validUserDataBT = self::validateUserData();

if(!isset($this->tosAccepted)){
$userFieldsModel = VmModel::getModel('Userfields');
$agreed = $userFieldsModel->getUserfield('agreed','name');
$this->tosAccepted = $agreed->default;
}
if (empty($this->tosAccepted)) {

$userFieldsModel = VmModel::getModel('Userfields');
$agreed = $userFieldsModel->getUserfield('agreed','name');

if(empty($this->tosAccepted) and !empty($agreed->required) and $validUserDataBT!==-1){
$redirectMsg = null;// JText::_('COM_VIRTUEMART_CART_PLEASE_ACCEPT_TOS');
$this->tosAccepted = false;
vmInfo('COM_VIRTUEMART_CART_PLEASE_ACCEPT_TOS');
return $this->redirecter('index.php?option=com_virtuemart&view=cart' , $redirectMsg);
}
}

if ($validUserDataBT!==true) { //Important, we can have as result -1,false and true.
return $this->redirecter('index.php?option=com_virtuemart&view=user&task=editaddresscheckout&addrtype=BT' , '');
}

if($this->STsameAsBT!==0){
if($this->_confirmDone){
$this->ST = $this->BT;
} else {
$this->ST = 0;
}

} else {
if (($this->selected_shipto = JRequest::getVar('shipto', null)) !== null) {
JModel::addIncludePath(JPATH_VM_ADMINISTRATOR . DS . 'models');
$userModel = JModel::getInstance('user', 'VirtueMartModel');
$stData = $userModel->getUserAddressList(0, 'ST', $this->selected_shipto);
$stData = get_object_vars($stData[0]);
if($this->validateUserData('ST', $stData)!=-1 and $this->validateUserData('ST', $stData)>0){
$this->ST = $stData;
}
}
//Only when there is an ST data, test if all necessary fields are filled
$validUserDataST = self::validateUserData('ST');
if ($validUserDataST!==true) {
return $this->redirecter('index.php?option=com_virtuemart&view=user&task=editaddresscheckout&addrtype=ST' , '');
}

}

if(VmConfig::get('oncheckout_only_registered',0)) {
$currentUser = JFactory::getUser();
if(empty($currentUser->id)){
$redirectMsg = JText::_('COM_VIRTUEMART_CART_ONLY_REGISTERED');
return $this->redirecter('index.php?option=com_virtuemart&view=user&task=editaddresscheckout&addrtype=BT' , $redirectMsg);
}
}

//vmdebug('ValidateCouponCode ValidateCouponCode ValidateCouponCode',$this->couponCode);
// Test Coupon
if (!empty($this->couponCode)) {
//$prices = $this->getCartPrices();
if (!class_exists('CouponHelper')) {
require(JPATH_VM_SITE . DS . 'helpers' . DS . 'coupon.php');
}
if(!in_array($this->couponCode,$this->_triesValidateCoupon)){
$this->_triesValidateCoupon[] = $this->couponCode;
}
if(count($this->_triesValidateCoupon)<8){
$redirectMsg = CouponHelper::ValidateCouponCode($this->couponCode, $this->pricesUnformatted);
} else{
$redirectMsg = JText::_('COM_VIRTUEMART_CART_COUPON_TOO_MANY_TRIES');
}

if (!empty($redirectMsg)) {
$this->couponCode = '';
$this->getCartPrices();
$this->setCartIntoSession();
return $this->redirecter('index.php?option=com_virtuemart&view=cart' , $redirectMsg);
}
}
$redirectMsg = '';

//Test Shipment and show shipment plugin
if (empty($this->virtuemart_shipmentmethod_id)) {
return $this->redirecter('index.php?option=com_virtuemart&view=cart&task=edit_shipment' , $redirectMsg);
} else if ($this->virtuemart_shipmentmethod_id != JRequest::getInt('virtuemart_shipmentmethod_id', $this->virtuemart_shipmentmethod_id)) {
$obj = new VirtueMartControllerCart();
$obj->setshipment();
return $this->redirecter('index.php?option=com_virtuemart&view=cart' , $redirectMsg);
} else {
if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');
JPluginHelper::importPlugin('vmshipment');
//Add a hook here for other shipment methods, checking the data of the choosed plugin
$dispatcher = JDispatcher::getInstance();
$retValues = $dispatcher->trigger('plgVmOnCheckoutCheckDataShipment', array( $this));
//vmdebug('plgVmOnCheckoutCheckDataShipment CART', $retValues);
foreach ($retValues as $retVal) {
if ($retVal === true) {
break; // Plugin completed succesfull; nothing else to do
} elseif ($retVal === false) {
// Missing data, ask for it (again)
return $this->redirecter('index.php?option=com_virtuemart&view=cart&task=edit_shipment' , $redirectMsg);
// NOTE: inactive plugins will always return null, so that value cannot be used for anything else!
}
}
}

//Test Payment and show payment plugin
if($this->pricesUnformatted>0.0){
if (empty($this->virtuemart_paymentmethod_id)) {
return $this->redirecter('index.php?option=com_virtuemart&view=cart&task=editpayment' , $redirectMsg);
} else if ($this->virtuemart_paymentmethod_id != JRequest::getInt('virtuemart_paymentmethod_id', $this->virtuemart_paymentmethod_id)) {
vmdebug('checkoutData $this->virtuemart_paymentmethod_id not equal request',$this->virtuemart_paymentmethod_id);
$obj = new VirtueMartControllerCart();
$obj->setpayment();
return $this->redirecter('index.php?option=com_virtuemart&view=cart' , $redirectMsg);
} else {
if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php');
JPluginHelper::importPlugin('vmpayment');
//Add a hook here for other payment methods, checking the data of the choosed plugin
$dispatcher = JDispatcher::getInstance();
$retValues = $dispatcher->trigger('plgVmOnCheckoutCheckDataPayment', array( $this));

foreach ($retValues as $retVal) {
if ($retVal === true) {
break; // Plugin completed succesful; nothing else to do
} elseif ($retVal === false) {
// Missing data, ask for it (again)
vmdebug('checkoutData payment plugin is missing data, trigger plgVmOnCheckoutCheckDataPayment',$this->virtuemart_paymentmethod_id);
return $this->redirecter('index.php?option=com_virtuemart&view=cart&task=editpayment' , $redirectMsg);
// NOTE: inactive plugins will always return null, so that value cannot be used for anything else!
}
}
}
}


//Show cart and checkout data overview
$this->_inCheckOut = false;

if($this->_blockConfirm){
$this->_dataValidated = false;
$this->setCartIntoSession();
return $this->redirecter('index.php?option=com_virtuemart&view=cart','');
} else {

$this->_dataValidated = true;
$this->setCartIntoSession();
return true;
}

}

/**
* Check if a minimum purchase value for this order has been set, and if so, if the current
* value is equal or hight than that value.
* @author Oscar van Eijk
* @return An error message when a minimum value was set that was not eached, null otherwise
*/
private function checkPurchaseValue() {

$vendor = VmModel::getModel('vendor');
$vendor->setId($this->vendorId);
$store = $vendor->getVendor();
if ($store->vendor_min_pov > 0) {
$prices = $this->getCartPrices();
if ($prices < $store->vendor_min_pov) {
if (!class_exists('CurrencyDisplay'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance();
return JText::sprintf('COM_VIRTUEMART_CART_MIN_PURCHASE', $currency->priceDisplay($store->vendor_min_pov));
}
}
return null;
}

/**
* Test userdata if valid
*
* @author Max Milbers
* @param String if BT or ST
* @param Object If given, an object with data address data that must be formatted to an array
* @return redirectMsg, if there is a redirectMsg, the redirect should be executed after
*/
private function validateUserData($type='BT', $obj = null) {

if(empty($obj)){
$obj = $this->{$type};
}

$usersModel = VmModel::getModel('user');

return $usersModel->validateUserData($obj,$type);

}

/**
* This function is called, when the order is confirmed by the shopper.
*
* Here are the last checks done by payment plugins.
* The mails are created and send to vendor and shopper
* will show the orderdone page (thank you page)
*
*/
function confirmedOrder() {

//Just to prevent direct call
if ($this->_dataValidated && $this->_confirmDone and !$this->_inCheckOut ) {

if($this->_inConfirm){
vmdebug('Already in CONFIRM,.. RETURN');
return false;
}

//We set this in the trigger of the plugin. so old plugins keep the old behaviour
//$this->_inConfirm = true;
//$this->setCartIntoSession();
//session_write_close();
//session_start();

$orderModel = VmModel::getModel('orders');

if (($this->virtuemart_order_id = $orderModel->createOrderFromCart($this)) === false) {
$mainframe = JFactory::getApplication();
JError::raiseWarning(500, 'No order created '.$orderModel->getError());
$mainframe->redirect(JRoute::_('index.php?option=com_virtuemart&view=cart', FALSE) );
}

$orderDetails = $orderModel ->getMyOrderDetails($this->virtuemart_order_id,$this->order_number,$this->order_pass);

if(!$orderDetails or empty($orderDetails)){
echo JText::_('COM_VIRTUEMART_CART_ORDER_NOTFOUND');
return;
}
$orderModel->notifyCustomer($this->virtuemart_order_id, $orderDetails);
$dispatcher = JDispatcher::getInstance();

JPluginHelper::importPlugin('vmcalculation');
JPluginHelper::importPlugin('vmcustom');
JPluginHelper::importPlugin('vmshipment');
JPluginHelper::importPlugin('vmpayment');

$returnValues = $dispatcher->trigger('plgVmConfirmedOrder', array($this, $orderDetails));

$lifetime = (24 * 60 * 60) * 180; //180 days
if(!class_exists('vmCrypt')){
require(VMPATH_ADMIN.DS.'helpers'.DS.'vmcrypt.php');
}

foreach($orderDetails as $product){
//We set a cookie for guests to allow that they can rate/review a product without logging in.
$app = JFactory::getApplication();
$key = 'productBought'.$product->virtuemart_product_id;
$v = vmCrypt::encrypt($key);
$app->input->cookie->set($key,$v,time() + $lifetime,'/');
}



// may be redirect is done by the payment plugin (eg: paypal)
// if payment plugin echos a form, false = nothing happen, true= echo form ,
// 1 = cart should be emptied, 0 cart should not be emptied
$this->_inConfirm = false;
$this->setCartIntoSession();
session_write_close();
session_start();
return $this->virtuemart_order_id;
}
return NULL;
}

/**
* emptyCart: Used for payment handling.
*
* @author Valerie Cartan Isaksen
*
*/
public function emptyCart(){

self::emptyCartValues($this);

$this->setCartIntoSession();
}


/**
* emptyCart: Used for payment handling.
*
* @author Valerie Cartan Isaksen
*
*/
static public function emptyCartValues($cart){

//We delete the old stuff
$cart->products = array();
$cart->_inCheckOut = false;
$cart->_dataValidated = false;
$cart->_confirmDone = false;
$cart->customer_comment = '';
$cart->couponCode = '';
$cart->order_language = '';
$cart->tosAccepted = null;
$cart->virtuemart_shipmentmethod_id = 0; //OSP 2012-03-14
$cart->virtuemart_paymentmethod_id = 0;
$cart->order_number=null;
$cart->virtuemart_order_id=false;
$cart->pricesUnformatted = null;
$cart->cartData = null;
$cart->_inConfirm = false;
}

function saveAddressInCart($data, $type, $putIntoSession = true) {

//vmdebug('email $data',$data);
// VirtueMartModelUserfields::getUserFields() won't work
if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php' );
$userFieldsModel = VmModel::getModel('userfields');
$prefix = '';

$prepareUserFields = $userFieldsModel->getUserFieldsFor('cart',$type);

if(!is_array($data)){
$data = get_object_vars($data);
}
//STaddress may be obsolete
if ($type == 'STaddress' || $type =='ST') {
$prefix = 'shipto_';
$this->STsameAsBT = 0;
} else { // BT
if(!empty($data)){
$this->tosAccepted = $data;
}

if(empty($data)){
$jUser = JFactory::getUser();
$address = $jUser->email;
//vmdebug('email was empty',$address);
}
}

$address = array();
foreach ($prepareUserFields as $fld) {
if(!empty($fld->name)){
$name = $fld->name;
/*if($fld->readonly){
vmdebug(' saveAddressInCart ',$data[$prefix.$name]);
}*/

if(!empty($data[$prefix.$name])){
$address[$name] = $data[$prefix.$name];
} else {
if($fld->required and isset($this->{$type}[$name])){ //Why we have this fallback to the already stored value?
$address[$name] = $this->{$type}[$name];
} else {
vmdebug('saveAddressInCart empty value for $name='.$name);
$address[$name] = '';
}
}
}
}

//dont store passwords in the session
unset($address);
unset($address);

$this->{$type} = $address;

if($putIntoSession){
$this->setCartIntoSession();
}

}

/**
* Returns ST address considering the set options, with fallback
* @author Max Milbers
*/
public function getST($name=0,$FBBT=true){

$addr = $this->ST;

if($this->STsameAsBT == 0){
if($FBBT){
if($name!==0){
if(!isset($this->ST[$name])){
$addr = $this->BT;
}
} else if($this->ST == 0){
$addr = $this->BT;
}
}
} else {
$addr = $this->BT;
}

if($name!==0){
return isset($addr[$name]) ? $addr[$name] : '';
} else {
return $addr!==0 ? $addr : array();
}

}

/*
* CheckAutomaticSelectedShipment
* If only one shipment is available for this amount, then automatically select it
*
* @author Valérie Isaksen
*/
function CheckAutomaticSelectedShipment($cart_prices, $checkAutomaticSelected ) {


if (!$checkAutomaticSelected or count($this->products) == 0 or VmConfig::get('automatic_shipment','1')!='1') {
return false;
}

$nbShipment = 0;
$virtuemart_shipmentmethod_id = 0;
if (!class_exists('vmPSPlugin')) {
require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');
}
JPluginHelper::importPlugin('vmshipment');
$shipCounter=0;
$dispatcher = JDispatcher::getInstance();
$returnValues = $dispatcher->trigger('plgVmOnCheckAutomaticSelectedShipment', array( $this,$cart_prices, &$shipCounter));

foreach ($returnValues as $returnValue) {
if ( isset($returnValue )) {
$nbShipment ++;
if ($returnValue) $virtuemart_shipmentmethod_id = $returnValue;
}
}
if ($nbShipment==1 && $virtuemart_shipmentmethod_id) {
$this->virtuemart_shipmentmethod_id = $virtuemart_shipmentmethod_id;
$this->automaticSelectedShipment=true;
$this->setCartIntoSession();
return true;
} else {
if($this->automaticSelectedShipment){
$this->virtuemart_shipmentmethod_id = 0;
$this->automaticSelectedShipment=false;
$this->setCartIntoSession();
/*//iStraxx QuicknDirty Fix, sets shipment automatically even if more available, but does not check for conditions.
$aship = VmConfig::get('set_automatic_shipment','0');
if(!empty($aship) and empty($this->virtuemart_shipmentmethod_id)){
$this->virtuemart_shipmentmethod_id = $aship;
$this->automaticSelectedShipment=true;
} else if($this->automaticSelectedShipment){
$this->virtuemart_shipmentmethod_id = 0;
$this->automaticSelectedShipment=false;
}
$this->setCartIntoSession();
return $this->automaticSelectedShipment;*/
}
return false;
}

}

/*
* CheckAutomaticSelectedPayment
* If only one payment is available for this amount, then automatically select it
*
* @author Valérie Isaksen
*/
function CheckAutomaticSelectedPayment($cart_prices, $checkAutomaticSelected=true) {

$nbPayment = 0;
$virtuemart_paymentmethod_id=0;

if ($checkAutomaticSelected and VmConfig::get('automatic_payment','1')=='1' ) {
if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php');
JPluginHelper::importPlugin('vmpayment');
$dispatcher = JDispatcher::getInstance();
$paymentCounter=0;
$returnValues = $dispatcher->trigger('plgVmOnCheckAutomaticSelectedPayment', array( $this, $cart_prices, &$paymentCounter));
foreach ($returnValues as $returnValue) {
if ( isset($returnValue )) {
$nbPayment++;
if($returnValue) $virtuemart_paymentmethod_id = $returnValue;
}
}
if ($nbPayment==1 && $virtuemart_paymentmethod_id) {
$this->virtuemart_paymentmethod_id = $virtuemart_paymentmethod_id;
$this->automaticSelectedPayment=true;
$this->setCartIntoSession();
return true;
} else {
if($this->automaticSelectedPayment){
$this->virtuemart_paymentmethod_id = 0;
$this->automaticSelectedPayment=false;
$this->setCartIntoSession();
}

return false;
}
} else {
return false;
}

}

/*
* CheckShipmentIsValid:
* check if the selected shipment is still valid for this new cart
*
* @author Valerie Isaksen
*/
function CheckShipmentIsValid() {
if ($this->virtuemart_shipmentmethod_id===0)
return;
$shipmentValid = false;
if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php');

JPluginHelper::importPlugin('vmshipment');
$dispatcher = JDispatcher::getInstance();
$returnValues = $dispatcher->trigger('plgVmOnCheckShipmentIsValid', array( $this));
foreach ($returnValues as $returnValue) {
$shipmentValid += $returnValue;
}
if (!$shipmentValid) {
$this->virtuemart_shipmentmethod_id = 0;
$this->setCartIntoSession();
}
}



/*
* Prepare the datas for cart/mail views
* set product, price, user, adress and vendor as Object
* @author Patrick Kohl
* @author Valerie Isaksen
*/
function prepareCartViewData(){

// Get the products for the cart
$this->prepareAddressDataInCart();

$this->prepareCartPrice( ) ;
$this->cartData = $this->prepareCartData();
$this->prepareVendor();

}

/**
* prepare display of cart
*
* @author RolandD
* @author Max Milbers
* @access public
*/
public function prepareCartData($checkAutomaticSelected=true){
vmSetStartTime('prepareCartData');
// Get the products for the cart
if(!empty($this->couponCode)){
$this->setCouponCode($this->couponCode);
vmdebug('ValidateCouponCode',$this->couponCode);
} else{
// Get the products for the cart, the setCouponCode does it for us
$this->getCartPrices($checkAutomaticSelected);
}

if (empty($this->pricesUnformatted)) return null;

if(!class_exists('CurrencyDisplay')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'currencydisplay.php');
$currency = CurrencyDisplay::getInstance();

$calculator = calculationHelper::getInstance();

$this->pricesCurrency = $currency->getCurrencyForDisplay();

if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php');
JPluginHelper::importPlugin('vmpayment');
$dispatcher = JDispatcher::getInstance();
$returnValues = $dispatcher->trigger('plgVmgetPaymentCurrency', array( $this->virtuemart_paymentmethod_id, &$this->paymentCurrency));
$cartData = $calculator->getCartData();

return $cartData ;
}

private function prepareCartPrice( ){

$productM = VmModel::getModel('product');
$usermodel = VmModel::getModel ('user');
$currentVMuser = $usermodel->getCurrentUser ();
if(!is_array($currentVMuser->shopper_groups)){
$virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups;
} else {
$virtuemart_shoppergroup_ids = $currentVMuser->shopper_groups;
}

foreach ($this->products as $cart_item_id=>&$product){

$product->virtuemart_category_id = $this->getCardCategoryId($product->virtuemart_product_id);
//$product = $productM->getProduct($product->virtuemart_product_id,true, true, true, $product->quantity);
$productM->getProductPrices($product,$product->quantity,$virtuemart_shoppergroup_ids,true,true);

// No full link because Mail want absolute path and in shop is better relative path
$product->url = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id='.$product->virtuemart_product_id.'&virtuemart_category_id='.$product->virtuemart_category_id, FALSE);//JHTML::link($url, $product->product_name);
if(!empty($product->customfieldsCart)){
if(!class_exists('VirtueMartModelCustomfields'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php');
$product->customfields = VirtueMartModelCustomfields::CustomsFieldCartDisplay($cart_item_id,$product);
} else {
$product->customfields ='';
}
$product->cart_item_id = $cart_item_id ;
}
}

/**
* Function Description
*
* @author Max Milbers
* @access public
* @param array $cart the cart to get the products for
* @return array of product objects
*/
// $this->pricesUnformatted = $product_prices;

public function getCartPrices($checkAutomaticSelected=true ) {

if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php');
$calculator = calculationHelper::getInstance();

$this->pricesUnformatted = $calculator->getCheckoutPrices($this, $checkAutomaticSelected);

return $this->pricesUnformatted;
}

function prepareAddressDataInCart($type='BT',$new = false, $virtuemart_user_id=null){

$userFieldsModel =VmModel::getModel('Userfields');

if($new){
$data = null;
} else {
$data = (object)$this->$type;
}
if($virtuemart_user_id!==null){
$data->virtuemart_user_id=$virtuemart_user_id;
}
if($type=='ST'){
$preFix = 'shipto_';
} else {
$preFix = '';
}

$addresstype = $type.'address'; //for example BTaddress
$userFieldsBT = $userFieldsModel->getUserFieldsFor('cart',$type);
$address = $this->$addresstype = $userFieldsModel->getUserFieldsFilled(
$userFieldsBT
,$data
,$preFix
);
//vmdebug('prepareAddressDataInCart',$this->$addresstype);
if(empty($this->$type) and $type=='BT'){
$tmp =&$this->$type ;
$tmp = array();
foreach($address as $k =>$field){
//vmdebug('prepareAddressDataInCart',$k,$field);
if($k=='virtuemart_country_id'){
if(isset($address[$k]) and !isset($tmp)){
$tmp = $address[$k];
}
} else if($k=='virtuemart_state_id') {
if(isset($address[$k]) and !isset($tmp)){
$tmp = $address[$k];
}
} else if (!empty($address[$k])){
if(!isset($tmp[$k])){
$tmp[$k] = $address[$k];
//vmdebug('Values was empty for key '.$k.', set value to default'.$address[$k]);
}
}
}
//$this->$type = $tmp;
}
if(!empty($this->ST) && $type!=='ST'){
$data = (object)$this->ST;
if($new){
$data = null;
}
$userFieldsST = $userFieldsModel->getUserFieldsFor('cart','ST');
$this->STaddress = $userFieldsModel->getUserFieldsFilled(
$userFieldsST
,$data
,$preFix
);
}

}

function prepareAddressRadioSelection(){

//Just in case
$this->user = VmModel::getModel('user');

$this->userDetails = $this->user->getUser();

$_addressBT = array();

// Shipment address(es)
if($this->user){
$_addressBT = $this->user->getUserAddressList($this->userDetails->JUser->get('id') , 'BT');

// Overwrite the address name for display purposes
if(empty($_addressBT[0])) $_addressBT[0] = new stdClass();
$_addressBT[0]->address_type_name = JText::_('COM_VIRTUEMART_ACC_BILL_DEF');

$_addressST = $this->user->getUserAddressList($this->userDetails->JUser->get('id') , 'ST');

} else {

$_addressBT[0]->address_type_name = '<a href="index.php'
.'?option=com_virtuemart'
.'&view=user'
.'&task=editaddresscart'
.'&addrtype=BT'
. '">'.JText::_('COM_VIRTUEMART_ACC_BILL_DEF').'</a>'.'<br />';
$_addressST = array();
}

$addressList = array_merge(
array($_addressBT[0])// More BT addresses can exist for shopowners :-(
, $_addressST );

if($this->user){
for ($_i = 0; $_i < count($addressList); $_i++) {
$addressList[$_i]->address_type_name = '<a href="index.php'
.'?option=com_virtuemart'
.'&view=user'
.'&task=editaddresscart'
.'&addrtype='.(($_i == 0) ? 'BT' : 'ST')
.'&virtuemart_userinfo_id='.(empty($addressList[$_i]->virtuemart_userinfo_id)? 0 : $addressList[$_i]->virtuemart_userinfo_id)
. '" rel="nofollow">'.$addressList[$_i]->address_type_name.'</a>'.'<br />';
}

if(!empty($addressList[0]->virtuemart_userinfo_id)){
$_selectedAddress = (
empty($this->_cart->selected_shipto)
? $addressList[0]->virtuemart_userinfo_id // Defaults to 1st BillTo
: $this->_cart->selected_shipto
);
$this->lists = JHTML::_('select.radiolist', $addressList, 'shipto', null, 'virtuemart_userinfo_id', 'address_type_name', $_selectedAddress);
}else{
$_selectedAddress = 0;
$this->lists = '';
}


} else {
$_selectedAddress = 0;
$this->lists = '';
}

$this->lists = empty($addressList[0]->virtuemart_userinfo_id)? 0 : $addressList[0]->virtuemart_userinfo_id;

}
/**
* moved to shopfunctionf
* @deprecated
*/
function prepareMailData(){

if(empty($this->vendor)) $this->prepareVendor();
//TODO add orders, for the orderId
//TODO add registering userdata
// In general we need for every mail the shopperdata (with group), the vendor data, shopperemail, shopperusername, and so on
}
/**
* moved to shopfunctionf
* @deprecated
*/
// add vendor for cart
function prepareVendor(){

$vendorModel = VmModel::getModel('vendor');
$this->vendor = $vendorModel->getVendor(1);
$vendorModel->addImages($this->vendor,1);
return $this->vendor;
}

// Render the code for Ajax Cart
function prepareAjaxData($checkAutomaticSelected=false){
// Added for the zone shipment module
//$vars["zone_qty"] = 0;

$this->prepareCartData($checkAutomaticSelected);

$weight_total = 0;
$weight_subtotal = 0;

//of course, some may argue that the $this->data->products should be generated in the view.html.php, but
//
if(empty($this->data)){
$this->data = new stdClass();
}
$this->data->products = array();
$this->data->totalProduct = 0;
$i=0;
//OSP when prices removed needed to format billTotal for AJAX
if (!class_exists('CurrencyDisplay'))
require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance();

foreach ($this->products as $priceKey=>$product){

//$vars["zone_qty"] += $product["quantity"];
$category_id = $this->getCardCategoryId($product->virtuemart_product_id);
//Create product URL
$url = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id='.$product->virtuemart_product_id.'&virtuemart_category_id='.$category_id, FALSE);

// @todo Add variants
$this->data->products[$i] = JHTML::link($url, $product->product_name);

// Add the variants
if (!is_numeric($priceKey)) {
if(!class_exists('VirtueMartModelCustomfields'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php');
// custom product fields display for cart
$this->data->products[$i] = VirtueMartModelCustomfields::CustomsFieldCartModDisplay($priceKey,$product);

}
$this->data->products[$i] = $product->product_sku;

//** @todo WEIGHT CALCULATION
//$weight_subtotal = vmShipmentMethod::get_weight($product["virtuemart_product_id"]) * $product->quantity'];
//$weight_total += $weight_subtotal;


// product Price total for ajax cart
// $this->data->products[$i] = $this->prices[$priceKey];
$this->data->products[$i] = $this->pricesUnformatted[$priceKey];
$this->data->products[$i] = $currency->priceDisplay( $this->pricesUnformatted[$priceKey] );

// other possible option to use for display
$this->data->products[$i] = $this->pricesUnformatted[$priceKey];
$this->data->products[$i] = $this->pricesUnformatted[$priceKey];
$this->data->products[$i] = $this->pricesUnformatted[$priceKey];
$this->data->products[$i] = $this->pricesUnformatted[$priceKey];

// UPDATE CART / DELETE FROM CART
$this->data->products[$i] = $product->quantity;
$this->data->totalProduct += $product->quantity ;

$i++;
}
$this->data->billTotal = $currency->priceDisplay( $this->pricesUnformatted );
$this->data->dataValidated = $this->_dataValidated ;
return $this->data ;
}
}

Please Log in or Create an account to join the conversation.

More
8 years 7 months ago #5790 by Марко
Плагин не работает с Virtuemart 2.6, а только с Virtuemart3. Смените в описании к плагину.

Please Log in or Create an account to join the conversation.

Powered by Kunena Forum

Last from the forum

    • xqx47478
    • Consequently, in case you want to in case you are supplementing vitamin C throughout a cough, it is recommended not to devour oranges, in any other case the loss outweighs the advantage and aggravates the situation.
    • In Component / JL TV
    • Enhancing Digital Security with ITMS: Network Secu...
    • In today’s interconnected world, businesses of all sizes face increasing cybersecurity threats that put their critical data, applications, and networks at risk. From malware and ransomware to phishing attacks and unauthorized access, the landscape of cyber threats is becoming more sophisticated and relentless. As companies continue to rely on digital infrastructure, ensuring robust network security is more essential than ever. This is where with ITMS (IT Manage Services) come into play, providing businesses with comprehensive protection and peace of mind.What is ITMS (IT Manage Services)?IT Management Services () refer to the strategic approach to managing an organization’s IT infrastructure, applications, and services to ensure seamless operation, high performance, and security. ITMS incorporates a wide range of services including network security, system monitoring, data backup, cloud management, and troubleshooting. It focuses on proactive maintenance, real-time threat detection, and efficient incident response to mitigate risks before they escalate into critical issues.Network security, a vital component of ITMS, protects an organization’s IT infrastructure from cyber-attacks, data breaches, and other security vulnerabilities. By employing a combination of technologies, policies, and practices, ITMS ensures that networks remain secure, reliable, and optimized for business continuity.Why Network Security Services are Crucial for BusinessesNetwork security is the first line of defense against cyber threats. Whether you are a small business or a large enterprise, your network holds a wealth of sensitive data—client information, financial records, intellectual property, and more. A breach can lead to data theft, financial loss, legal consequences, and reputational damage. As businesses increasingly rely on remote work, cloud services, and digital collaboration tools, the need for continuous, automated network monitoring becomes more critical.Moreover, as cybercriminals employ more advanced tactics to bypass traditional security measures, a proactive, comprehensive network security strategy is no longer optional. With ITMS, businesses gain a strategic partner to safeguard their digital assets while maintaining operational efficiency.Core Components of Network Security Services with ITMSNetwork security within the scope of ITMS involves several key services that work together to ensure maximum protection:1. Advanced Threat DetectionOne of the primary functions of network security services is real-time threat monitoring. ITMS integrates state-of-the-art threat detection technologies such as intrusion detection systems (IDS) and intrusion prevention systems (IPS). These systems monitor network traffic and identify abnormal behavior, unauthorized access attempts, and malicious activity. By detecting potential threats early, ITMS can prevent data breaches before they occur, ensuring continuous protection.2. Network FirewallsA robust firewall is one of the fundamental components of network security. ITMS includes the deployment of next-generation firewalls that inspect and filter incoming and outgoing traffic based on predefined security rules. These firewalls block unauthorized access and prevent malicious traffic from reaching critical systems, thereby reducing the attack surface.3. Vulnerability Assessments and Penetration TestingVulnerability assessments and penetration testing are critical for identifying weaknesses within a company’s network before they can be exploited by hackers. ITMS regularly conducts these assessments to evaluate the security posture of the network, identifying potential gaps, and taking action to remediate vulnerabilities. Proactive vulnerability management helps businesses avoid costly breaches and minimize risk exposure.4. Encryption SolutionsEncryption is a powerful tool in safeguarding data integrity. ITMS provides end-to-end encryption services for sensitive information, ensuring that data is protected both at rest and in transit. Whether it's email encryption, file encryption, or VPN solutions, encryption ensures that only authorized users can access critical business information.5. Proactive Software and Security PatchesCybercriminals often exploit outdated software and unpatched vulnerabilities to gain unauthorized access. ITMS ensures that software patches and security updates are applied regularly to prevent such exploits. By automating updates and security patches, businesses can ensure that their systems are always up to date, minimizing the risk of breaches due to known vulnerabilities.6. Incident Response and RecoveryDespite best efforts, no network is entirely impervious to threats. ITMS ensures that businesses are prepared for potential security incidents with an established incident response plan. In case of a breach or attack, ITMS teams can respond quickly to contain and mitigate damage, conduct forensic investigations, and restore affected systems. Additionally, ITMS services include regular data backups to ensure business continuity and prevent data loss in the event of a cyber-attack.7.  Monitoring and SupportCyber threats are not confined to business hours, which is why continuous monitoring is crucial. ITMS provides round-the-clock monitoring to detect and respond to security incidents in real time. This  vigilance ensures that any suspicious activity is immediately addressed before it can escalate into a more significant threat.Benefits of Network Security Services with ITMS1. Enhanced Security Posture: By employing advanced network security technologies and best practices, businesses can fortify their defenses against a wide range of cyber threats.2. Reduced Risk and Downtime: Proactive monitoring and regular vulnerability assessments help identify and address potential issues before they cause harm, reducing the risk of network downtime and operational disruptions.3. Increased Productivity: With ITMS managing your network security, your IT team can focus on more strategic tasks, while employees can work in a secure, optimized environment without worrying about cybersecurity threats.4. Cost-Effective: Investing in a comprehensive ITMS solution is more cost-effective than dealing with the aftermath of a security breach, including lost revenue, legal fees, and reputational damage. ITMS services help reduce the likelihood of breaches and the financial burden they can impose.5. Regulatory Compliance: For businesses in regulated industries (e.g., healthcare, finance), network security is crucial to meet legal and regulatory requirements for data protection. ITMS can help ensure compliance with industry standards such as GDPR, HIPAA, and PCI-DSS.ConclusionIn today’s digital age, network security is a critical priority for businesses of all sizes. With the rise of cyber threats, traditional security measures are no longer enough. By integrating Network Security Services with ITMS, organizations can gain a robust, proactive defense system that safeguards their digital infrastructure. From real-time monitoring and threat detection to incident response and vulnerability management, ITMS provides the tools and expertise needed to protect your organization’s sensitive data and ensure business continuity. With a trusted ITMS partner, businesses can focus on their core operations, knowing their network security is in capable hands.  
    • In English Forum / Component
    • 3CX Phone System Support and VoIP Solutions with S...
    • Success in the hectic corporate world of today depends mostly on effective communication. Looking to replace existing phone systems and include VoIP (Voice over Internet Protocol) technologies, companies can find a strong, adaptable, and reasonably priced answer in the 3CX Phone System. Combining System360, a top supplier of expert advice and complete , with this helps companies to leverage scalability, improved productivity, and flawless communication. Using : Designed as a software-based PBX (Private Branch Exchange), the 3CX Phone System lets companies transport both internal and outside communications across the internet. Perfect for remote work and multi-location companies, it supports several devices like IP phones, cellphones, and web browsers. With call forwarding, voicemail-to-email, live chat, video conferencing, and more, 3CX offers a complete answer for contemporary communication demands. System360 Improves Your 3CX Experience System360 offers installation, configuration, and continuous maintenance, therefore fully supporting the 3CX Phone System. Whether you are replacing an old system or using 3CX for the first time, System360's knowledgeable staff guarantees a seamless implementation with least disturbance to your company operations. By maximizing sound quality, guaranteeing consistent call connections, and so enhancing general network performance, their VoIP solutions help to further increase the power of the 3CX system. System360 additionally provides 24/7 technical help to fix any problems, thereby guaranteeing that your communication systems work always without fail. Why Select System360 for VoIP Solutions and 3CX? Certified engineers of System360 offer hands-on help and professional direction for flawless 3CX integration. Customized VoIP solutions available from them meet your company size and needs. Economically Affordable: While keeping great communication quality, VoIP technology helps to lower phone costs. Support from System360 will help you to fully utilize your 3CX phone system, therefore guaranteeing effective communication and a competitive edge in your sector.  
    • In English Forum / Modules
© 2010- JoomLine
The Joomla!® name is used under a limited license from Open Source Matters in the United States and other countries. joomline.net is not affiliated with or endorsed by Open Source Matters or the Joomla! Project.

email: This email address is being protected from spambots. You need JavaScript enabled to view it.