1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| <?php
/**
* Vérifier que la session en cours de saisie ne chevauche pas une session déjà
* existante et que sa date de début est antérieure à sa date de fin
*/
class myValidatorSessionCompare extends sfValidatorSchema
{
protected static
$globalDefaultMessages = array(
"interval" => "La date de début ('%datedebut%') doit être antérieure à la date de fin ('%datefin%')",
"chevauchement" => "La nouvelle session chevauche une session existante ('%lieu%')" );
/**
* Constructeur recopié de sfValidatorBase pour qu'il me laisse passer les codes
* "interval" et "chevauchement" (cf $globalDefaultMessages)
*
* @see sfValidatorBase
*/
public function __construct( $options = array(), $messages = array() )
{
$this->options = array_merge(array('required' => true, 'trim' => false, 'empty_value' => null), $this->options);
$this->messages = array_merge(array('interval' => self::$globalDefaultMessages['interval'], 'chevauchement' => self::$globalDefaultMessages['chevauchement']), $this->messages);
$this->configure($options, $messages);
$this->setDefaultOptions($this->getOptions());
$this->setDefaultMessages($this->getMessages());
$currentOptionKeys = array_keys($this->options);
$optionKeys = array_keys($options);
// check option names
if ($diff = array_diff($optionKeys, array_merge($currentOptionKeys, $this->requiredOptions)))
{
throw new InvalidArgumentException(sprintf('%s does not support the following options: \'%s\'.', get_class($this), implode('\', \'', $diff)));
}
// check error code names
if ($diff = array_diff(array_keys($messages), array_keys($this->messages)))
{
throw new InvalidArgumentException(sprintf('%s does not support the following error codes: \'%s\'.', get_class($this), implode('\', \'', $diff)));
}
// check required options
if ($diff = array_diff($this->requiredOptions, array_merge($currentOptionKeys, $optionKeys)))
{
throw new RuntimeException(sprintf('%s requires the following options: \'%s\'.', get_class($this), implode('\', \'', $diff)));
}
$this->options = array_merge($this->options, $options);
$this->messages = array_merge($this->messages, $messages);
}
/**
* @see sfValidatorBase
*/
protected function doClean($values)
{
if (null === $values)
{
$values = array();
}
if (!is_array($values))
{
throw new InvalidArgumentException('You must pass an array parameter to the clean() method');
}
$sessionCoursId = $values[ "cours_id" ];
$sessionDateDeb = $values[ "datedebut" ];
$sessionDateFin = $values[ "datefin" ];
//vérifier que la date de début est antérieure à la date de fin
$valid = $sessionDateDeb <= $sessionDateFin;
if (!$valid)
{
$error = new sfValidatorError($this, "interval", array(
"datedebut" => $sessionDateDeb,
"datefin" => $sessionDateFin,
));
/*if ($this->getOption('throw_global_error'))
{
throw $error;
}*/
throw new sfValidatorErrorSchema($this, array("datedebut" => $error));
}
//vérifier que la session ne chevauche pas une sesson déjà existante
$cours = Doctrine_Core::getTable( "Cours" )->find( $sessionCoursId );
if ( !$cours )
return $values;
foreach( $cours->getSessions() as $session )
{
if ( $sessionDateDeb < $session->getDateDebut() ) //la session est avant la session existante
if ( $sessionDateFin >= $session->getDateDebut() ) //la date de fin doit être avant le début de la session existante
$this->error( $session );
if ( $sessionDateDeb > $session->getDateDebut() ) //la session est après la session existante
if ( $sessionDateDeb <= $session->getDateFin() ) //la date de début doit être après la fin de la session exisante
$this->error( $session );
}
return $values;
}
private function error( $session )
{
$error = new sfValidatorError($this, "chevauchement", array(
"lieu" => $session->getLieu()
));
throw $error;
}
} |
Partager