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
-~----------~----~----~----~------~----~------~--~---

Répondre à