Hello,
in a custom admin module I am trying to set catalog mode like this:
Quote
if( ! class_exists('VmConfig')) require JPATH_ADMINISTRATOR . '/components/com_virtuemart/helpers/config.php';
VmConfig::loadConfig();
echo VmConfig::get('use_as_catalog'); # -> 0
VmConfig::set('use_as_catalog',1)
echo VmConfig::get('use_as_catalog'); # -> 1
This looked fine at first but
use_as_catalog is not written to #__virtuemart_configs. I guess I'm missing something trivial here. (Logged in as superadmin, if that matters).
Any hints?
# VirtueMart 3.8.8 10472
Your code only set the value in the memory not in the real virtuemart config
Only here JOOMLAROOT/administrator/components/com_virtuemart/controllers/config.php
all values are saved in the table
Hello Studio 42
thank you for the reply. How can I trigger saving the config? I guess there is an API call for thsi that I am missing?
No api call for this. You have to write your own code
But you can set it using a Joomla system plugin for eg
Hello Studio 42,
so my code would basically be a copy of VirtuemartControllerConfig save()?
Would instead creating an instance of VirtuemartControllerConfig and use save() from there have any side effects?
Update:
No, it looks like you cannot use the save() method for anything. You can pass $data but that get's overwritten by request/post right away:
class VirtuemartControllerConfig extends VmController {
// ...
function save($data = 0){
vRequest::vmCheckToken();
$model = VmModel::getModel('config');
$data = vRequest::getPost();
You can use the following codes to save configuration data to the database.
<?php
// Your configuration data
$data = array(
'use_as_catalog' => 0
);
// Register VM Config Class
JLoader::register('VmConfig', JPATH_ADMINISTRATOR . '/components/com_virtuemart/helpers/config.php');
// Load config
VmConfig::loadConfig();
// Get an instance of the Config model
$model = VmModel::getModel('config');
// If save fails
if (!$model->store($data)) {
// Do your stuff if save fails
return false;
}
// Reload the newly saved config
VmConfig::loadConfig();
Hello Jumbo,
thank you very much!
I was just investigating if I'd need a full data set or just the required keys.
Works perfectly!
One issue remains:
Somhow the virtuemart safe path (forSale_path) gets removed from the config.
UPDATE
Looks like the config model store($data) method completely ignores all data stored in the DB and only loads config from config file.
function store(&$data) {
// ...
//We create a fresh config
$config = VmConfig::loadConfig(false,true);
//We load the config file
$_raw = self::readConfigFile();
$_value = join('|', $_raw);
//We set the config file values as parameters into the config
$config->setParams($_value);
//We merge the array from the file with the array from the form
//in case it the form has the same key as the file, the value is taken from the form
$config->_params = array_merge($config->_params,$data);
Have you tried VmConfig::updateDbEntry() ?
Here's my updated code that gets the full config data from database first:
// Get current full config from database
$VmConfig = VmConfig::loadConfig(); // VmConfig object
// $VmConfig->get(key)
// $VmConfig->set(key,value)
// $VmConfig->_raw [all data as string, |-delimited]
// VmConfig->_params [all data as array]
$VmConfigData = $VmConfig->_params;
// Update config data with custom values:
$VmConfigData['use_as_catalog'] = 1;
// Store into database:
$model = VmModel::getModel('config');
if( ! $model->store($VmConfigData)) {
JFactory::getApplication()->enqueueMessage('failed');
return false;
}
VmConfig::loadConfig();
Hello Ghost,
> Have you tried VmConfig::updateDbEntry() ?
Did not know this method. It's not in the calss documentation, is it? Will try!