wiki:CopixDAOSurchargePHP

Redéfinition de classe DAO

Créer des méthodes PHP

Le système de définition xml et le système de déclaration automatique ont leurs limites. Pour un fonctionnel complexe, les méthodes générées peuvent se révéler insuffisantes. On peut ainsi vouloir ajouter des méthodes ou modifier les méthodes existantes sur nos DAO ou nos Record.

Création d'un fichier PHP

Pour surcharger un DAO, il suffit de définir une classe selon deux conventions :

  • Le fichier se nomme xxx.dao.php, dans le répertoire classes du module;
  • Les noms des classes sont de la forme DAORecordxxx et DAOxxx ;

xxx est le nom du DAO.

Contenu des classes définies

Dans ces classes, vous pouvez rajouter toutes les méthodes et propriétés que vous voulez. Les DAO / record générés par Copix hériteront automatiquement de vos classes.

Note : Si vous développez dans votre classe une méthode PHP qui a le même nom qu'une méthode que Copix est censé générer (findAll par exemple) alors Copix générera cette dernière avec le nom _compiled_xxx (_compiled_findAll par exemple). Ainsi dans votre propre méthode, vous pouvez faire appel à la méthode originale. Par exemple définissons un fichier news.dao.php :

class DAONews {
 public function update ($obj){
   // j'update l'objet normalement
   $this->_compiled_update($obj);

   // je fais des traitements en plus
   return CopixDB::getConnection ($this->_connectionName)->doQuery ('...une requête');
 }
}

Ainsi vous avez redéfini ici la méthode update. On a décidé qu'elle ferait le traitement standard de l'update, avec en plus d'autres requêtes.

Vous noterez que dans notre objet DAO, on dispose de propriétés qu'il va falloir utiliser si on veut que notre classe reste cohérente par rapport au fichier de définition.

  • $this->_table, contenant le nom de la table principale;
  • $this->_connectionName, contenant le nom de la connection à la base de donnée;
  • $this->_selectQuery, contenant la clause SELECT de base avec tous les champs.

Exemples d'ajout de méthodes

Dans l'exemple suivant, nous avons rajoutés à notre DAO et au Record deux méthodes :

class DAOTest {
   function fonctionEnPlus (){
      return 'fonction en plus';
   }
}

class DAORecordTest {
   function autreFonctionEnPlus (){
      return 'autre fonction en plus';
   }
}

L'utilisation de ces méthodes est transparente, par exemple :

//La méthode du DAO
_ioDAO ('test')->fonctionEnPlus ();

//et la méthode du record : 
$test = _record ('test');
$test->autreFonctionEnPlus ();