在Joomla 3中设置持久性插件参数

时间:2014-03-06 21:57:44

标签: php joomla joomla3.0

我正在开发一个Joomla 3.x插件,并希望能够以编程方式更改插件的清单文件中的插件参数集。我相信我需要使用JRegistry对象,但我不确定语法。

问题在于:

// token A is set in plugin params as defined in plugin's XML manifest
var_dump($this->params->get('token')); // prints token "A" as expected

// do some stuff to get a fresh access token, called token "B"
$tokenB = $function_to_get_fresh_token();

// set the new token
if ($tokenB) $this->params->set('token', $tokenB);

var_dump($this->params->get('apptoken')); // prints token "B" as expected

问题在于,在后续页面重新加载时,令牌将恢复为tokenA,而不是我认为的tokenB的存储值。

如何将tokenB值存储在数据库中的插件参数中?

3 个答案:

答案 0 :(得分:1)

这只是一个大纲,但是沿着这些方向

$extensionTable = new  JtableExtension();
$pluginId = $extensionTable->find('element', 'my_plugin');
$pluginRow = $extensionTable->load($pluginId);

// Do the jregistry work that is needed
// do some stuff to get a fresh access token, called token "B"
$tokenB = $function_to_get_fresh_token();

// set the new token
if ($tokenB) $this->params->set('token', $tokenB);

// more stuff

$extensionTable->save($pluginRow);

答案 1 :(得分:1)

这是一个如何从插件中更改插件参数的工作示例(J!3.4):

// Load plugin called 'plugin_name'
$table = new JTableExtension(JFactory::getDbo());
$table->load(array('element' => 'plugin_name'));

// Params can be changed like this
$this->params->set('new_param', 'new value'); // if you are doing change from a plugin
$table->set('params', $this->params->toString());

// Save the change
$table->store();

注意:如果插件动态添加了新的参数并且之后保存了插件,则会删除这些新的参数。因此,处理它的一种方法是将这些参数作为隐藏字段添加到插件的配置XML中。

答案 2 :(得分:0)

我花了很多时间在谷歌搜索和阅读,并没有找到真正的答案。奇怪的是,这似乎没有在Joomla中提供。所以这就是我最终做的事情:

1)构建一个获取插件ID的函数,因为它将从一个安装更改为另一个

private function getPlgId(){
    // stupid hack since there doesn't seem to be another way to get plugin id
    $db = JFactory::getDBO();
    $sql = 'SELECT `extension_id` FROM `#__extensions` WHERE `element` = "my_plugin" AND `folder` = "my_plugin_folder"'; // check the #__extensions table if you don't know your element / folder
    $db->setQuery($sql);
    if( !($plg = $db->loadObject()) ){
        return false;
    } else {
        return (int) $plg->extension_id;
    }
}

2)使用插件id加载表对象:

$extension  = new JTableExtension($db);
$ext_id = $this->getPlgId(); 

// get the existing extension data
$extension->load($ext_id);

3)当您准备好存储值时,将其添加到参数中,然后存储它:

$this->params->set('myvalue', $newvalue);
$extension->bind( array('params' => $this->params->toString()) );

// check and store 
if (!$extension->check()) {
    $this->setError($extension->getError());
    return false;
}
if (!$extension->store()) {
    $this->setError($extension->getError());
    return false;
}

如果有人知道更好的方法,请告诉我!