如何获取组件参数?

33

我有一个问题,一直无法解决 :-/

我正在开发一个带后台的 Joomla 组件。 在后台中,我设置了一个参数,dashboardId,但我无法在视图中访问它。每次我打印 params 时都会得到 data:protected。看起来我没有权限访问这个对象。

这是 default.xml 的内容:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
    <layout title="Dashboard">
        <message>
            <![CDATA[dashboard LAYOUT DESCRIPTION]]>
        </message>
    </layout>
    <fields name="params">
        <fieldset name="params">
            <field
                name="dashboardId" 
                type="text" 
                label="Dashboard ID"
                description="com_dashboard_desc"
                default="1"
            >   
            </field>
        </fieldset>
    </fields>
</metadata>

现在,在view.html.php中,我尝试这样访问参数:

$app = &JFactory::getApplication();
$params = JComponentHelper::getParams('com_dashboard');
$dashboardId = $params->get('dashboardId');
var_dump($dashboardId);

当我使用var_dump($dashboardId);时,我得到了NULL,但是当我转储$app时,我可以看到dashboardID

感谢任何帮助!


这是当我转储 $params 时的消息:object(JRegistry)#102 (1) { ["data":protected]=> object(stdClass)#106 (0) { } } ... 我想访问数据对象。 - Nico
8个回答

65

有更简单的方法。首先导入Joomla组件助手:

jimport('joomla.application.component.helper'); // not required in Joomla 3.x

然后您可以像这样检索任何您想要的属性:

$params = JComponentHelper::getParams('com_dashboard');
$dashboardID = $params->get('dashboardID');
问候。

3
这是目前在Joomla 2.5及以上版本中最好的做法。 - Cleanshooter
这是正确的方式,因为你会发现 Joomla 中大多数属性都是受保护的 [var_dump($params) 将向你展示这一点],而访问它们的唯一方式是通过函数调用。 - Anriëtte Myburgh

12
$app = JFactory::getApplication('site');
$componentParams = $app->getParams('com_example');
$param = $componentParams->get('paramName', defaultValue);

这在后端可能无法工作,因为JFactory::getApplication('site')仍会返回一个管理应用程序对象,该对象没有getParams方法。 - Valentin Despa

3

和LoboX提供的答案类似,我建议使用组件助手获取组件参数:

jimport('joomla.application.component.helper'); // Import component helper library
$params = JComponentHelper::getParams(JRequest::getVar('option')); // Get parameter helper (corrected 'JRquest' spelling)
$params->get('parameter_name'); // Get an individual parameter
JRequest::getVar('option') 返回带有 com_ 前缀的组件名称。除此之外,你似乎在试图将一些 1.5/1.6 语法混合到配置文件中。如果你还没有看过它,可以尝试阅读 2.5 版本 的文档。希望这能帮助到你!

正如aspirisen所指出的那样,在Joomla 3.x中,JRequest已被弃用,并已被JInput替换。其语法类似于: JFactory::getApplication()->input->getCmd('option','');自从我发布了原始答案后,我得出结论,最好使用硬编码字符串,就像其他几个答案一样,除非你正在进行大量编码并且无法打扰锁定而不是从请求参数中获取它。 - J.T. Blum

2

这与J.T. Blum的答案相似,但在Joomla 3.x中,JRequest已被弃用。有另一种方法可以获取应用程序的参数。

    $app = JFactory::getApplication();
    $input = $app ->input;
    $componentName = $input ->get('option');
    $params = JComponentHelper::getParams($componentName);
    print_r($params);

要获取参数,您必须使用 $params ->get('参数名称'); - aspirisen

2

自 3.1 版本以来,Joomla 正在废弃所有 J 类,实际上,4.0 版本将几乎废弃所有 J 类,从现在开始检索组件参数的推荐方式是调用整个命名空间函数:

Joomla\CMS\Component\ComponentHelper::getParams('com_dashboard')->get('dashboardID');

如果您正在处理模型,可以使用use关键字导入文件,并在文档中向下使用该类,如下:

use Joomla\CMS\Component\ComponentHelper;

function myFunction() {
    $param = ComponentHelper::getParams('com_dashboard');
    $dashboardID = $param->get('dashboardID');
}

1
到目前为止,这是2021年最好的答案。 - betweenbrain
如果使用J3或更高版本,请使用此选项。 - Peter Duley

1

获取所有Joomla版本1.5 / 2.5 / 3.x中的Params对象的辅助函数

class myCompoHelper{

    public static function getParams($option)
    {

        if (version_compare(JVERSION, '1.5', 'g'))
        {
            $application = JFactory::getApplication();
            if ($application->isSite())
            {
                $params = $application->getParams($option);
            }
            else
            {
                jimport('joomla.application.component.helper');
                $params = JComponentHelper::getParams($option);
            }
        }
        else
        {
            jimport('joomla.application.component.helper');
            $params = JComponentHelper::getParams($option);
        }
        return $params;
    }

}

$params=myCompoHelper::getParams('com_mycomponent');
echo $params->get('myParamName',null);

1
我遇到了类似的问题。直到我进入组件的配置并保存后,才得到了 data:protected 的结果。尽管 Joomla 在文本字段中打印了默认值,但在单击“保存”之前,它无法读取它们。

-1

我曾经遇到过同样的问题,解决方法如下:

$input = JFactory::getApplication()->input;
$parametername = $input->getInt('parametername');
echo $parametername;

这是默认视图 tmpl 文件夹中 default.xml 中参数的名称。 这是 xml:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
    <layout title="Offers">
         <message>This is a component in order to display offers</message>
    </layout>
    <state>
        <name>name</name>
            <description>description</description>

        <url addpath="/administrator/components/com_component/elements">
            <param name="category_id" section="com_component" type="categoriesmenu"  value_field="category_name" label="COM_COMPONENT_CATEGORY_FIELD_SELECT_TITLE" description="COM_COMPONENT_CATEGORY_FIELD_SELECT_TITLE_DESC" />
        </url>
    </state>

    <fields name="request" >
        <fieldset name="request" addfieldpath="/administrator/components/com_component/models/fields">
            <field name="parametername" type="category"
                label="category"
                required="true"
                description="Perigrafh"
            />
        </fieldset>
    </fields>


</metadata>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接