'login')); //$view = new vmView(); $body = $view->renderVmSubLayout($layout,array('show' => $show, 'order' => $order, 'from_cart' => $cart, 'url' => $url)); } return $body; } static public function getLastVisitedCategoryId ($default = 0) { $session = JFactory::getSession(); return $session->get( 'vmlastvisitedcategoryid', $default, 'vm' ); } static public function setLastVisitedCategoryId ($categoryId) { $session = JFactory::getSession(); return $session->set( 'vmlastvisitedcategoryid', (int)$categoryId, 'vm' ); } static public function getLastVisitedItemId ($default = 0) { $session = JFactory::getSession(); return $session->get( 'vmlastvisitedItemid', $default, 'vm' ); } static public function setLastVisitedItemId ($id) { $session = JFactory::getSession(); return $session->set( 'vmlastvisitedItemid', (int)$id, 'vm' ); } static public function getLastVisitedManuId () { $session = JFactory::getSession(); return $session->get( 'vmlastvisitedmanuid', 0, 'vm' ); } static public function setLastVisitedManuId ($manuId) { $session = JFactory::getSession(); return $session->set( 'vmlastvisitedmanuid', (int)$manuId, 'vm' ); } /** * @param $orderable * @return string * @deprecated */ static public function getAddToCartButton ($orderable) { return self::renderVmSubLayout('addtocartbtn',array('orderable'=>$orderable)); } static public function isFEmanager ($task = 0) { return vmAccess::isFEmanager($task); } /** * Just an idea, still WIP * @param $type * @return mixed */ static function renderFormField($type){ //Get custom field JFormHelper::addFieldPath(VMPATH_ADMIN .'/fields'); $types = JFormHelper::loadFieldType($type, false); return $types->getOptions(); } /** * Return the order status name for a given code * * @author Oscar van Eijk * @access public * * @param char $_code Order status code * @return string The name of the order status */ static public function getOrderStatusName ($_code) { static $orderNames = array(); $db = JFactory::getDBO (); $_code = $db->escape ($_code); if(!isset($orderNames[$_code])){ $_q = 'SELECT `order_status_name` FROM `#__virtuemart_orderstates` WHERE `order_status_code` = "' . $_code . '"'; $db->setQuery ($_q); $orderNames[$_code] = $db->loadObject (); if (empty($orderNames[$_code]->order_status_name)) { vmError ('getOrderStatusName: couldnt find order_status_name for ' . $_code); return 'current order status broken'; } else { $orderNames[$_code] = vmText::_($orderNames[$_code]->order_status_name); } } return $orderNames[$_code]; } /** * Render a simple country list * * @author jseros, Max Milbers, Valérie Isaksen * * @param int $countryId Selected country id * @param boolean $multiple True if multiple selections are allowed (default: false) * @param mixed $_attrib string or array with additional attributes, * e.g. 'onchange=somefunction()' or array('onchange'=>'somefunction()') * @param string $_prefix Optional prefix for the formtag name attribute * @return string HTML containing the ID attribute * @param string $_prefix Optional prefix for the formtag name attribute * @return string HTML containing the '; return $listHTML; } /** * This generates the list when the user have different ST addresses saved * * @author Max Milbers */ static function generateStAddressList ($view, $userModel, $task) { // Shipment address(es) $_addressList = $userModel->getUserAddressList ($userModel->getId (), 'ST'); if (count ($_addressList) == 1 && empty($_addressList[0]->address_type_name)) { return vmText::_ ('COM_VIRTUEMART_USER_NOSHIPPINGADDR'); } else { $_shipTo = array(); $useXHTTML = empty($view->useXHTML) ? false : $view->useXHTML; $useSSL = empty($view->useSSL) ? FALSE : $view->useSSL; for ($_i = 0; $_i < count ($_addressList); $_i++) { if (empty($_addressList[$_i]->virtuemart_user_id)) { $_addressList[$_i]->virtuemart_user_id = JFactory::getUser ()->id; } if (empty($_addressList[$_i]->virtuemart_userinfo_id)) { $_addressList[$_i]->virtuemart_userinfo_id = 0; } if (empty($_addressList[$_i]->address_type_name)) { $_addressList[$_i]->address_type_name = 0; } $_shipTo[] = '
  • ' . '' . $_addressList[$_i]->address_type_name . ' ' ; $_shipTo[] = '  '.''.vmText::_('COM_VIRTUEMART_USER_DELETE_ST').'
  • '; } $addLink = ' '; $addLink .= vmText::_ ('COM_VIRTUEMART_USER_FORM_ADD_SHIPTO_LBL') . ' '; return $addLink . ''; } } /** * used mostly in the email, to display the vendor address * Attention, this function will be removed from any view.html.php * * @static * @param $vendorId * @param string $lineSeparator * @param array $skips * @return string */ static public function renderVendorAddress ($vendorId,$lineSeparator="
    ", $skips = array('name','username','email','agreed')) { $vendorModel = VmModel::getModel('vendor'); $vendorFields = $vendorModel->getVendorAddressFields($vendorId); $vendorAddress = ''; foreach ($vendorFields['fields'] as $field) { if(in_array($field['name'],$skips)) continue; if (!empty($field['value'])) { $vendorAddress .= $field['value']; if ($field['name'] != 'title' and $field['name'] != 'first_name' and $field['name'] != 'middle_name' and $field['name'] != 'zip') { $vendorAddress .= $lineSeparator; } else { $vendorAddress .= ' '; } } } return $vendorAddress; } /** * * @author Max Milbers */ static public function addProductToRecent ($productId) { $session = JFactory::getSession(); $products_ids = $session->get( 'vmlastvisitedproductids', array(), 'vm' ); $key = array_search( $productId, $products_ids ); if($key !== FALSE) { unset($products_ids[$key]); } array_unshift( $products_ids, $productId ); $products_ids = array_unique( $products_ids ); $maxSize = (int)VmConfig::get('max_recent_products', 10); if(count( $products_ids )>$maxSize) { array_splice( $products_ids, $maxSize ); } return $session->set( 'vmlastvisitedproductids', $products_ids, 'vm' ); } /** * Gives ids the recently by the shopper visited products * * @author Max Milbers */ static public function getRecentProductIds ($nbr = 3) { $session = JFactory::getSession(); $ids = $session->get( 'vmlastvisitedproductids', array(), 'vm' ); if(count( $ids )>$nbr) { array_splice( $ids, $nbr ); } return $ids; } static public function sortLoadProductCustomsStockInd(&$products,$pModel){ if(!$products) return; $customfieldsModel = VmModel::getModel ('Customfields'); foreach($products as $i => $productItem){ if (!empty($productItem->customfields)) { $product = clone($productItem); $customfields = array(); foreach($productItem->customfields as $cu){ $customfields[] = clone ($cu); } $customfieldsSorted = array(); $customfieldsModel -> displayProductCustomfieldFE ($product, $customfields); $product->stock = $pModel->getStockIndicator($product); foreach ($customfields as $k => $custom) { if (!empty($custom->layout_pos) ) { $customfieldsSorted[$custom->layout_pos][] = $custom; } else { $customfieldsSorted['normal'][] = $custom; } unset($customfields[$k]); } $product->customfieldsSorted = $customfieldsSorted; unset($product->customfields); $products[$i] = $product; } else { $productItem->stock = $pModel->getStockIndicator($productItem); $products[$i] = $productItem; } } } static public function calculateProductRowsHeights($products,$currency,$products_per_row){ $rowsHeight = array(); if(!$products) return $rowsHeight; $col = 1; $nb = 1; $row = 1; $BrowseTotalProducts = count($products); $rowHeights = array(); foreach($products as $product){ $priceRows = 0; //Lets calculate the height of the prices foreach($currency->_priceConfig as $name=>$values){ if(!empty($currency->_priceConfig[$name][0])){ if(!empty($product->prices[$name]) or $name == 'billTotal' or $name == 'billTaxAmount'){ $priceRows++; } } } $rowHeights[$row]['price'][] = $priceRows; $position = 'addtocart'; if(!empty($product->customfieldsSorted[$position])){ //Hack for Multi variants $mvRows = 0;$i=0; foreach($product->customfieldsSorted[$position] as $custom){ if($custom->field_type=='C'){ //vmdebug('my custom',$custom); if( is_array($custom->selectoptions) ){ $mvRows += count($custom->selectoptions); $i++; } } } $customs = count($product->customfieldsSorted[$position]); if(!empty($mvRows)){ $customs = $customs - $i +$mvRows; } } else { $customs = 0; } $position = 'ontop'; if(!empty($product->customfieldsSorted[$position])){ foreach($product->customfieldsSorted[$position] as $custom){ if($custom->field_type=='A'){ $customs++; } } } $rowHeights[$row]['customfields'][] = $customs; $rowHeights[$row]['product_s_desc'][] = empty($product->product_s_desc)? 0:1; $rowHeights[$row]['avail'][] = empty($product->product_availability)? 0:1; $nb ++; if ($col == $products_per_row || $nb>$BrowseTotalProducts) { foreach($rowHeights[$row] as $group => $cols){ $rowsHeight[$row][$group] = 0; foreach($cols as $c){ $rowsHeight[$row][$group] = max($rowsHeight[$row][$group],$c); } } $col = 1; $rowHeights = array(); $row++; } else { $col ++; } } return $rowsHeight; } /** * Renders sublayouts * * @param $name * @param int $viewData viewdata for the rendered sublayout, do not remove * @return string */ static public function renderVmSubLayout($name,$viewData=0){ $lPath = VmView::getVmSubLayoutPath ($name); if($lPath){ ob_start (); include ($lPath); return ob_get_clean(); } else { vmdebug('renderVmSubLayout layout not found '.$name); } } /** * renders sub layout in a bootstrap grid layout * * @param $name * @param int $viewData * * @since 3.8 * @author Eugen Stranz */ static public function renderVmSubLayoutAsGrid ($name, $viewData = 0) { // get the content of the first index in the array and save it in a variable // this variable will be used in the for each loop to generate the grid // we then delete the first index as there is no point in passing it twice reset($viewData); $itemCollection = $viewData[key($viewData)]; unset($viewData[key($viewData)]); if(!isset($viewData['options'])) { $viewData['options'] = array (); } // Grid Settings & Calculation $itemsPerRow = vRequest::get( 'items_per_row', array ( 'xs' => 1, 'sm' => 2, 'md' => 3, 'lg' => 3, 'xl' => 3 ), FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE, $viewData['options'] ); $iRowItemsPerDevice = array ( 'xs' => 0, 'sm' => 0, 'md' => 0, 'lg' => 0, 'xl' => 0 ); $totalItems = count($itemCollection); $iItems = 0; $gridClassNamesForNewLine = array ( 'xs' => 'col-12 d-block d-sm-none', 'sm' => 'col-12 d-none d-sm-block d-md-none d-lg-none d-xl-none', 'md' => 'col-12 d-none d-sm-none d-md-block d-lg-none d-xl-none', 'lg' => 'col-12 d-none d-sm-none d-md-none d-lg-block d-xl-none', 'xl' => 'col-12 d-none d-sm-none d-md-none d-lg-none d-xl-block', ); $fixedColumnWidth = vRequest::get( 'fixed_column_width', false, FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE, $viewData['options'] ); if ($fixedColumnWidth) { $columnClassNames = array (); $possibleGridColumnWitdhs = array ( 1, 2, 3, 4, 6 ); foreach ($itemsPerRow as $deviceSize => $itemPerRow) { if (in_array($itemPerRow, $possibleGridColumnWitdhs)) { $columnClassNames[] = ($deviceSize == 'xs') ? 'col-' . (12 / $itemPerRow) : 'col-' . $deviceSize . '-' . (12 / $itemPerRow); } else { $columnClassNames[] = ($deviceSize == 'xs') ? 'col-4' : 'col-' . $deviceSize . '-4'; $itemsPerRow[$deviceSize] = 3; } } $columnClassNames[] = 'd-flex'; } else { // $columnClassNames = array ( 'col', 'd-flex' ); $columnClassNames = array ( 'col' ); } // Display Settings $showHorizontalLine = vRequest::get( 'show_horizontal_line', true, FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE, $viewData['options'] ); $showVerticalLine = vRequest::get( 'show_vertical_line', true, FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE, $viewData['options'] ); $addMarginBottomToColumn = vRequest::get( 'add_margin_bottom_to_column', false, FILTER_UNSAFE_RAW, FILTER_FLAG_NO_ENCODE, $viewData['options'] ); if (!$showHorizontalLine) { $addMarginBottomToColumn = true; } else { $addMarginBottomToColumn = false; } // Output The Items ob_start(); ?>
    $iRowItem) { if (($iRowItemsPerDevice[$deviceSize] + 1) == $itemsPerRow[$deviceSize]) { $newLineClassName[] = ' end-' . $deviceSize; } else { $newLineClassName[] = ' vl-' . $deviceSize; } } } ?>
    $iRowItem) { $iRowItemsPerDevice[$deviceSize]++; if ($iRowItemsPerDevice[$deviceSize] == $itemsPerRow[$deviceSize] && $iItems < $totalItems) { // Add Margin Bottom If We Horizontal Line is Disabled if ($addMarginBottomToColumn) { $gridClassNamesForNewLine[$deviceSize] .= ($deviceSize == 'xs') ? ' mb-4' : ' mb-' . $deviceSize . '-4'; } ?>

    this make logic trouble static public function renderMail ($viewName, $recipient, $vars = array(), $controllerName = NULL, $noVendorMail = FALSE,$useDefault=true) { self::loadOrderLanguages(); $view = self::prepareViewForMail($viewName, $vars, $controllerName); $user = self::sendVmMail( $view, $recipient, $noVendorMail ); if(isset($view->doVendor) && !$noVendorMail) { //We need to ensure the language for the vendor here if(!empty($vars['virtuemart_vendor_id'])){ $vendorId = $vars['virtuemart_vendor_id']; } else { $vendorId = 1; } $vendorUserId = VmModel::getModel('vendor')->getUserIdByVendorId($vendorId); $vu = JFactory::getUser($vendorUserId); $vLang = $vu->getParam('admin_language',VmConfig::$jDefLangTag); vmLanguage::setLanguageByTag($vLang); self::sendVmMail( $view, $view->vendorEmail, TRUE ); } return $user; } public static function prepareViewForMail($viewName, $vars, $controllerName = false) { if(!$controllerName) $controllerName = $viewName; $controllerClassName = 'VirtueMartController'.ucfirst( $controllerName ); if(!class_exists( $controllerClassName )) require(VMPATH_SITE .'/controllers/'.$controllerName.'.php'); $controller = new $controllerClassName(); //$controller = new VirtueMartControllerVirtuemart(); // refering to http://forum.virtuemart.net/index.php?topic=96318.msg317277#msg317277 $controller->addViewPath( VMPATH_SITE .'/views' ); $view = $controller->getView( $viewName, 'html' ); //refering to http://forum.virtuemart.net/index.php?topic=96318.msg317277#msg317277 $view->addTemplatePath( VMPATH_SITE.'/views/'.$viewName.'/tmpl' ); $template = VmTemplate::loadVmTemplateStyle(); VmTemplate::setTemplate($template); if($template and VmConfig::get('useLayoutOverrides',1)){ if(is_array($template) and isset($template['template'])){ $view->addTemplatePath( VMPATH_ROOT .'/templates/'.$template['template'].'/html/com_virtuemart/'.$viewName ); } else { $view->addTemplatePath( VMPATH_ROOT .'/templates/'.$template.'/html/com_virtuemart/'.$viewName ); } } foreach( $vars as $key => $val ) { $view->{$key} = $val; } return $view; } /** * @deprecated use the class vmTemplate instead * @return string */ public static function loadVmTemplateStyle(){ static $res = null; if($res!==null) return $res; $res = VmTemplate::loadVmTemplateStyle(); } /** * This function sets the right template on the view * @author Max Milbers * @deprecated use class VmTemplates instead */ static function setVmTemplate ($view, $catTpl = 0, $prodTpl = 0, $catLayout = 0, $prodLayout = 0) { return VmTemplate::setVmTemplate($view, $catTpl, $prodTpl, $catLayout, $prodLayout); } /** * Loads lang files for the set language, new language system reloades all already loaded files automatically for the new language * @param int $language */ static public function loadOrderLanguages($language = 0){ vmLanguage::setLanguageByTag($language); $s = TRUE; $cache = TRUE; vmLanguage::loadJLang('com_virtuemart', 0, $language, $cache); vmLanguage::loadJLang('com_virtuemart', $s, $language, $cache); vmLanguage::loadJLang('com_virtuemart_shoppers', $s, $language, $cache); vmLanguage::loadJLang('com_virtuemart_orders', $s, $language, $cache); } /** * With this function you can use a view to sent it by email. * Just use a task in a controller * * @param string $view for example user, cart * @param string $recipient shopper@whatever.com * @param bool $vendor true for notifying vendor of user action (e.g. registration) */ public static function sendVmMail (&$view, $recipient, $noVendorMail = FALSE) { VmConfig::ensureMemoryLimit(96); ob_start(); $view->renderMailLayout( $noVendorMail, $recipient ); $body = ob_get_contents(); ob_end_clean(); $subject = (isset($view->subject)) ? $view->subject : vmText::_( 'COM_VIRTUEMART_DEFAULT_MESSAGE_SUBJECT' ); $mailer = JFactory::getMailer(); $mailer->addRecipient( $recipient ); $subjectMailer= '=?utf-8?B?'.base64_encode($subject).'?='; if(function_exists('mb_decode_mimeheader')){ $subjectMailer= mb_decode_mimeheader($subjectMailer); } $mailer->setSubject( html_entity_decode( $subjectMailer , ENT_QUOTES, 'UTF-8') ); $mailer->isHTML( VmConfig::get( 'order_mail_html', TRUE ) ); $mailer->setBody( $body ); $replyTo = array(); $replyToName = array(); if(!$noVendorMail) { $replyTo[0] = $view->vendorEmail; $replyToName[0] = $view->vendor->vendor_name; } else { if(isset($view->orderDetails['details']) && isset($view->orderDetails['details']['BT'])) { $replyTo[0] = $view->orderDetails['details']['BT']->email; $replyToName[0] = $view->orderDetails['details']['BT']->first_name . ' ' . $view->orderDetails['details']['BT']->last_name; } else { if(is_object($view->user)){ $replyTo[0] = isset($view->user->email)? $view->user->email:false; $replyToName[0] = isset($view->user->name)? $view->user->name:false; } else { $replyTo[0] = isset($view->user['email'])? $view->user['email']:false; $replyToName[0] = isset($view->user['name'])? $view->user['name']:false; } } } if(count($replyTo)) { if(version_compare(JVERSION, '3.5', 'ge')) { $mailer->addReplyTo($replyTo, $replyToName); } else { $replyTo[1] = $replyToName[0]; $mailer->addReplyTo($replyTo); } } // set proper sender $sender = array(); if(!empty($view->vendorEmail) and VmConfig::get( 'useVendorEmail', 0 )) { $sender[0] = $view->vendorEmail; $sender[1] = $view->vendor->vendor_name; } else { // use default joomla's mail sender $app = JFactory::getApplication(); $sender[0] = $app->getCfg( 'mailfrom' ); $sender[1] = $app->getCfg( 'fromname' ); if(empty($sender[0])){ $config = JFactory::getConfig(); $sender = array( $config->get( 'mailfrom' ), $config->get( 'fromname' ) ); } } $mailer->setSender($sender); $mediaToSend = array(); if(isset($view->mediaToSend)) { foreach( (array)$view->mediaToSend as $media ) { $mailer->addAttachment( $media ); } $mediaToSend = $view->mediaToSend; $view->mediaToSend = array(); } vDispatcher::trigger('plgVmOnSendVmEmail',array(&$view,&$mailer,$noVendorMail)); $debug_email = VmConfig::get('debug_mail', false); if (VmConfig::get('debug_mail', false) == '1') { $debug_email = 'debug_email'; } if ($debug_email) { if (!is_array($recipient)) { $recipient = array($recipient); } $no = ''; if ($debug_email == 'debug_email') { $no = 'no'; } $msg = 'Debug mail active, '.$no.' mail sent. The mail to send subject ' . $subject . ' to "' . implode(' ', $recipient) . '" from ' . $sender[0] . ' ' . $sender[1] . ' ' . vmText::$language->getTag() . '
    ' . $body; if (VmConfig::showDebug()) { vmdebug($msg, $mediaToSend); } else { vmInfo($msg); } if ($debug_email == 'debug_email') { return true; } } try { $return = $mailer->Send(); } catch (Exception $e) { vmEcho::$logDebug = true; $m = $e -> getMessage() ; vmdebug('Error sending mail '.$m); vmError('Error sending mail '); // this will take care of the error message return false; } return $return; } static public function sendRatingEmailToVendor ($data) { $vars = array(); $productModel = VmModel::getModel ('product'); $product = $productModel->getProduct ($data['virtuemart_product_id']); $vars['subject'] = vmText::sprintf('COM_VIRTUEMART_RATING_EMAIL_SUBJECT', $product->product_name); $vars['mailbody'] = vmText::sprintf('COM_VIRTUEMART_RATING_EMAIL_BODY', $product->product_name); $vendorModel = VmModel::getModel ('vendor'); $vendor = $vendorModel->getVendor ($product->virtuemart_vendor_id); $vendorModel->addImages ($vendor); $vars['vendor'] = $vendor; $vars['vendorEmail'] = $vendorModel->getVendorEmail ($product->virtuemart_vendor_id); $vars['vendorAddress'] = shopFunctionsF::renderVendorAddress ($product->virtuemart_vendor_id); shopFunctionsF::renderMail ('productdetails', $vars['vendorEmail'], $vars, 'productdetails', TRUE); } static public function getTaxNameWithValue($name, $value){ $value = rtrim(trim($value,'0'),'.'); if(empty($value)) return $name; if(strpos($name,(string)$value)!==false){ $tax = $name; } else { $tax = $name.' '.$value.'%'; } return $tax; } /** * * Enter description here ... * @author Max Milbers * @author Iysov * @param string $string * @param int $maxlength * @param string $suffix */ static public function limitStringByWord ($string, $maxlength, $suffix = '') { if(function_exists( 'mb_strlen' )) { // use multibyte functions by Iysov if(mb_strlen( $string )<=$maxlength) return $string; $string = mb_substr( $string, 0, $maxlength ); $index = mb_strrpos( $string, ' ' ); if($index === FALSE) { return $string; } else { return mb_substr( $string, 0, $index ).$suffix; } } else { // original code here if(strlen( $string )<=$maxlength) return $string; $string = substr( $string, 0, $maxlength ); $index = strrpos( $string, ' ' ); if($index === FALSE) { return $string; } else { return substr( $string, 0, $index ).$suffix; } } } static public function vmSubstr($str,$s,$e = null){ if(function_exists( 'mb_substr' )) { return mb_substr( $str, $s, $e ); } else { return substr( $str, $s, $e ); } } /** * Admin UI Tabs * Gives A Tab Based Navigation Back And Loads The Templates With A Nice Design * @param $load_template = a key => value array. key = template name, value = Language File contraction * @example 'shop' => 'COM_VIRTUEMART_ADMIN_CFG_SHOPTAB' */ static function buildTabs ($view, $load_template = array()) { vmJsApi::addJScript( 'vmtabs' ); $html = '
    '; $i = 1; foreach( $load_template as $tab_content => $tab_title ) { $html .= '
    '; $html .= $view->loadTemplate( $tab_content ); $html .= '
    '; $i++; } $html .= '
    '; echo $html; } /** * Checks if Joomla language keys exist and combines it according to existing keys. * @string $pkey : primary string to search for Language key (must have %s in the string to work) * @string $skey : secondary string to search for Language key * @return string * @author Max Milbers * @author Patrick Kohl */ static function translateTwoLangKeys ($pkey, $skey) { $upper = strtoupper( $pkey ).'_2STRINGS'; if(vmText::_( $upper ) !== $upper) { return vmText::sprintf( $upper, vmText::_( $skey ) ); } else { return vmText::_( $pkey ).' '.vmText::_( $skey ); } } /** * Get Virtuemart itemID from joomla menu * @author Maik K�nnemann */ static function getMenuItemId( $lang = '*' ) { static $menuItems = array(); $itemID = ''; if(empty($lang)) $lang = '*'; $component = JComponentHelper::getComponent('com_virtuemart'); $h = $lang.$component->id; if(isset($menuItems[$h])){ return $menuItems[$h]; } else { $db = JFactory::getDbo(); $q = 'SELECT * FROM `#__menu` WHERE `component_id` = "'. $component->id .'" and `language` = "'. $lang .'"'; $db->setQuery( $q ); $items = $db->loadObjectList(); if(empty($items)) { $q = 'SELECT * FROM `#__menu` WHERE `component_id` = "'. $component->id .'" and `language` = "*"'; $db->setQuery( $q ); $items = $db->loadObjectList(); } foreach ($items as $item) { if(strstr($item->link, 'view=virtuemart')) { $itemID = $item->id; break; } } if(empty($itemID) && !empty($items[0]->id)) { $itemID = $items[0]->id; } $menuItems[$h] = $itemID; } return $menuItems[$h]; } static function triggerContentPlugin( &$article, $context, $field) { // add content plugin // JPluginHelper::importPlugin ('content'); $article->text = $article->{$field}; jimport ('joomla.registry.registry'); $params = new JRegistry(''); if (!isset($article->event)) { $article->event = new stdClass(); } $results = vDispatcher::trigger ('onContentPrepare', array('com_virtuemart.'.$context, &$article, &$params, 0)); // More events for 3rd party content plugins // This do not disturb actual plugins, because we don't modify $vendor->text $res = vDispatcher::trigger ('onContentAfterTitle', array('com_virtuemart.'.$context, &$article, &$params, 0)); $article->event->afterDisplayTitle = trim (implode ("\n", $res)); $res = vDispatcher::trigger ('onContentBeforeDisplay', array('com_virtuemart.'.$context, &$article, &$params, 0)); $article->event->beforeDisplayContent = trim (implode ("\n", $res)); $res = vDispatcher::trigger ('onContentAfterDisplay', array('com_virtuemart.'.$context, &$article, &$params, 0)); $article->event->afterDisplayContent = trim (implode ("\n", $res)); $article->{$field} = $article->text; } static public function mask_string($cc, $mask_char='X'){ return str_pad(substr($cc, -4), strlen($cc), $mask_char, STR_PAD_LEFT); } /* * get The invoice Folder Name * @return the invoice folder name */ static function getInvoiceFolderName() { return VirtueMartModelInvoice::getInvoiceFolderName(); } /** * Get the file name for the invoice or deliverynote. * The layout argument currently is either 'invoice' or 'deliverynote' * @deprecated use VirtueMartModelInvoice::getInvoiceName instead * @return The full filename of the invoice/deliverynote without file extension, sanitized not to contain problematic characters like / */ static function getInvoiceName($invoice_number, $layout='invoice'){ return VirtueMartModelInvoice::getInvoiceName($invoice_number, $layout='invoice'); } static public function getInvoiceDownloadButton($orderInfo, $descr = 'COM_VIRTUEMART_PRINT', $icon = 'system/pdf_button.png'){ $html = ''; if(!empty($orderInfo->invoiceNumber)){ if(!$sPath = shopFunctions::getSafePathFor()){ return $html; } $path = $sPath.DS.self::getInvoiceName($orderInfo->invoiceNumber).'.pdf'; //$path .= preg_replace('/[^A-Za-z0-9_\-\.]/', '_', 'vm'.$layout.'_'.$orderInfo->invoiceNumber.'.pdf'); if(file_exists( $path )) { $link = JURI::root(true).'/index.php?option=com_virtuemart&view=invoice&layout=invoice&format=pdf&tmpl=component&order_number='.$orderInfo->order_number.'&order_pass='.$orderInfo->order_pass; $pdf_link = ""; $pdf_link .= $orderInfo->invoiceNumber.' '; $pdf_link .= JHtml::_('image',$icon, vmText::_($descr), NULL, true); $pdf_link .= ''; $html = $pdf_link; } } return $html; } /* * @author Valerie */ static function InvoiceNumberReserved ($invoice_number) { if (($pos = strpos ($invoice_number, 'reservedByPayment_')) === FALSE) { return FALSE; } else { return TRUE; } } static public function renderCaptcha($config = 'reg_captcha',$id = 'dynamic_recaptcha_1'){ //stAn - allow to renderCaptcha for logged in users as well if they use hidden config reg_captcha_logged OR ask_captcha_logged //duplicate captchas on same site (notify+ask+review...) static $counter; if (empty($counter)) $counter = 1; if ($id === 'dynamic_recaptcha_1') { $id = 'dynamic_recaptcha_'.$counter; $counter++; } if(VmConfig::get ($config) and ((JFactory::getUser()->guest==1) || (VmConfig::get ($config.'_logged')))) { //stAn - get joomla global config captcha: $reCaptchaName = JFactory::getConfig()->get('captcha', 'recaptcha'); if ($reCaptchaName === '0') { //joomla global captcha is set to use defafault, include all enabled captcha plugins JPluginHelper::importPlugin('captcha'); //include all enabled plugins } else { //include on the one enabled in global config JPluginHelper::importPlugin('captcha', $reCaptchaName); // will load the plugin selected, not all of them - we need to know what plugin's events we need to trigger } try { vDispatcher::trigger('onInit', array($id)); $output = vDispatcher::trigger('onDisplay', array($reCaptchaName, $id, 'g-recaptcha required')); } catch (Exception $e) { //we have a display timeout or other error within the captcha plugin //stAn - so we don't supress the error completely here (maybe vmDebug for admins woudl be better): JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); if (empty($output)) $output = array(); } $out = ''; foreach ($output as $html) { //null, 0 or false: if (empty($html)) continue; $out .= $html; } return $out; } return ''; } /** * Check the Joomla ReCaptcha Plg * * @author Maik Künnemann, Stan, Max Milbers */ static function checkCaptcha($config='reg_captcha'){ /*stAn - captcha can be called also for logged in users, especially ask a question or similar: if(JFactory::getUser()->guest==1 and */ if(VmConfig::get ($config) and ((JFactory::getUser()->guest==1) || (VmConfig::get ($config.'_logged'))) ){ /*stAn - this has to be validated within the plugin, not here $filled = vRequest::getVar ('g-recaptcha-response',false); if (!$filled){ vmInfo('COM_VM_FILL_CAPTCHA'); return false; } */ /* stAn, note, the $recaptcha variable is here just for historical usage, it is not used by current core plugins $recaptcha = vRequest::getVar ('recaptcha_response_field'); attacker could trick the captcha system to validate against his crafted input and thus leaving this up to the plugin is a better solution */ $recaptcha = null; JPluginHelper::importPlugin('captcha'); try { $res = vDispatcher::trigger('onCheckAnswer',array($recaptcha)); } catch (Exception $e) { $errmsg = $e->getMessage(); /*google specs here: https://developers.google.com/recaptcha/docs/verify for other cases it returns joomla strings */ switch ($errmsg) { case 'missing-input-secret': case 'invalid-input-secret': case 'invalid-input-response': case 'bad-request': case 'timeout-or-duplicate': $errmsg = vmText::_('PLG_RECAPTCHA_ERROR_INCORRECT_CAPTCHA_SOL'); break; } return $errmsg; } foreach ($res as $ret) { //stAn - captchas return (bool)FALSE when call is not allowed, for other cases like NULL we must not trigger an error if ($ret === false) { $errmsg = vmText::_('PLG_RECAPTCHA_ERROR_INCORRECT_CAPTCHA_SOL'); return $errmsg; } } } //no captcha enabled return TRUE; } static public function summarizeRulesForBill($order, $payShipment=true){ $discountsBill = array(); $taxBill = array(); //vmdebug('summarizeRulesForBill $taxBill input',$order['calc_rules']); foreach($order['items'] as $item){ //vmdebug('summarizeRulesForBill $item->product_subtotal_with_tax',$item->product_subtotal_with_tax); foreach($order['calc_rules'] as $rule){ //The virtuemart_order_item_id is missing for the payment and shipment rules, these are handled below if(isset($rule->virtuemart_order_item_id) and $rule->virtuemart_order_item_id == $item->virtuemart_order_item_id){ if($rule->calc_kind == 'VatTax' /*or $rule->calc_kind == 'Tax' */){ $rule->label = shopFunctionsF::getTaxNameWithValue($rule->calc_rule_name,$rule->calc_value); if(!isset($taxBill[$rule->virtuemart_calc_id])){ $taxBill[$rule->virtuemart_calc_id] = clone($rule); $taxBill[$rule->virtuemart_calc_id]->calc_amount = 0.0; $taxBill[$rule->virtuemart_calc_id]->subTotal = 0.0; } $taxBill[$rule->virtuemart_calc_id]->calc_amount += $rule->calc_amount * $item->product_quantity ; //vmdebug('summarizeRulesForBill $rule->calc_amount after multiplied with quantity = '.$item->product_quantity, $rule->calc_amount); $taxBill[$rule->virtuemart_calc_id]->subTotal += $item->product_subtotal_with_tax; } } else { if($rule->calc_kind == 'DBTaxRulesBill' or $rule->calc_kind == 'DATaxRulesBill'){ $discountsBill[$rule->virtuemart_calc_id] = $rule; } else if($rule->calc_kind == 'taxRulesBill'){ //vmdebug('summarizeRulesForBill taxRulesBill ', $rule); if(!isset($taxBill[$rule->virtuemart_calc_id])){ $rule->label = shopFunctionsF::getTaxNameWithValue($rule->calc_rule_name,$rule->calc_value); $taxBill[$rule->virtuemart_calc_id] = clone($rule); $taxBill[$rule->virtuemart_calc_id]->subTotal = $taxBill[$rule->virtuemart_calc_id]->calc_amount; } } } } } if($payShipment){ $idWithMax = 0; if(VmConfig::get('radicalShipPaymentVat',true)){ $maxValue = 0.0; foreach($order['calc_rules'] as $rule){ if($rule->calc_kind == 'taxRulesBill' or $rule->calc_kind == 'VatTax'){ if(empty($idWithMax) or $maxValue<=$taxBill[$rule->virtuemart_calc_id]->subTotal){ $idWithMax = $rule->virtuemart_calc_id; $maxValue = $taxBill[$rule->virtuemart_calc_id]->subTotal; } } } //vmdebug('radicalShipPaymentVat my $rule ',$maxValue,$taxBill); } foreach($order['calc_rules'] as $i=> $rule) { if($rule->calc_kind == 'payment' or $rule->calc_kind == 'shipment') { $keyN= 'order_'.$rule->calc_kind; if(empty($idWithMax)){ foreach($taxBill as $tax){ $sum = $order['details']['BT']->order_salesPrice; $t1 = $tax->calc_value * 0.01 * $tax->subTotal/$sum; $toAdd = $t1 * $order['details']['BT']->{$keyN} ; //vmdebug('ShipPay Rules $t1 '.$tax->calc_value * 0.01.' * '. $tax->subTotal.'/'.$sum.' = '.$t1); //vmdebug('ShipPay Rules $toAdd '.$t1.' * '. $order['details']['BT']->$keyN. ' = '.$toAdd. ' on '.$taxBill[$tax->virtuemart_calc_id]->calc_amount); $taxBill[$tax->virtuemart_calc_id]->calc_amount += $t1 * $order['details']['BT']->{$keyN} ; //vmdebug('ShipPay Rules '.$t1.' * '. $order['details']['BT']->$keyN.'='.$t1 * $order['details']['BT']->$keyN); } } else { $taxBill[$idWithMax]->calc_amount += $rule->calc_amount ; } } } } //vmdebug('summarizeRulesForBill $taxBill return',$taxBill); return array('discountsBill' => $discountsBill, 'taxBill' => $taxBill); } }