Проблема с значением "0" в формах и выводе ICMS2

#1 14 октября 2015 в 06:22
Создаю форму c полями:
  1. new fieldString('ballm', array(
  2. 'title' => LANG_YCHET_BALLM,
  3. 'rules' => array(
  4. array('required'),
  5. array('max_length', 3)
  6. )
  7. )),
  8. new fieldString('balla', array(
  9. 'title' => LANG_YCHET_BALLA,
  10. 'rules' => array(
  11. array('required'),
  12. array('max_length', 3)
  13. )
  14. )),
  15. new fieldString('balli', array(
  16. 'title' => LANG_YCHET_BALLI,
  17. 'rules' => array(
  18. // array('required'),
  19. array('max_length', 3)
  20. )
Но если ввести значение "0", то почему-то срабатывает правило required, т.е. для него 0 это не значение, хотя я использую тип поля fieldString, пробовал поле number эффект тотже, т.е. правило required не дает занести значение "0"(цифра ноль). без рекваред понятно что заносит, НО!

Так и при выводе в админке grid это значение не выводится.

Почему так?

Тип поля в базе varchar.
#2 14 октября 2015 в 08:41
kirkr, об этом даже в документации написано, правда только в разделе список. Но принцип тот же:

:!: Ни в коем случае не используйте в таком списке в качестве id число 0 (ноль). Этот ноль будет некорректно обрабатываться программой: на первом месте списка, при обязательности заполнения поля, он будет провоцировать ошибку «поле не заполнено»; если же данный пункт (с нулевым индексом) поставить на другие места, в БД результат будет попадать правильно, но значение не будет отображаться в профиле, как будто оно пустое.
:!: Столь же непредсказуемо ведут себя, в качестве индексов, отрицательные числа. Поэтому единственный дельный совет: используйте только положительные целые числа больше ноля.

Документация
#3 14 октября 2015 в 09:30
Loadырь, Вопрос в том, что я записываю строковое значение, а не списком или числом даже. Строке вообще побарабану должно быть по символам.

И в документации про индексы и ключевые поля. У меня же не главные поля, а значения.
#4 14 октября 2015 в 10:12
kirkr, А какая разница, вводится 0 с клавиатуры или выбирается из списка. Система проверяет значение "value", а не то каким способом оно заполняется.
#5 14 октября 2015 в 12:22
Loadырь, Разница в передачи например integer или string, при текстовой передачи ему вообще побарабану должно быть на символ ноль
#6 2 ноября 2015 в 20:45
Переформулируем вопрос. Кто как выходит из ситуации, когда в значение поля надо записать ноль?
Мне, например, надо вести учет количества пользователей, идущих на мероприятие.

Я пока поступил так. Поле со значением по умолчанию 1, при выводе минусую 1…

Есть более элегантные решения?
#7 2 ноября 2015 в 22:03

Разница в передачи например integer или string, при текстовой передачи ему вообще побарабану должно быть на символ ноль

kirkr
в php "0" == 0!!! Как по мне, так это круто. Но вот такая запись "0"===0 уже не правильная (use strict так сказать) )) Вот тут хорошие таблицы сравнения: http://php.net/manual/en/types.comparisons.php

Zau4man, я в дополнениях прописываю: ставьте "-1" для такого-то значения ))) Костыль еще тот… У меня такое прокатывает потому что само значение 0 не используется в расчетах или коде, а вот если нужно получить именно 0...?
#8 2 ноября 2015 в 23:31
Я немного покопался в коде и нашел функцию проверки поля:
..\system\core\controller.php
  1. public function validate_required($value){
  2. if (empty($value)) { return ERR_VALIDATE_REQUIRED; }
  3. return true;
  4. }
а что если дополнительно проверять значение на текстовый ноль?
  1. public function validate_required($value){
  2. if (empty($value) && $value !=="0") { return ERR_VALIDATE_REQUIRED; }
  3. return true;
  4. }
#9 2 ноября 2015 в 23:50
Не правильнее бы было использовать is_null() вместо empty()?
#10 3 ноября 2015 в 00:06
если использовать is_null(), тогда пустая строка может пройти валидацию, в то время, как нам наоборот нужно чтобы поле содержало значение.
#11 3 ноября 2015 в 00:21
А, то есть всё равно без двух условий не обойтись.
#12 3 ноября 2015 в 10:59
Val, пойду потестирую, спасибо.
#13 3 ноября 2015 в 11:55
Val, получается, что работает. Только надо еще в шаблонах вывода контента внести изменения.
default_list.tpl.php и default_item.tpl.php Там тоже есть проверочка...

было
  1. <?php if (empty($item[$field['name']])) { continue; } ?>
надо
  1. <?php if (empty($item[$field['name']]) && $item[$field['name']] !=="0") { continue; } ?>
#14 3 ноября 2015 в 11:56
Проверить кстати легко самому. В любое поле string типа контента сохраняем цифру 0. Без правок — ноль не выводится.
С правками в контроллере и шаблоне — выводится.
#15 3 ноября 2015 в 12:00
У себя я проверял — работало. Но как я говорил у меня узкоспецифичное использование))) Поэтому и предложил вам более широко глянуть — с шаблонами я не разбирался))))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.