Самый простой подход здесь заключается в использовании простого пользовательского Zend Validator, который будет анализировать входные элементы, поскольку весь массив PHP видит это так, что вы можете выполнить следующее автоматически.
- Проверка каждого элемента ввода независимо и отображение сообщений об ошибках, связанных с каждым элементом.
- Возвращение массива с возможностью разбора, чтобы перестроить только что отправленную форму.
Для Zend_Validator
class Validate_InputArray extends Zend_Validate_Abstract
{
const INVALID = 'invalid';
const ERROR = 'error';
/**
* Failed array elements used to regenerate same elements
* on next form build
*
*/
protected $_elements = array();
protected $_messageTemplates = array(
self::INVALID => "Could not locate post element %value%",
self::ERROR => "YOUR ERROR MESSAGE|%value% is required"
);
public function __construct()
{}
public function isValid($element)
{
if (!$_POST[$element]) {
$this->_error(self::INVALID);
return false;
}
$elements = array();
if (is_array($_POST[$element])) {
$fail = false;
foreach ($_POST[$element] as $k => $v) {
if (!$this->_validateElement($v)) {
$this->_error(self::ERROR);
$elements[$k] = self::ERROR;
}
}
$this->_setElements($elements);
if ($fail) {
return false;
}
} else {
if (!$this->_validateElement($_POST[$element])) {
$this->_error(self::ERROR);
$elements[0] = self::ERROR;
$this->_setElements($elements);
return false;
}
}
}
protected function _setElements($elements)
{
$this->_elements = $elements;
return $this;
}
public function getElements()
{
return $this->_elements;
}
private function _validateElement($value)
{
// do your validation here
// return true/false
}
}
Теперь код, использующий это, анализирует входные данные с возможным массивом в качестве значения и проверяет каждый элемент и восстанавливает точную отправленную форму с идентичными произвольными полями.
$fail = false;
if ($this->getRequest()->isPost()) {
require 'Validate_InputArray.php';
$validator = new Validate_InputArray();
$elements = array();
if (!$validator->isValid($validator)) {
$fail = true;
foreach ($validator->getElements() as $k => $v) {
$elements[$k] = $v;
}
}
}
if ($fail) {
$messages = $validator->getMessages();
foreach ($elements as $k => $v) {
// Add custom methods here
$element = $form->createElement('text', 'elementName[]');
$element->addErrorMessages($messages[$k]);
}
} else {
$form->addElement('elementName[]');
}
Это позволит вам проверять любое количество произвольных элементов ввода по мере необходимости без необходимости подформирования или беспокоиться о необходимости повторного добавления элементов формы, если и когда произойдет сбой произвольного элементапроверка и должна быть перестроена на стороне клиента.