在Joomla组件的首选项中为表单字段定义过滤函数的位置

时间:2013-11-11 09:44:20

标签: joomla filter components preferences

我正在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 中,所以我的帮助程序类不可用!

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

3 个答案:

答案 0 :(得分:2)

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

<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;
    }
}

答案 1 :(得分:1)

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

  

我们的表单字段如下所示:

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

compojoom - 控制 - 标签”         filter =“MyComponentFilterDouble :: filter”required =“true”/&gt;

     

如您所见,我们有一个过滤器。我们已经指定了   MyComponentFilterDouble作为类,过滤为此类的方法。   如果你看看中的libraries / 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

答案 2 :(得分:0)

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

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