3

我正在 Joomla 2.5 中创建一个组件。该组件在其config.xml中定义了一些选项,因此可以在组件的首选项中设置它们。现在我想使用属性对这些选项字段之一应用过滤器filter="my_filter"

在 JForm 的源代码中,我在执行的最后看到了以下几行JForm::filterField()

if (strpos($filter, '::') !== false && is_callable(explode('::', $filter)))
{
  $return = call_user_func(explode('::', $filter), $value);
}
elseif (function_exists($filter))
{
  $return = call_user_func($filter, $value);
}

这就是我使用自己定义的过滤器功能所需要的!

我设法为组件视图中使用的表单字段做到了这一点。我将过滤器函数定义为MyComponentHelper::my_filter(),其中MyComponentHelper是一个帮助类,我总是将它加载到我的组件的基础中。在表单的 xml 中,我添加filter="MyComponentHelper::my_filter"了必须过滤的字段。但是...当我尝试将过滤器功能应用于组件首选项中的表单字段时,我不在我自己的组件中,而是在com_config中,所以我的助手类不可用!

因此,我的问题是:在哪里定义我自己的过滤器函数,以便可以JForm::filterField()com_config中找到和调用它?非常感谢您的帮助。

4

3 回答 3

2

可能为时已晚,但这个话题只是我发现的那个麻烦。可能是我的解决方案会对某人有所帮助。1) 将属性“addfieldpath”添加到 .xml 表单文件的标签,如下所示:

<fieldset name="basic" addfieldpath="PATH_TO_MY_EXTENSION/models/fields">

2)修改过滤字段描述如下:

<field
    name="MY_FIELD_NAME"
    type="myfildtype"
    label="MY_FIELD_LABEL"
    description="MY_FIELD_DESC"
    filter="JFormFieldMyFieldType::filter"
/>

3)创建文件'PATH_TO_MY_EXTENSION/models/fields/myfildtype.php':

<?php
defined('JPATH_PLATFORM') or die;
JFormHelper::loadFieldClass('text'); // or other standard Joomla! field type

class JFormFieldMyFieldType extends JFormFieldText // or other standard Joomla! field type class
{
    protected $type = 'MyFieldType';

    public static function filter($value)
    {
        // filter code
        return $value;
    }
}
于 2017-04-14T10:14:18.267 回答
1

我今天不得不处理同样的问题。这就是我所做的。

我们的表单域如下所示:

<field name="verwaltungskosten" type="text" class="form-control" size="40" label="Verwaltungskosten" labelclass="col-sm-2

compojoom-control-label" filter="MyComponentFilterDouble::filter" required="true"/>

如您所见,我们有一个过滤器。我们已将 MyComponentFilterDouble 指定为类,并将 filter 指定为此类的方法。如果您查看最后的 FilterField 函数中的 library/joomla/form/form.php,您会看到代码将尝试执行我们的自定义过滤器。现在,棘手的部分来了。Joomla 如何知道我们的过滤器在哪里?好吧,它没有!我们必须提前加载过滤器。JForm 没有附带可以加载自定义过滤器的实用程序类。我决定在 getForm 函数的模型中加载我们的过滤器。如您所知,从 JModelAdmin 扩展的每个模型都应该有一个 getForm 函数。此函数确保我们从 .xml 文件加载正确的表单。所以在这个函数中,就在我加载我所做的表单之前:

JLoader::discover('MyComponentFilter', JPATH_ADMINISTRATOR . '/components/com_mycomponent/models/forms/filters');

discover 方法将确保在我们需要时自动加载我们的类。这样它就可以在我们的表单中使用。

我们去吧!现在,当我们的模型验证表单时。它实际上总是首先对数据执行过滤。现在在我们的自定义过滤器中,我们可以修改数据并将其传回以进行验证。就这么容易!

上面的文字是用引号引起来的,因为我从我的博客文章中获取了关于相同问题的内容:https ://compojoom.com/blog/entry/custom-filtering-for-jform-fields

于 2015-03-11T11:44:53.533 回答
0

我认为您要问的实际上是向您的表单字段之一添加自定义验证。如果是这种情况,除了添加配置之外,您实际上还需要考虑添加服务器端验证。请特别注意“使用配置参数作为默认值”标题下示例中的“addrulepath”。您很可能最终会扩展 JFormRule,我在下面包含了一个非常精简的示例。

<?php
/** headers */
defined('JPATH_PLATFORM') or die; // Joomla only

class JFormRuleCustom extends JFormRule
{
    public $type = 'Custom';

    public function test(&$element, $value, $group = null, &$input = null, &$form = null) {
        return /* true for passed validation, false for failed validation */
    }
}

完成后,您可以将验证“自定义”添加到表单字段中,如下所示:

<field
    name="pw1"
    type="password"
    label="COM_NEWUSER_UPDATE_LABEL_PASSWORD1"
    description="COM_NEWUSER_UPDATE_DESCRIPTION_PASSWORD1"
    message="COM_NEWUSER_UPDATE_ERROR_PASSWORD1"
    size="40"
    required="true"
    validate="custom"
    minlength="5"
    maxlength="20"
    specials="!@#$%^&amp;*"
/>

希望这能回答您的问题,并且不会完全偏离主题。

于 2013-12-20T21:11:16.463 回答