使用多个表单域执行服务器端验证



覆盖 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>
"碳水化合物"字段的值

需要根据"卡路里"字段的值进行评估。这是我的测试程序"碳水化合物.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');不会返回任何内容,可能是因为它是字段集的一部分。如何在此测试例程中获取此字段的值?

解决了!

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

最新更新