2009-12-22 4 views
1

Я пытаюсь создать форму с использованием Zend_Form (компонент Zend_Framework). Пользователи должны иметь возможность добавлять произвольное количество полей. Так же, как вы можете загружать файлы с помощью графического интерфейса gmail. Пример:Zend_Form произвольное число пар ключей-полей

[_____] [+] 

После нажатия на кнопку [+]:

[_____] 
[_____] [+] 

Чтобы получить вещи, осложненным, я хотел бы добавить полю пар, поэтому он будет выглядеть следующим образом:

[_____] [_____] 
[_____] [_____] [+] 

Как я могу сохранить доступность простой встроенной проверки и назначения методов при реализации этой функции? Мне нужна подформация? Нужно ли мне что-то еще? После отправки формы код должен иметь возможность сопоставлять поля и массивы.

Боюсь, что я должен подкласс Zend_Form или SubForm, но я хочу знать самый простой/самый красивый способ.

ответ

0

Это мое решение: Я создал два скрытых поля, один для ключей, один для значений. Часть кода javascript создает пары поддельных полей в deamand, а onChange отображает все поддельные поля в скрытые, используя JSON. Его легко обрабатывать на стороне сервера, но используемый метод javascript не является дискретным.

0

Вот как добавить десять полей ввода, каждый из которых имеет Alpha проверки:

$sub_test = new Zend_Form_SubForm(); 
$num_fields = 10; 
for ($i = 0; $i < $num_fields; $i++) { 
    $element = $form->createElement('text', strval($i)); 
    $element->addValidator('Alpha'); // just to see in action 
    $sub_test->addElement($element); 
} 
$form->addSubForm($sub_test, 'test'); // values mapped to $_POST['test'][0..9] 

Чтобы определить, сколько создать/шоу, больше работы необходима с вашей стороны, конечно, но это кажется простым.

  1. Посмотрите на $ _POST ['test'], чтобы увидеть, сколько значений заполнено - всегда включайте их.
  2. Посмотрите на другую скрытую переменную, чтобы узнать, сколько всего отображаемых полей - даже те, которые пусты.
  3. т.д.
1

Самый простой подход принять здесь использовать простой пользовательский Zend Validator, который будет анализировать входные элементы, как весь PHP массива видят в нем, так что вы в состоянии выполнить автоматически после.

  1. Независимо проверять каждый элемент ввода и отображать сообщения об ошибках, связанные для каждого элемента.
  2. Возвращает массив, способный к синтаксическому анализу, для восстановления формы, которая была только что отправлена.

Для 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[]'); 
} 

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

+0

Спасибо за длинный ответ, я собираюсь попробовать его через несколько дней. – erenon

+0

Нет проблем, дайте мне знать, как это происходит;) – nwhiting

Смежные вопросы