Bonjour,
Voila ma petite contribution et également une preuve que j'essaye de
comprendre :
Je souhaite traiter certaines erreurs sql (violation de contrainte
unique) et considérer que ces erreurs ne sont pas "vraiment" des erreurs.
Voici donc ce que j'ai créé :
Tout d'abord, mon propre driver MySql. Ce qu'il fait :
Le tableau $errTrap contient :
en index, le n° de l'erreur à intercepter
en valeur, un tableau constitué d'un pointeur vers l'instance du modèle
et un nom de méthode définie dans ce même modèle
Dans _execute, si une erreur survient, je vérifie si elle est $errTrap,
si oui, j'appelle la méthode de l'instance du modèle qui correspond à
l'erreur.
Je suis obligé également de surcharger lastError() pour éviter
l'affichage d'une message à l'écran.
class DboMysqlLog extends DboMysql
{
var $errTrap = array();
function _execute($sql)
{
$retour = parent::_execute($sql);
if (!$retour)
{
$err = mysql_errno ($this->connection);
if (array_key_exists($err,$this->errTrap))
{
if (is_callable($this->errTrap[$err]))
call_user_func_array($this->errTrap[$err],array($err));
return true;
}
}
return $retour;
}
function lastError() {
$err = mysql_errno($this->connection);
if (array_key_exists($err,$this->errTrap))
return null;
else
{
if ($err)
return mysql_errno($this->connection).':
'.mysql_error($this->connection);
}
return null;
}
}
Dans mon modèle, j'ai la méthode trapError()
function trapError($array)
{
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$db->errTrap=array();
foreach ($array as $trap) {
if (!is_array($trap))
{
$db->errTrap[$trap]=array($this,'err'.$trap);
}
else
{
$db->errTrap[key($trap)]=array($this,current($trap));
}
}
}
Elle peut être appelé :
trapError(array(1042, 1064));
ou trapError(array(1042,array(1064=>"maGestionAMOI"));
Par défaut, pour une erreur n°X, la méthode errX du modèle est appelé
Toutefois, je peux faire pointer sur une autre méthode. Ainsi je peux
associer plusieurs erreurs à la même méthode.
Le n° de l'erreur est passé à la méthode aussi.
Il faut bien sûr pense à réinitialiser la liste des erreurs interceptées
qd on en a fini .....
--~--~---------~--~----~------------~-------~--~----~
Groupe "Cakephp-fr".
Adresse : [email protected]
Pour résilier : [EMAIL PROTECTED]
Pour les options : http://groups.google.com/group/cakephp-fr?hl=fr
-~----------~----~----~----~------~----~------~--~---