In the last article, we have already set some basic decorators for Zend_Form. The next one is a decorator for the label, appending an asterisk (*) to labels of required fields, and display error messages below the label instead of the field. In your „Form“ subfolder, create a folder „Decorator“, and in it, a file named „Label.php“:
class JD_Form_Decorator_Label extends Zend_Form_Decorator_Label { public function getLabel() { $element = $this->getElement(); $label = trim($element->getLabel()); if ($element->isRequired()) { $label .= ' *'; } $errors = $element->getMessages(); if (empty($errors)) { $element->setLabel($label); return parent::getLabel(); } $label .= '<br /><span style="color:red;font-size:0.8em">' . implode('<br />', $errors) . '</span>'; $element->setLabel($label); return parent::getLabel(); } }
The name „Label“ corresponds to the settings for the ViewHelper in the decorators, and folder / name to the settings in the prefix path. Credits for this script, though, goes to Padraic Brady, where one can get a lot of good ideas of how to solve ZF problems 😉
Zend Framework comes with a lot of smart validators to use with Zend_Form. But with my goal in mind to create a page comment plugin for the relaunch of surfspot.de, I needed a validator to check if the user input contains foul language… no point in people abusing each other in the anonymity of the Internet 😉 The old version of the site uses a validator, comparing user input to a string of bad bad words I don´t want to see on my site, so I needed to make that one „Zend_Form“ compatible. Besides, over the years I added some of the most notorious spam words to the validator, so it acts as a low level spam filter as well… surfers just don´t need little blue pills to have some fun 😉
Anyway, create „JD/Form/Validator/Badwords.php“, and add the following lines:
class JD_Form_Validator_Badwords extends Zend_Validate_Abstract { /** * Validation failure message key for when the value contains foul language */ const BAD_WORDS = 'badWords'; /** * Validation failure message template definitions * * @var array */ protected $_messageTemplates = array( self::BAD_WORDS => "The text uses foul language" ); /** * Badword array - change as required by your application */ private $badwords = array('games', 'college', 'prewrcar', 'parrot', 'xx'); /** * Defined by Zend_Validate_Interface * * Returns true if and only if $value does not contain bad words as defined by array * * @param string $value * @return boolean */ public function isValid($value) { $valueString = (string) $value; $this->_setValue($valueString); for($i=0; $i<count($this->badwords); $i++) { if(strstr(strtoupper($valueString), strtoupper($this->badwords[$i]))) { $this->_error(); return false; } } return true; } }
Whatever you personally consider „bad words“, add to the array, and rest assured that nobody can post those on your website. I omitted my selection out intentionally, but left some spam words in to show how it works. Make sure to add the f-word, and you can even add something like „<a href=“ to the array to avoid having links posted, but that subject will be in the „filter“ article up next.
Neueste Kommentare