Hi, little code I'd like to share...hopefully you find it useful.
I had similer issue lately. Basically you build your forms like
[stuff1][field] .....[stuff2][field] etc etc...... with
javascript (I used ajax).
I just assign on rendering the view.. variable with current number of
subforms... then on each ajax call
I just increment this javascript variable (it doesn't need to be
sequential at all)...just increment each time.
So I know that it returns nonconficting [stuffN][field] - For the ajax
returning I use ::assignSubForm() method mentioned
below and just echo $main_form->$subFormName
Then on post you have stuff like [stuff1][field]
..[stuff132][field]...[stuff2][field] etc...
//I got some specifics on decorators..you can ignore them... I am using
view script decorator for rending....thats why
//have to use assignBelongsTo() probably can ignore this too in your
scenario
So you have two cases:
1. When you have to build form based on request data... (because stuff
dynamiccally piles in there)
2. When you have to build form based on db data... (regular scenario)
$foo =
Form_Abstract::buildSubFormFromRequest($request,'Form_Subform_Something','something');
$formContainingSubForms = $foo['form_container'];
$subFormNames = $foo['subFormNames']; //in case we want to address one
by one e.g $formContaintingSubForms->something1
Not really sure what you mean by second level of subforms..... I was
thinking of doing
stuff[1][field] stuff[2][field] etc... so you take directly stuff
later...but found issues with rendering just one element
$mainForm->stuff->"1" would not render stuff[1][field] as it doesn't
see whole decorator level and renders not as expected.
Form_Abstract{
public static function
buildSubFormFromRequest($request,$subFormClass,$subFormName)
{
$form_container = new Zend_Form();
$form_container->setDecorators(array('FormElements'));
$names = array();
$params = $request->getParams();
foreach ($params as $index => $param) {
if (preg_match("#^{$subFormName}\d+$#",$index)) {
Form_Abstract::assignSubForm($form_container,$subFormClass,null,array($index=>$param));
$names[] = $index;
}
}
return array ('form_container' => $form_container,'subFormNames'
=> $names);
}
public static function
assignSubForm($mainForm,$subFormClass,$subformName,$assignData = null)
{
if (!$assignData) {
$subForm = new $subFormClass();
$subForm->assignBelongsTo($subformName);
$subForm->removeDecorator('form');
$mainForm->addSubForm($subForm, $subformName);
} else {
foreach ($assignData as $subName => $subFormData) {
$subForm = new $subFormClass();
$subForm->assignBelongsTo($subName);
$subForm->removeDecorator('form');
$subForm->setDefaults($subFormData);
$mainForm->addSubForm($subForm, $subName);
}
}
}
}
Matthew Weier O'Phinney wrote:
-- Sagi Bashari <[EMAIL PROTECTED]> wrote
(on Tuesday, 01 July 2008, 02:31 PM +0300):
I can add a counter, but I can't see a good use for it - its value should be
identical to count($_POST['features']).
And I will have to iterate over the features anyway to add the second level of
sub-forms (ItemForm).
This sounds like a reasonable solution to me, actually.
On Tue, Jul 1, 2008 at 2:10 PM, Bart McLeod <[EMAIL PROTECTED]> wrote:
I would do like you do, inspect the post data. However, it would be nice if
you would just have to know the number of subforms you are processing.
Javascript can easily update a counter in a hidden field on your mainform.
It increments the count each time you add a subform dynamically. This
counter is the only post element you will have to evaluate in order to know
how many subforms to process.
Bart McLeod
Sagi Bashari schreef:
Hello,
I have a form that can generate any number of input fields dynamically
(the fields are generated using javascript).
The fields have some nested sub-form structure:
1. There can be many "feature" forms, and each has a name: features
[feature0,..,featureN][name]
2. Each of these feature forms has many items, and each item has a
name: features[feature0][items][item0,..,itemN][name]
(Actually they have many other fields except the name but this is
enough for the example).
I managed to handle a static number of such sub-forms with Zend_Form,
by attaching multiple instances of a FeatureForm to my main form, and
attaching multiple instances of ItemForm to the FeatureForm (inside a
container sub-form).
However, I wonder how can I add these sub-forms dynamically.
I thought about creating some pre-processing method that will get the
$_POST data, inspect it and add fields accordingly before calling
isValid().
Can anyone think of a better (more Zend_Form-like) way of handling such
situation?
Thanks,
Sagi