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

Do a server side validation using multiple form fields

覆盖 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" 字段的值需要根据 "calories" 字段的值进行评估。这是我的测试程序 "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'); 不会 return 任何东西,可能是因为它是字段集的一部分。如何在此测试例程中获取此字段的值?

已解决!

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

改为从 $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;
    }
}