We now identified the issue which breaks the thank you template design on Joomla 4.2 and VM4.
The modification needs to be done in virtuemart core:
\components\com_virtuemart\helpers\vmtemplate.php
modified section:
- Code: Select all
if(is_dir( VMPATH_ROOT .'/templates/'.$template )) {
if(VmConfig::isSiteByApp()) {
$app = JFactory::getApplication();
$currentTemplate = $app->getTemplate();
if ($currentTemplate !== $template)
{
if (JVM_VERSION >= 4) {
$templateObj = (object)$res;
$app->setTemplate($templateObj);
$currentTemplateObj = $app->getTemplate(true);
$currentTemplateObj->id = $templateObj->id;
}
else {
$app->setTemplate($template, $registry);
}
}
}
} else {
vmError( 'The chosen template couldnt be found on the filesystem: '.VMPATH_ROOT.'/templates/'.$template );
}
or full file against latest VirtueMart 4.0.7 10690 is available here:
- Code: Select all
<?php
defined('_JEXEC') or die('');
/**
* Helper to handle the templates
*
* @package VirtueMart
* @subpackage Helpers
* @author Max Milbers
* @copyright Copyright (c) 2014 VirtueMart Team and author. All rights reserved.
* @license http://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.
* See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
*
* http://virtuemart.net
*/
use Joomla\Registry\Registry;
class VmTemplate {
static $_templates = array();
static $_home = array(false,false);
public static function loadVmTemplateStyle() {
static $res = null;
if($res !== null) return $res;
$vmtemplate = VmConfig::get( 'vmtemplate', 0 );
if(empty($vmtemplate) or $vmtemplate == 'default') {
$res = self::getDefaultTemplate();
if(!$res) {
$err = 'Not able to load default template';
vmError( 'renderMail get Template failed: '.$err );
}
} else if(!empty($vmtemplate) and is_numeric( $vmtemplate )) {
$res = self::getTemplateById( $vmtemplate );
}
if(!$res) {
vmError( 'loadVmTemplateStyle failed: Could not load default template style');
} else {
return $res;
}
}
/**
* @param int $client_id FE is 0, BE is 1
* @return bool
*/
public static function getDefaultTemplate($client_id = 0){
if(self::$_home[$client_id]) return self::$_home[$client_id];
$app = JFactory::getApplication();
if(!$client_id and VmConfig::isSiteByApp()){
$template = $app->getTemplate(true);
$template = get_object_vars($template);
} else {
$q = 'SELECT id, home, template, s.params
FROM #__template_styles as s
LEFT JOIN #__extensions as e
ON e.element=s.template
AND e.type="template"
AND e.client_id=s.client_id
WHERE s.client_id = '.$client_id.'
AND e.enabled = 1 AND s.home = 1';
$db = JFactory::getDbo();
$db->setQuery( $q );
$template = $db->loadAssoc();
$template['params'] = new Registry($template['params']);
}
if(!$template){
vmError( 'getDefaultTemplate failed ' );
return false;
} else {
self::$_home[$client_id] = $template;
self::$_templates[$template['id']] = $template;
return self::$_templates[$template['id']];
}
}
public static function getTemplateById($id){
if(!isset(self::$_templates[$id])){
$q = 'SELECT * FROM `#__template_styles` WHERE `id`="'.(int)$id.'" ';
$db = JFactory::getDbo();
$db->setQuery($q);
self::$_templates[$id] = $db->loadAssoc();
if(!self::$_templates[$id]){
vmError( 'getTemplateById get Template failed for id: '.$id );
}
}
return self::$_templates[$id];
}
/**
* This function sets the right template on the view
* @author Max Milbers
*/
static function setVmTemplate ($view, $catTpl = 0, $prodTpl = 0, $catLayout = 0, $prodLayout = 0) {
//Lets get here the template set in the shopconfig, if there is nothing set, get the joomla standard
$template = VmConfig::get( 'vmtemplate', 0 );
$db = JFactory::getDBO();
//Set specific category template
if(!empty($catTpl) && empty($prodTpl)) {
if(is_Int( $catTpl )) {
$q = 'SELECT `category_template` FROM `#__virtuemart_categories` WHERE `virtuemart_category_id` = "'.(int)$catTpl.'" ';
$db->setQuery( $q );
$temp = $db->loadResult();
if(!empty($temp)) $template = $temp;
} else {
$template = $catTpl;
}
}
//Set specific product template
if(!empty($prodTpl)) {
if(is_Int( $prodTpl )) {
$q = 'SELECT `product_template` FROM `#__virtuemart_products` WHERE `virtuemart_product_id` = "'.(int)$prodTpl.'" ';
$db->setQuery( $q );
$temp = $db->loadResult();
if(!empty($temp)) $template = $temp;
} else {
$template = $prodTpl;
}
}
if( (!empty($template) and $template!='default') or !vmConfig::isSiteByApp()){
self::setTemplate( $template );
}
//Lets get here the layout set in the shopconfig, if there is nothing set, get the joomla standard
if(vRequest::getCmd( 'view' ) == 'virtuemart') {
$layout = VmConfig::get( 'vmlayout', 'default' );
$view->setLayout( strtolower( $layout ) );
} else {
if(empty($catLayout) and empty($prodLayout)) {
$catLayout = VmConfig::get( 'productlayout', 'default' );
}
//Set specific category layout
if(!empty($catLayout) && empty($prodLayout)) {
if(is_Int( $catLayout )) {
$q = 'SELECT `layout` FROM `#__virtuemart_categories` WHERE `virtuemart_category_id` = "'.(int)$catLayout.'" ';
$db->setQuery( $q );
$temp = $db->loadResult();
if(!empty($temp)) $layout = $temp;
} else {
$layout = $catLayout;
}
}
//Set specific product layout
if(!empty($prodLayout)) {
if(is_Int( $prodLayout )) {
$q = 'SELECT `layout` FROM `#__virtuemart_products` WHERE `virtuemart_product_id` = "'.(int)$prodLayout.'" ';
$db->setQuery( $q );
$temp = $db->loadResult();
if(!empty($temp)) $layout = $temp;
} else {
$layout = $prodLayout;
}
}
}
if(!empty($layout)) {
$view->setLayout( strtolower( $layout ) );
}
}
/**
* Final setting of template
* Accepts a string, an id or an array with at least the keys template and params
* @author Max Milbers
*/
static function setTemplate ($template = 0) {
$res = false;
if(is_array($template)){
$res = $template;
} else {
if(empty($template) or $template == 'default'){
$res = self::loadVmTemplateStyle();
} else {
if(is_numeric($template)){
$res = self::getTemplateById($template);
} else {
vmAdminInfo('Your template settings are old, please check your template settings in the vm config and in your categories');
vmdebug('Your template settings are old, please check your template settings in the vm config and in your categories');
}
}
}
$registry = null;
if($res){
$registry = new JRegistry;
$registry->loadString($res['params']);
$template = $res['template'];
}
if(is_dir( VMPATH_ROOT .'/templates/'.$template )) {
if(VmConfig::isSiteByApp()) {
$app = JFactory::getApplication();
$currentTemplate = $app->getTemplate();
if ($currentTemplate !== $template)
{
if (JVM_VERSION >= 4) {
$templateObj = (object)$res;
$app->setTemplate($templateObj);
$currentTemplateObj = $app->getTemplate(true);
$currentTemplateObj->id = $templateObj->id;
}
else {
$app->setTemplate($template, $registry);
}
}
}
} else {
vmError( 'The chosen template couldnt be found on the filesystem: '.VMPATH_ROOT.'/templates/'.$template );
}
return $template;
}
}
We hope that this modification will get into VM4.0.8 core.
best regards, stan