![]() |
|
Code snippets for symfony 1.x |
|
This snippet allow to check if an entry allready exists in a database but, at the difference of the sfUniqueValidator, you can provide as many fields as desired to perform the verification.
Installation:
The first thing you need to do is to create the file sfCustomUniqueValidator.php in your project lib directory:
<?php /** * sfCustomUniqueValidator checks if a record exist in the database with all the mentionned fields. * * ex: Check if a companie with company_name exist in country_id * class: sfCustomUniqueValidator * param: * class: Companies //the class on which the search is performed * nb_fields: 2 //the number of fields on which the comparison is done * field_1: company_name //First field of the comparison * field_2: country_id //Other country for the comparison * * @package lib * @author Joachim Martin * @date 15/06/2007 */ class sfCustomUniqueValidator extends sfValidator { /** * Executes this validator. * * @param mixed A file or parameter value/array * @param error An error message reference * * @return bool true, if this validator executes successfully, otherwise false */ public function execute(&$value, &$error) { $className = $this->getParameter('class').'Peer'; //Get fields number $nb_fields = $this->getParameter('nb_fields'); //Define new criteria $c = new Criteria(); //Loop on the fields for($i = 1; $i <= $nb_fields ; $i++) { //Retrieve field_$i $check_param = $this->getParameterHolder()->get("field_$i"); $check_value = $this->getContext()->getRequest()->getParameter($check_param); //If check value defined if ($check_value != '') { //Adding field to the criteria $columnName = call_user_func(array($className, 'translateFieldName'), $check_param, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME); $c->add($columnName, $check_value); } } $object = call_user_func(array($className, 'doSelectOne'), $c); if ($object) { $tableMap = call_user_func(array($className, 'getTableMap')); foreach ($tableMap->getColumns() as $column) { if (!$column->isPrimaryKey()) { continue; } $method = 'get'.$column->getPhpName(); $primaryKey = call_user_func(array($className, 'translateFieldName'), $column->getPhpName(), BasePeer::TYPE_PHPNAME, BasePeer::TYPE_FIELDNAME); if ($object->$method() != $this->getContext()->getRequest()->getParameter($primaryKey)) { $error = $this->getParameter('custom_unique_error'); return false; } } } return true; } public function initialize ($context, $parameters = null) { // initialize parent parent::initialize($context); //Set default parameters value $this->setParameter('custom_unique_error','The value is not unique'); $this->getParameterHolder()->add($parameters); // check parameters if (!$this->getParameter('class')) { throw new sfValidatorException('The "class" parameter is mandatory for the sfCustomUniqueValidator validator.'); } if (!$this->getParameter('nb_fields')) { throw new sfValidatorException('The "nb_fields" parameter is mandatory for the sfCustomUniqueValidator validator.'); } return true; } }
Usage:
The following code check if a companie with the same name and same activity exists in the same country
sfCustomUniqueValidator:
class: Companies
nb_fields: 3
field_1: company_name
field_2: activity_id
field_3: country_id
custom_unique_error: This company already exist for this country
class: the model to test
nb_fields: how many fields will be checked
field_x: a field to test, obviously you need to have as many field_x as the nb_fields value
custom_unique_error: your error message
This is my very first contribution to symfony so feel free to comment/optimize.