Un truc qui m’a souvent agacé dans Dotclear est la gestion des enregistrements, représentés soit par un record
, soit par un staticRecord
soit même par un extStaticRecord
sans que je ne sache vraiment jamais lequel était pertinent.
Alors j’ai décidé de créer une interface unique pour tout ces objets, interface qui se nomme dcRecord
1.
Cette interface s’instancie à partir d’un record
ou d’un staticRecord
, peu importe, et apporte toutes les méthodes déjà possibles avec ces deux objets, y compris l’extension vers un extStaticRecord
.
Notez que si vous utilisez déjà l’utilitaire dcSqlStatement
et ses dérivés (voir le fichier inc/core/class.dc.sql.statement.php) alors ça sera fait automatiquement au moment de l’exécution des requêtes. Exemple avec la méthode select()
:
public function select(): ?dcRecord
{
if ($this->con && ($sql = $this->statement())) {
return new dcRecord($this->con->select($sql));
}
return null;
}
Sinon cette nouvelle interface s’utilise classiquement :
Avant :
// Get logs from this task
$rs = dcCore::app()->con->select(
'SELECT log_id ' .
'FROM ' . dcCore::app()->prefix . dcLog::LOG_TABLE_NAME . ' ' .
"WHERE log_msg = '" . dcCore::app()->con->escape($id) . "' " .
"AND log_table = 'maintenance' "
);
Après :
// Get logs from this task
$rs = new dcRecord(dcCore::app()->con->select(
'SELECT log_id ' .
'FROM ' . dcCore::app()->prefix . dcLog::LOG_TABLE_NAME . ' ' .
"WHERE log_msg = '" . dcCore::app()->con->escape($id) . "' " .
"AND log_table = 'maintenance' "
));
Ou encore (création à partir d’un tableau de valeurs) :
return staticRecord::newFromArray($items);
Qui devient :
return dcRecord::newFromArray($items);
Je ne vais pas détailler plus cette évolution, alors s’il reste des zones d’ombre, n’hésitez pas à me questionner dans les commentaires de ce billet.
Par ailleurs l’interface SQLite ayant évolué depuis quelques années, l’usage d’un staticRecord
avec ce driver n’est plus requis et la classe dcRecord
permettra son évolution sans casser le code qui l’utilise.
Notez que vous pouvez ne toucher à rien pour l’instant, les anciennes structures sont toujours valides, mais ça simplifie largement le code et le typage de celui-ci donc n’hésitez-pas à sauter le pas :-)
1 De Jean-Christian Paul Denis -
Je me suis retrouvé coincé avec cela car du coup on ne peut plus surcharger une propriété de dcRecord en retour d’enregistrements :
$rs->mon_truc_en_plus = new ma_class();
ne fonctionne plus. (Ou alors c’est ma version de PHP qui ne l’accepte déjà plus)Mais pas très grave pour l’instant, une petite pirouette j’ai tout ce que je veux. Je verrais au fil de la mise à jour de mes plugins :) grave
2 De Franck -
Si tu tournes avec PHP 8.2 c’est possible, il y a des restrictions nouvelles sur l’usage des propriétés
!3 De Franck -
Cela dit tu peux aussi étendre
dcRecord
avec la méthodeextend
.4 De Da Scritch -
Techniquement, je me demande si cette 2.24 qui ressemble furieusement à une 3 ne devrait pas introduire les requêtes préparées. Celles-ci existent depuis les PDO en PHP 5.3, sont nettement plus lisibles, avec un échappement SQL inclus de part leur principe et surtout… une requête préparée va plus vite, car déjà interprétée et en cache.
5 De Franck -
Euh nan, ce n’est pas à quelques semaines de publier la 2.24 que je vais modifier le support DB.
Y’a des choses à faire à ce niveau, c’est clair, mais pour l’instant j’ai d’autres choses à faire, en particulier mettre à niveau 70 plugins et une dizaine de thèmes.
On verra plus tard, mes ressources sont limitées…
Par contre, ouvre un ticket en ce sens, ça sera utile !