Search code examples
zend-frameworkzend-formzend-view

Rendering a form with a view helper


I have a homepage which I want a registration form on, to do this I am using Zend_View_Helper. However nothing is happening.. I cant see the form I am trying to get on that page.

Here's the helper 'Register.php':

<?php

class Zend_View_Helper_Register extends Zend_View_Helper_Abstract {

    public function register(){

    $request = Zend_Controller_Front::getInstance()->getRequest();
        $controller = $request->getControllerName();
        $action = $request->getActionName();
        if ($controller == 'register' && $action == 'index') {
            return '';
        }
    }    
}

Here's the form Register.php:

<?php

class Application_Form_Register extends Zend_Form
{


    public function init() {
        $this->setName('register');
        $id = new Zend_Form_Element_Hidden('id');
  $id->addFilter('Int');
    $first_name = new Zend_Form_Element_Text('first_name');
    $first_name->setLabel('Firstname')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $surname = new Zend_Form_Element_Text('surname');
    $surname->setLabel('Surname')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $email = new Zend_Form_Element_Text('email');
    $email->setLabel('Email')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $username = new Zend_Form_Element_Text('username');
    $username->setLabel('Username')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $password = new Zend_Form_Element_Text('password');
    $password->setLabel('Password')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $age = new Zend_Form_Element_Text('age');
    $age->setLabel('Age')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $gender = new Zend_Form_Element_Text('gender');
    $gender->setLabel('Gender')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $uni = new Zend_Form_Element_Text('pic_2');
    $uni->setLabel('Uni')
            ->setRequired(true)
            ->addFilter('StripTags')
            ->addFilter('StringTrim')
            ->addValidator('NotEmpty');
    $submit = new Zend_Form_Element_Submit('submit');
    $submit->setAttrib('id', 'submitbutton');
    $this->addElements(array($id, $firstname, $surname, $email, $username, $password, $age, $gender, $uni, $submit));
}

}

Here's the model 'Users.php'

<?php

class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
{

    protected $_name = 'users';

    public function addUser($first_name, $surname, $email, $username, $password, $age, $gender, $uni) {
        $data = array(
        'first_name' => $first_name,
        'surname' => $surname,
        'email' => $email,
        'username' => $username,
        'password' => $password,
        'age' => $age,
        'gender' => $uni,
    );
    $this->insert($data);
}   
}

The controller 'RegisterController.php'

<?php

class RegisterController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

public function indexAction()
{
    $form = new Application_Form_Register();
    $form->submit->setLabel('Register');
    $this->view->form = $form;
    if ($this->getRequest()->isPost()) {
        $formData = $this->getRequest()->getPost();
        if ($form->isValid($formData)) {
            $first_name = $form->getValue('first_name');
            $surname = $form->getValue('surname');
            $email = $form->getValue('email');
            $username = $form->getValue('username');
            $password = $form->getValue('password');
            $age = $form->getValue('age');
            $gender = $form->getValue('gender');
            $uni = $form->getValue('uni');
            $register = new Application_Model_DbTable_Users();
            $register->addUser($first_name, $surname, $email, $username, $password, $age, $gender, $uni);
            $this->_helper->redirector('index');
        } else {
            $form->populate($formData);
        }

    }
}

}

And finally the view:

<div id="register">
    <h2>Register</h2>
    <?php echo $this->register(); ?>
</div>

I am aware that I should never be passing passwords in plain text, my next question is how to handle this.


Solution

  • Your view helper doesn't appear to be doing anything useful. I'm assuming you want it to render the form. If so it should look like this:-

    class Zend_View_Helper_Register extends Zend_View_Helper_Abstract {
    
        public function register()
        {
            $request = Zend_Controller_Front::getInstance()->getRequest();
            $controller = $request->getControllerName();
            $action = $request->getActionName();
            if ($controller == 'register' && $action == 'index') {
                return $this->view->form;
            }
        }    
    }
    

    Having said that, you don't need a helper for this really. In your view just put:-

    echo $this->form
    

    And your form will render.

    You would use a view helper if you wanted a form (say a log out form) on every page in your site.

    Finally resolved in chat.