使用多个表单字段进行服务器端验证

时间:2019-05-29 17:34:12

标签: joomla

重写JFormRule函数“ test”,我需要针对同一表单中另一个表单字段的值对表单字段的值实施服务器端验证。我正在努力做一件可能很简单的事情:如何获得其他表单字段的值?

以下是我的表单定义easyfpu.xml的摘录:

<?xml version="1.0" encoding="utf-8"?>
<form addrulepath="/administrator/components/com_easyfpu/models/rules">
    <fieldset
        name="details"
        label="COM_EASYFPU_EASYFPU_DETAILS"
    >
        <field
            name="id"
            type="hidden"
        />
        <field
            name="calories"
            type="text"
            label="COM_EASYFPU_EASYFPU_CALORIES_LABEL"
            description="COM_EASYFPU_EASYFPU_CALORIES_DESC"
            size="40"
            class="inputbox validate-numfracpos"
            validate="numfracpos"
            required="true"
            hint="COM_EASYFPU_EASYFPU_CALORIES_HINT"
            message="COM_EASYFPU_EASYFPU_ERRMSG_NUMBER_FRAC"
        />
        <field
            name="carbs"
            type="text"
            label="COM_EASYFPU_EASYFPU_CARBS_LABEL"
            description="COM_EASYFPU_EASYFPU_CARBS_DESC"
            size="40"
            class="inputbox validate-numfracpos"
            validate="carbs"
            required="true"
            hint="COM_EASYFPU_EASYFPU_CARBS_HINT"
            message="COM_EASYFPU_EASYFPU_ERRMSG_NUMBER_FRAC"
        />
    </fieldset>
</form>

需要根据“卡路里”字段的值评估“碳水化合物”字段的值。这是我的测试例程“ carbs.php”:

class JFormRuleCarbs extends JFormRule
{
    public function test(SimpleXMLElement $element, $value, $group = null, JRegistry $input = null, JForm $form = null)
    {
        // Check if value is numeric
        if (!is_numeric($value)) {
            $element->attributes()->message = JText::_('COM_EASYFPU_EASYFPU_ERRMSG_NUMBER_FRAC');
            return false;
        }

        // Check if calories from carbs do not exceed total calories (1g carbs has 4 kcal)
        $caloriesFromCarbs = $value * 4;
        $totalCalories = $form->getValue('calories');

        if ($caloriesFromCarbs > $totalCalories) {
            $element->attributes()->message = JText::_('COM_EASYFPU_EASYFPU_ERRMSG_TOOMUCHCARBS');
            return false;
        }

        return true;
    }
}

不幸的是,代码$totalCalories = $form->getValue('calories');不会返回任何内容,可能是因为它是字段集的一部分。如何在此测试例程中获取该字段的值?

1 个答案:

答案 0 :(得分:0)

解决了!

调用$form函数时,test函数的test变量尚未填充要存储的表单中的数据。很有道理,否则您已经希望通过执行测试排除的潜在错误将已经存储。

取而代之的是从$input变量中检索所需的表单值,并且已全部设置!这是正确的代码:

​class JFormRuleCarbs extends JFormRule
{
    public function test(SimpleXMLElement $element, $value, $group = null, JRegistry $input = null, JForm $form = null)
    {
        // Check if value is numeric
        if (!is_numeric($value)) {
            $element->attributes()->message = JText::_('COM_EASYFPU_EASYFPU_ERRMSG_NUMBER_FRAC');
            return false;
        }
        // Check if calories from carbs do not exceed total calories (1g carbs has 4 kcal)
        $caloriesFromCarbs = $value * 4;
        $totalCalories = $input->get('calories', 0); // <-- THIS IS HOW IT WORKS!
        if ($caloriesFromCarbs > $totalCalories) {
            $element->attributes()->message = JText::_('COM_EASYFPU_EASYFPU_ERRMSG_TOOMUCHCARBS');
            return false;
        }
        return true;
    }
}