Переопределяя функцию «тест» JFormRule, мне нужно реализовать проверку на стороне сервера значения поля формы по сравнению со значением другого поля формы в той же форме. Я борюсь с, вероятно, очень простой вещью: как я могу получить значение этого другого поля формы?
Вот выдержка из моего определения формы 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');
ничего не вернет, вероятно, потому, что он является частью набора полей. Как я могу получить значение этого поля в этой тестовой процедуре?
Спасибо, @Laoneo, это был ценный совет — см. мой ответ ниже!
Решено!
Переменная $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;
}
}
Скорее всего, значения еще не заполнены, но в основном ваш код ($form->getValue('калории')) должен работать.