Code snippets for symfony 1.x


Snippets by user joachim martin


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.


The first thing you need to do is to create the file sfCustomUniqueValidator.php in your project lib directory:

 * 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())
            $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
        //Set default parameters value
        $this->setParameter('custom_unique_error','The value is not unique');
        // 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;


The following code check if a companie with the same name and same activity exists in the same country

      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.

by joachim martin on 2007-06-21, tagged unique  validation  validator