Hallo,
ich bin zurzeit dabei in einer Erweiterung konsequent Models für alle angelecten DCAs einzusetzen und bin immer noch absolut verblüfft, wie unnötig umständlich ich bisher mit Datenbankabfragen umgegangen bin.
Inzwischen habe ich etwas Blut geleckt und frage mich, in wieweit sich die Models noch optimieren lassen. Konkret geht es hier um die Erweiterung von Results um eigene Funktionen, und wie ich das am elegantesten realisiert bekomme.
Ich habe an einer Stelle beispielsweise im DCA per MultiColumnWizard die Möglichkeit hinzugefügt, Jahre auszuwählen.
year_select.png
Das Ganze wird in der Datenbank serialisiert gespeichert. Da ich es an verschiedenen Stellen als sauberes Array benötige, habe ich das Model hier um eine entsprechende Funktion erweitert.
PHP-Code:
public static function years($id)
{
$election = self::findById($id);
$years = unserialize($election->years);
return $years ? array_map(function($year){return $year["years"];},$years) : null;
}
Auf diese Weise kann ich mir für eine Wahl die Jahre einfach folgendermaßen ausgeben lassen.
PHP-Code:
ElectionModel::years(1);
Soweit so gut. Nun möchte ich das Ganze aber sehr gerne auch auf Results übertragen. Beispielsweise in diesem Fall.
PHP-Code:
$election = ElectionModel::findByPid(0);
while ( $election->next() ) {
$years = $election->years;
}
Hier bekomme ich die Jahre wieder als serialisierten String zurück. Um das Ganze wieder durch die Funktion laufen zu lassen, könnte ich natürlich wie folgt vorgehen.
PHP-Code:
$election = ElectionModel::findByPid(0);
while ( $election->next() ) {
$yearsArr = ElectionModel::years($election->id);
}
Das finde ich aber etwas unschön. Lieber würde ich es so lösen.
PHP-Code:
$election = ElectionModel::findByPid(0);
while ( $election->next() ) {
$yearsArr = $election->yearsArr;
}
$election->yearsArr würde in diesem Falle eine Funktion anstoßen die prüft, ob pid gleich 0 ist und das Jahr direkt aus der Spalte "years" verarbeiten und erst im Falle, dass pid nicht gleich 0 ist wieder auf die Funktion "years" zurück greifen.
Ich kann im Model direkt ja einfach eigene Variablen hinzufügen.
PHP-Code:
public function __get($value) {
if ( $value == "yearsArr" ) {
return meine_funktion();
}
return parent::__get($value);
}
Das wirkt sich aber scheinbar nicht auf die Results aus. Hat jemand eine Idee, wie ich das bewerkstelligen kann, dass es sich im Idealfall auf ElectionModel::findById(), ElectionModel::findByPid(), ElectionModel::findAll() u.s.w. auswirkt?
Vermutlich ganz einfach und ich steh nur auf dem Schlauch. Aber ich wollte lieber einmal nachfragen, bevor ich hier etwas ähnlich unnötig umständliches baue wie die bisherigen Datenbankabfragen auf die DCA-Tabellen.
Vielen Dank und beste Grüße,
Dennis
Lesezeichen