worin besteht der vorteil eine "Character Separated Values" anstelle einer xml-datei zu verwenden? xml ist doch klasse für im-/export in andere anwendungen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Arbeitszeitrechner
Einklappen
Neue Werbung 2019
Einklappen
X
-
Kleine Änderung im Design, um MySQL- und CSV-Speicherung unter einen Hut zu bekommen, setzen wir das Factory-Pattern ein:
http://de.wikipedia.org/wiki/Fabrikmuster
Die Erzeugung eines DataHandler-Objekts erfolgt jetzt nicht über den Konstruktor, sondern über die statische Fabrik-Methode:
PHP-Code:<?php
class DataHandler
{
const CSV = 'csv';
const MYSQL = 'mysql';
public static function &factory($cDataHandler, $mParams = null)
{
switch ($cDataHandler) {
case DataHandler::CSV:
require_once _PATH_CLASSES . '/DataHandler/Csv.php';
$oData = new DataHandler_Csv($mParams);
return $oData;
case DataHandler::MYSQL:
require_once _PATH_CLASSES . '/DataHandler/MySql.php';
$oData = new DataHandler_MySql($mParams);
return $oData;
default:
return DataHandler::factory(DataHandler::CSV);
}
}
}
class DataHandler_Csv implements iDataHandler
{
// ..
}
class DataHandler_MySql implements iDataHandler
{
// ..
}
/**
* @example
* $oData = DataHandler::factory(DataHandler:CSV);
* $oData->addWork($oWork);
*/
?>Zitat von phpdummiworin besteht der vorteil eine "Character Separated Values" anstelle einer xml-datei zu verwenden? xml ist doch klasse für im-/export in andere anwendungen
Abgesehen davon reicht für unser Projekt CSV aus, wozu also eine komplexere Datenstruktur wählen.
Aber wir sind ja ganz unabhängig, wir können die DataHandler-Factory um den Typ XML erweitern, jemand muss dann nurnoch DataHandler/Xml.php programmieren.
Übrigens, die Typkonvertierung zB von CSV in XML ist auch überhaupt kein Problem - das nur als schönes Gimick nebenbei
Kommentar
-
in felcher form soll getTimespan() die zeitspanne zurückliefern?
oder soll ich nen optionalen parameter einbauen?
ich würds als array machen?!Code:months => '1', days => '20', hours => '12', minutes => '23', seconds=> '20'
[FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
— The best things in life aren't things[/FONT]
Kommentar
-
Öh .. nagut, müsste jetz wissen, ob ich oder pepe das macht ^^ Die Trennung in jetzt 2 Klassen ermöglicht natürlich, dass jeder eine macht.
Mehr als 12h Arbeit an einem Projekt am Stück?!? Oo
hab bei der factory mal das & weg gelassen. Objekte werden eh standardmässig referenziert
Edit1: Du musst noch das Interface für den Datahandler auf die neue Struktur anpassen.
Beim CSV is jetz auch der Knackpunkt, dass nur ein Dateiname angegeben wird. Finde die Sache mit 2 Dateien auch irgendwie angenehmer, wenn ich so darüber nachdenke. Soll ich die zwei Dateinamen jetzt aus der einen Angabe "konstruieren"? zB
Code:csv:/path/to/file.csv Dateiname für Projects: /path/to/file.projects.csv Dateiname für Works: /path/to/file.works.csv
Nicht jeder Fehler ist ein Bug.
Kommentar
-
Zitat von KingCrunchEdit1: Du musst noch das Interface für den Datahandler auf die neue Struktur anpassen.
Zitat von KingCrunchBeim CSV is jetz auch der Knackpunkt, dass nur ein Dateiname angegeben wird. Finde die Sache mit 2 Dateien auch irgendwie angenehmer, wenn ich so darüber nachdenke. Soll ich die zwei Dateinamen jetzt aus der einen Angabe "konstruieren"? zB
Code:csv:/path/to/file.csv Dateiname für Projects: /path/to/file.projects.csv Dateiname für Works: /path/to/file.works.csv
Kommentar
-
Zitat von ZerglingVorgesehen war in Minuten, eine externe Funktion -die irgendwo bei mir im Skripte-Ordner rumfliegt- hätte dann daraus einen lesbaren Text formatiert.
Aber so ist das auch OK.
sagt mal einer von euch was am besten ist bitte.
ansonnsten ist meine aufgabe ja (so wie ichs jetzt verstanden hab ) echt extrem einfachPHP-Code:class Work extends iWork
{
private $iProjectId;
private $sStartTime = '';
private $sEndTime = '';
public $iWorkId;
public function __construct($iWorkId = 0)
{
// TODO -> Klassenkonstruktor
$this->iWorkId = $iWorkId;
}
public function set($iProjectId, $sStartTime, $sEndTime)
{
// TODO ->Ansprechen der Datenbankklasse zum "setten" der Anfangs, bzw. Stoppzeit für ein bestimmtes Projekt (beachte Übergabevariablen)
$this->iProjectId = $iProjectId;
$this->sStartTime = $sStartTime;
$this->sEndTime = $sEndTime;
}
public function getWorkId()
{
// TODO -> ID einer bestimmten arbeitszeitspanne empfangen
return $this->iWorkId;
}
public function getProjectId()
{
// TODO -> ID für ein bestimmtes Projekt aus dem Datenbankobjekt empfangen
return $this->iProjectId;
}
public function getStartTime()
{
// TODO -> Arbeitsstartzeit empfangen
return $this->sStartTime;
}
public function getEndTime()
{
// TODO -> analog
return $this->sEndTime;
}
public function getTimespan()
{
// TODO -> Zeitspanne empfangen (oder berechnen)
/**
* In welchem Zeitformat liegt $sStartTime bzw. $sEndTime vor?
* 2007-09-03 13:01:35
* YYYY-MM-DD HH:MM:SS
*/
$iStart = self::string2num($this->sStartTime);
$iEnd = self::string2num($this->sEndTime);
$iTimespan = $iEnd - $iStart;
return $iTimespan;
}
static function string2num($sString)
{
$sString = ereg_replace("[^[:digit:]]", "", $sString);
return $sString;
}
}
PHP-Code:$oProject = new Work('3');
$oProject->set( 2, $sStartTime, $sEndTime);
$aAusgabe = array(
'WorkId' => $oProject->getWorkId(),
'ProjectId' => $oProject->getProjectId(),
'StartTime' => $oProject->getStartTime(),
'EndTime' => $oProject->getEndTime(),
'Timespan' => $oProject->getTimespan()
);
Code:Array ( [WorkId] => 3 [ProjectId] => 2 [StartTime] => 2007-03-09 13:01:35 [EndTime] => 2007-03-09 14:01:35 [Timespan] => 10000 )
sonnst so richtig?[/code][FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
— The best things in life aren't things[/FONT]
Kommentar
-
LOL
na dann hätt sich das ja erledigt
//Edit:
hast du ne idee wie man das unkompliziert mit den monaten auf die kette bekommt? (wechselnde tag-anzahl -> mal 28 mal 30 usw.)[FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
— The best things in life aren't things[/FONT]
Kommentar
-
Deine string2num() Methode ist falsch, speziell Zeiten kannst du nicht einfach so subtrahieren. Ein Überlauf bzw. Unterlauf wird ja sonst als Dezimalwert an die nächste Stelle weitergegeben, Uhrzeiten sind aber "radiante" und nicht dezimale Werte.
An sich ist die Idee aber gut - nur eben falsch
Arbeite doch einfach mit strtotime().
Kommentar
-
Noch eine Frage: Bei addProject und addWork im Datahandler, kann ich da davon ausgehen, dass die ID jeweils 0 ist? Ich frage weil: Wenn nein, muss ich erstmal prüfen, ob etwas überschrieben wird, wenn ja muss ich eine id selbst generieren. OK, is net die Welt ($id = $maxId + 1; ^^), aber wissen muss ichs
Ahja, und wär cool, wenn pepe ma "Hallo" sacht, ob er jetzt die mysql-Klasse übernimmt, oder net. Sonst würd ich die mitmachen. Die CSV-Klasse is ... sagen wir sehr weit Aber das richtige coden kommt erst morgen, heute ist noch ein Geburtstag. Ich habs erstmal mit Kommentaren zugeworfen und diverse Properties eingeführt ^^
Edit1: Ma ne Anfängerfrage. Gibt es eine Funktion, die mir bei einem String zurück liefert, ob es eine Dateiangabe sein kann (ohne Existenz-Prüfung)? Finde nur Funktionen, die auch gleich die Existenz prüfen, bzw bei basename, pathinfo und dirname (und sowas) find ich nix in der Doku, was die machen, wenn es keine richtige Pfadangabe is ^^Nicht jeder Fehler ist ein Bug.
Kommentar
Kommentar