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




Reply via email to