我正在开发一个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
值存储在数据库中的插件参数中?
答案 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;
}
如果有人知道更好的方法,请告诉我!