2012-05-16 4 views
1

Я большую часть дня пытаюсь найти ответ, но я, наконец, признал поражение.Инициализация формы zend с переменной длиной данных

Я работаю над формой в Zend Framework, которая должна обрабатывать переменные длины данных. У меня есть форма с некоторыми общими полями, которые задают некоторые общие параметры (название элемента, язык и т. Д.), Которые достаточно легки для решения, но у меня также есть подформация, называемая параметрами, которая содержит переменное число ключей/значений lairs, которые позволяют добавлять в данные общие параметры. Ниже приведена демонстрационная форма:

<form> 
    <input type="text" name="item_name" /> 
    <input type="text" name="item_lang" /> 
    <!-- etc --> 
    <input type="text" name="parameters[1][key]" /> 
    <input type="text" name="parameters[1][value]" /> 
    <input type="text" name="parameters[2][key]" /> 
    <input type="text" name="parameters[2][value]" /> 
    <input type="text" name="parameters[3][key]" /> 
    <input type="text" name="parameters[3][value]" /> 
    <input type="text" name="parameters[4][key]" /> 
    <input type="text" name="parameters[4][value]" /> 
    <!-- and so on --> 
</form> 

Примечание: приведенное выше является массовым упрощением фактической формы. Он также создается вручную вместо создания zend_form.

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

Возможно, у меня есть 2 параметра для каждого элемента, у меня может быть 20, у меня может быть совсем нет. Поэтому мне нужна форма для ввода 2 или 20 или без параметров в зависимости от исходного состояния данных. К сожалению, данные недоступны в init(), потому что они не находятся в форме, пока вы не вызовете setDefaults() на нем.

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

Уверен, что я должен упустить что-то очевидное, но документация Zend довольно ужасна, и я не могу найти примеров этого варианта использования. Конечно, не может быть так необычно, что он не поддерживается в zend_form. Как мне создать форму в состоянии, которое позволяет изменять начальное состояние формы?

ETA: метод Init() на моей форме выглядит следующим образом (упрощенный, чтобы соответствовать примеру):

public function init() 
{ 
    parent::init(); 

    $this -> addElement ('text', 'item_name'); 
    $this -> addElement ('text', 'item_lang'); 
    $this -> addSubForm (new Zend_Form_SubForm(), 'parameters'); 

    foreach ($phantom_data as $key => $val) 
    { 
     $params = new Zend_Form_SubForm(); 
     $params -> addElement ('text', 'key'); 
     $params -> addElement ('text', 'value'); 
     $this -> parameters -> addSubForm ($params, $key); 
    } 
} 

ответ

1

Вы можете сделать данные avaialbe формировать как

My_Form extends Zend_Form 
{ 

protected $_myCustomData; 

public function __construct($options = null,$myCustomData) 
{ 
    $this->_myCustomData = $myCustomData; 
    parent::__construct($options); //Its important you call parent after above line or init will get call before initilizing customData 
} 

public function init() 
{ 
    $this->_myCustomData ; //here you are free to use your custom data 

} 

} 
+0

Это ужасно но это выглядит так, как будто это единственное жизнеспособное решение. Я не могу поверить, что форма zend была настолько некомпетентно написана, что не могла принять во внимание такой случай пользователя. Я делал подобное много раз раньше в POPHP, не перепрыгивая через эти виды обручей. – GordonM