Zend Elements и setRequired, setAllowEmpty, NotEmpty

Я проверяю массив данных на форму Zend, где требуются некоторые элементы, т. Е. SetRequired (true), а другие необязательны, т. Е. SetRequired (false).

Когда в массиве данных содержатся ключи, соответствующие необязательным элементам, мне нужна проверка для выполнения этих данных. Если таких ключей нет, проверка не должна выполняться.

Это звучит довольно просто, но у меня все в тупике. В необязательных элементах я использовал setAllowEmpty (false), считая, что Zend Validate заставит проверку, если в массиве есть соответствующий ключ, и в противном случае игнорировать его. На самом деле происходит то, что Zend Validate показывает ошибку, даже если элемент не существует в массиве.

Есть идеи?

ОБНОВИТЬ:

Я провел несколько тестов со всеми возможными комбинациями параметров элемента и рядом различных типов данных $ data [element]. Файл журнала находится ниже.

Я не уверен, что результаты совпадают с документацией, и я также подозреваю, что использование setAutoInsertNotEmptyValidator () влияет на то, как работает простой валидатор Alnum. (См. Тесты 3, 4, 13 и 14 ниже).

Кто-то хочет проверить мой код? Я рад отправить его.

2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): ALLOWED: org / testform (kim@kimprince.com, admin) 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Настройки элемента: 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): =========== ====== 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 1: setRequired () [default: false] 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7 ): 2: setAllowEmpty () [default: true] 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 3: setAutoInsertNotEmptyValidator () [default: true] 2011-04-19T13: 06: 59+ 10:00 DEBUG (7): 4: добавить Alnum Validator 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Условия данных: 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): =========== ===== 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): A: data [element] = Foo 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): B : data [element] BLANK 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): C: данные [элемент] НЕ СУЩЕСТВУЕТ 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7 ):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): # 1 === 2 === 3 === 4 ===== A ======= B ==== === C ===== 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 1 T | T | T | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C : Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 2 T | T | T | F: передать FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C : Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 3 T | T | F | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: '' – пустая строка 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C: Неверный тип данный. String, integer или float ожидается 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 4 T | T | F | F: проходный проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 5 T | F | T | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C : Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 6 T | F | T | F: передать FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C : Значение требуется и не может быть пустым 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 7 T | F | F | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: '' – пустая строка 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C: Неверный тип данный. String, integer или float ожидается 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 8 T | F | F | F: проходный проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 9 F | T | T | T: пройти проходной проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 10 F | T | T | F: проходный проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 11 F | T | F | T: пройти проходной проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 12 F | T | F | F: проходный проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 13 F | F | T | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: '' – пустая строка 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C: Неверный тип данный. String, integer или float ожидается 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 14 F | F | T | F: проходный проход
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 15 F | F | F | T: пройти FAIL FAIL
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка B: '' – пустая строка 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): Ошибка C: Неверный тип данный. String, integer или float ожидается 2011-04-19T13: 06: 59 + 10: 00 DEBUG (7):
2011-04-19T13: 06: 59 + 10: 00 DEBUG (7): 16 F | F | F | F: проходный проход

setRequired () кажется избыточной функцией, потому что setAllowEmpty довольно то же самое. Я думаю, что это где-то проблема.

Однако в дополнение к валидаторам вы можете использовать setRequired(flag) чтобы указать, что требуется элемент. По умолчанию этот флаг имеет значение false . В сочетании с setAllowEmpty(flag) , который по умолчанию является true , и setAutoInsertNotEmptyValidator(flag) , который по умолчанию является true , вы можете изменить поведение процесса проверки:

  • по умолчанию, используя флаги по умолчанию, когда вы не передаете значение или пустую строку, валидаторы пропускаются и возвращается истина
  • оставляя все флаги по умолчанию и используя setAllowEmpty(false) будет проверять валидатор для этого элемента
  • оставляя все флаги по умолчанию и используя setRequired(true) , добавит валидатор NotEmpty . Поэтому, если значение не передано, мы уведомляем пользователя и запрещаем выполнение других валидаторов, поскольку мы знаем, что это недопустимые данные

Поэтому setAllowEmpty (false), оставляющий все флаги по умолчанию, будет таким же, как setRequired (true) и setAutoInsertNotEmptyValidator (false); это путает из-за именования

Надеюсь, это поможет 😉

Попробуйте использовать

  $form->isValidPartial($partialData) 

Это проверяет только ключи, которые присутствуют в переменной $ partialData. Это может сделать то, что вам нужно.