在我的 Joomla 组件的首选项中为表单字段定义过滤器功能的位置

Posted

技术标签:

【中文标题】在我的 Joomla 组件的首选项中为表单字段定义过滤器功能的位置【英文标题】:Where to define a filter function for a form field in my Joomla component's preferences 【发布时间】:2013-11-23 01:36:35 【问题描述】:

我正在 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 中找到并调用它?非常感谢您的帮助。

【问题讨论】:

与此同时,我想出了一个(相当大的)变通/解决方案。我喜欢验证可以使用从 JFormRule 扩展的类的方式,但过滤没有实现。所以我扩展了 JForm 和 ConfigControllerComponent 和 ConfigModelComponent 类(com_config 的一部分),现在它们可以使用从 JFormFilter 类扩展的类,与实现验证的方式完全相同! 我对 Joomla 扩展 API 也有同样的感觉。实现我需要的功能比实现实际应用程序花费更多的时间......:S 【参考方案1】:

可能为时已晚,但这个话题只是我发现的那个麻烦。可能是我的解决方案会对某人有所帮助。 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;
    

【讨论】:

这是一个非常好的和干净的方式!没想到……对我来说太晚了,但绝对值得为其他人发布。【参考方案2】:

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

我们的表单域如下所示:

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

compojoom-控制标签" filter="MyComponentFilterDouble::filter" required="true"/>

如您所见,我们有一个过滤器。我们已经指定 MyComponentFilterDouble 作为类,filter 作为此类的方法。 如果您查看 library/joomla/form/form.php FilterField 函数接近尾声你会看到代码会尝试 执行我们的自定义过滤器。现在,棘手的部分来了。如何 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

【讨论】:

这就是我所说的“我设法为组件的视图*中使用的表单字段执行此操作”。 *模型/形式【参考方案3】:

我认为您要问的实际上是向您的表单字段之一添加自定义验证。如果是这种情况,除了adding configuration 之外,您实际上还需要查看adding server-side validation。请特别注意“使用配置参数作为默认值”标题下示例中的“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;*"
/>

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

【讨论】:

感谢您尝试回答我的问题。据我所知,验证不能改变输入值。它只能在无效输入时中止保存表单并显示一条消息。我需要的是过滤能力,它可以将实际输入更改/转换为所需的形式。但是,我喜欢验证使用从 JFormRule 扩展的类的方式,但过滤没有实现。与此同时,我已经扩展了 com_config 和 JForm 类,现在它们使用扩展的 JFormFilter 类与验证完全相同,但现在用于过滤,能够更改输入值! 很抱歉,我没有完全得到您要找的东西,但我很高兴它至少有所帮助。

以上是关于在我的 Joomla 组件的首选项中为表单字段定义过滤器功能的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 XML 之外使用 Joomla 的表单字段类型

将选项卡和字段添加到自定义 joomla 组件

组件模块中的 Joomla 过滤器表单,自动填充字段

Joomla - 在我的组件中显示一篇文章

joomla 2.5 JText在xml文件中不起作用

Joomla 2.5 - 组件开发 - 使用表单