Return to Snippet

Revision: 29346
at July 27, 2010 20:36 by jiewmeng


Initial Code
class Application_Form_Abstract extends Zend_Form {
	protected $_messages = array();
	
	// customizing default decorators ... 
	function loadDefaultDecorators() {
		if ($this->loadDefaultDecoratorsIsDisabled()) {
            return $this;
        }
		
		// ... for elements
		$decorators = $this->_elementDecorators;
		if (empty($decorators)) {
			$this->setElementDecorators(array(
				'ViewHelper',
				'Errors',
				array('Description', array('tag' => 'p')),
				'Label',
				array('HtmlTag', array('tag' => 'p'))
			));
			$this->getElement('submit')->removeDecorator('Label'); // remove the label from submit buttons
		}

		// ... for form
		$this->addPrefixPath('Application_Form_Decorator', 'Application/Form/Decorator', 'decorator');
        $decorators = $this->getDecorators();
        if (empty($decorators)) {
            $this->addDecorator('FormElements')
				 ->addDecorator(new Application_Form_Decorator_FormMessages)
				 ->addDecorator('Description', array('placement' => 'PREPEND', 'tag' => 'p'))
                 ->addDecorator('Form');
        }
        return $this;
	}
	
	// set values mainly used to set values from the request params
	function setValues($values) {
		foreach ($this->getElements() as $elem) {
			if (!$elem->getIgnore() && array_key_exists($elem->getName(), $values)) {
				$elem->setValue($values[$elem->getName()]);
			}
		}
	}
	
	function __construct($options = null) {
		// set default form method
		$this->setMethod('post');
		
		// add honey pot with a validator that basically gives an error if the input is filled
		// hidden using css
		$this->addElement('text', 'honeypot', array(
			'label' => 'Humans, please DO NOT fill this up',
			'validators' => array(
				new Application_Validator_HoneyPot
			),
			'decorators' => array(
				'ViewHelper',
				'Errors',
				array('Description', array('tag' => 'p')),
				'Label',
				array('HtmlTag', array('tag' => 'p', 'class' => 'honeypot', 'style' => 'display: none'))
			)
		));
		
		// call parent constructor
		parent::__construct($options);
	}
	
	// messenging functionality
	// i actually tried to use Zend_Form's error messages but they includes error messages from its Zend_Form_Elements, not something i wanted
	// so i created this to create messages specific to the form
	// also messages have a $class param for css styling. eg. errors vs warning vs info
	function addMessage($message, $class = 'info') {
		$this->_messages[] = array('msg' => $message, 'class' => $class);
	}
	function getMessages() {
		return $this->_messages;
	}
}

// honey pot validator
class Application_Validator_HoneyPot extends Zend_Validate_Abstract {
	const BOT = 'bot';
	protected $_messageTemplates = array(
		self::BOT => 'Bot detected! Please do not fill up the honey pot field!'
	);
	
	function isValid($value) {
		if ($value != "") {
			$this->_error(self::BOT);
			return false;
		}
		return true;
	}
}

// FormMessages decorator
class Application_Form_Decorator_FormMessages extends Zend_Form_Decorator_Abstract {
	protected $_placement = 'PREPEND';
	
	function render($content) {
		$element = $this->getElement();
        $view    = $element->getView();
        if (null === $view) {
            return $content;
        }

        $messages = $element->getMessages();
        if (empty($messages)) {
			return $content;
        }

        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $messagesStr  = '';
		foreach ($messages as $message) {
			$messagesStr .= $this->renderMessage($message['msg'], $message['class']);
		}

        switch ($this->_placement) {
            case self::APPEND:
                return $content . $separator . $messagesStr;
            case self::PREPEND:
                return $messagesStr . $separator . $content;
        }
	}
	
	function renderMessage($message, $class) {
		$html = '<div class="formMsg formMsg-' . $class . '">';
		$html .= strtoupper($class) . ': ' . $message;
		$html .= '</div>';
		return $html;
	}
}

Initial URL


Initial Description
in this custom `Zend_Form`, i added the following customizations\r\n\r\n -  customized default decorators\r\n -  added functions to set values of inputs (mainly for request params)\\r\\n- added honey pot anti-bot measure (see `__construct()`)\r\n - messenging functionality - simply rendering out `div`s with a css class and the message inside\r\n\r\ncode includes \r\n - the custom form abstract class\r\n - honey pot validator\r\n - FormMessages decorator

Initial Title
Zend Form: Customized to include honeyot anti-bot measure and other functionality

Initial Tags


Initial Language
PHP