>
> You'll probably want to store the data from validating the subform in
> your session so you can retrieve it later; otherwise, your data will be
> lost. There's a variety of ways to do that -- using $_SESSION directly,
> or using Zend_Session -- so I won't go into details.


I just found the persistData(), thought it doesn't appear to be used
anywhere. I did some more hacking and added Zend_Session_Namespace into the
mix. I'll check out the Helper proposal to see if I'm missing anything.

In case anyone wanted to see my current, semi-working example, here ya go:

<?php
require_once 'ApplicationController.php';

require_once 'Zend/Form.php';
require_once 'Zend/Session/Namespace.php';

class IndexController extends ApplicationController
{

    public function siteInformationAction()
    {
        $subform = $this->_getForm()->getSubForm('site_information');

        if ($this->getRequest()->isPost() &&
$subform->isValid($this->getRequest()->getPost())) {
            $subform->persistData();
            return $this->getHelper('redirector')->gotoRoute(
                array(
                    'action' => 'personalInformation'
                )
            );
        }

        $this->view->form = $subform;
        $this->render('form');
    }

    public function personalInformationAction()
    {
        $subform = $this->_getForm()->getSubForm('personal_information');

        if ($this->getRequest()->isPost() &&
$subform->isValid($this->getRequest()->getPost())) {
            $subform->persistData();

            $this->_getForm()->process();
            exit;
        }

        $this->view->form = $subform;
        $this->render('form');
    }

    private function _getForm()
    {
        return new Site_Form_Create();
    }

}

class Site_Form_Create extends Zend_Form
{

    public function __construct()
    {
        parent::__construct(array(
            'method' => 'POST',
            'subforms' => array(
                'site_information'     => new
Site_Form_Create_SiteInformation(),
                'personal_information' => new
Site_Form_Create_PersonalInformation()
            )
        ));
    }

    public function process()
    {
        foreach ($this->getSubForms() as $subform) {
            var_dump($subform->getValues());
        }
    }

}

class Site_Form_Create_SiteInformation extends Zend_Form
{

    public function __construct()
    {
        parent::__construct(array(
            'elements' => array(
                'username' => array(
                    'text',
                    array(
                        'label' => 'Username',
                        'required' => true,
                        'validators' => array(
                            'NotEmpty'
                        )
                    )
                ),
                'password' => array(
                    'password',
                    array(
                        'label' => 'Password',
                        'required' => true,
                        'validators' => array(
                            'NotEmpty'
                        )
                    )
                ),
                'submit_site_information' => array(
                    'submit',
                    array(
                        'value' => 'Next Page'
                    )
                )
            )
        ));

        foreach ($this->_getSession() as $key => $value) {
            $this->getElement($key)->setValue($value);
        }
    }

    public function persistData()
    {
        $session = $this->_getSession();
        foreach ($this->getValues() as $key => $value) {
            $session->$key = $value;
        }
    }

    private function _getSession()
    {
        return new
Zend_Session_Namespace('Site_Form_Create_SiteInformation');
    }

}

class Site_Form_Create_PersonalInformation extends Zend_Form
{

    public function __construct()
    {
        parent::__construct(array(
            'elements' => array(
                'name' => array(
                    'text',
                    array(
                        'label' => 'Name',
                        'required' => true,
                        'validators' => array(
                            'NotEmpty'
                        )
                    )
                ),
                'street' => array(
                    'text',
                    array(
                        'label' => 'Street',
                    )
                ),
                'city' => array(
                    'text',
                    array(
                        'label' => 'City'
                    )
                ),
                'state' => array(
                    'text',
                    array(
                        'label' => 'State'
                    )
                ),
                'zip' => array(
                    'text',
                    array(
                        'label' => 'Zip'
                    )
                ),
                'submit_personal_information' => array(
                    'submit',
                    array(
                        'value' => 'Submit'
                    )
                )
            )
        ));

        foreach ($this->_getSession() as $key => $value) {
            $this->getElement($key)->setValue($value);
        }
    }

    public function persistData()
    {
        $session = $this->_getSession();
        foreach ($this->getValues() as $key => $value) {
            $session->$key = $value;
        }
    }

    private function _getSession()
    {
        return new
Zend_Session_Namespace('Site_Form_Create_PersonalInformation');
    }

}

Reply via email to