Thank you page broken on Joomla 4.2
Posted: Thu Sep 08, 2022 10:01 pm
Hello,
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:
or full file against latest VirtueMart 4.0.7 10690 is available here:
We hope that this modification will get into VM4.0.8 core.
best regards, stan
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