Oggi ho potuto sperimentare come il DataObject non abbia in particolare simpatia il tipo datetime mentre tentavo di fare un override del metodo dataobject::insert() per impostare il timestamp di inserimento di un record.
Assumento un dataobject $do con un campo data tipo datetime è un impresa impostare la data al giorno attuale.
Il primo tentativo $do->data = now() ovviamente dava problemi, ma sorprendentemente pure $do->data = date("Y-m-d H:i:s") non inseriva la data nella query generata (visibile con $do->debugLevel(5)).
Dopo le preliminari imprecazioni sono andato a scartabellare la documentazione scoprendo alcune orrende alchimie, tra le quali DB_DataObject_Cast::date(..)
Finalmente sono riuscito a inserire la data con $do->data = DB_DataObject_Cast::date(date("Y-m-d H:i:s")) ma purtroppo le informazioni riguardanti ora, minuti e secondi venivano ignorate. La documentazione non dice nulla in proposito a “datetime”.
Come al solito la documentazione migliore è leggere i sorgenti (pear/DB/DataObject/Cast.php) dai quali ho scoperto la funzione non documentata DB_DataObject_Cast::dateTime(..) che, tralaltro, se non gli si passa nessun parametro utilizza la data e il time corrente:
$do->data = DB_DataObject_Cast::dateTime();
Tutta questa complessità a che pro? Non era meglio incapsulare questi “dettagli” all’interno del dataobject invece che pasticciare con funzioni esterne? Cioè: il dataobject ha tutte le informazioni per capire che il campo “data” è un “datetime” e, nel caso gli sia passato un array, avrebbe potuto benissimo fare internamente la conversione nella stringa “Y-m-d H:i:s” per la query.