Ankündigung

Einklappen
Keine Ankündigung bisher.

Arbeitszeitrechner

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #46
    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
    [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
    — The best things in life aren't things[/FONT]

    Kommentar


    • #47
      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 phpdummi
      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
      CSV ist extrem einfach. Man kann ganz einfach selbst einen CSV-"Parser" (das Wort ist schon fast übertrieben) bauen (Zeilenweise einlesen, nach Trennzeichen exploden). Für XML brauchst du eine externe Klasse.
      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


      • #48
        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


        • #49
          Vorgesehen 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.

          Kommentar


          • #50
            Ö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
            is ja eigentlich nich im Sinne des Erfinders, weil wenn ich eine Datei angebe, möchte ich die natürlich auch so haben ^^ Aber wäre am einfachsten
            Nicht jeder Fehler ist ein Bug.

            Kommentar


            • #51
              Zitat von KingCrunch
              Edit1: Du musst noch das Interface für den Datahandler auf die neue Struktur anpassen.
              Da ändert sich ja fast nichts, bis auf den Konstruktor-Parameter.

              Zitat von KingCrunch
              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
              is ja eigentlich nich im Sinne des Erfinders, weil wenn ich eine Datei angebe, möchte ich die natürlich auch so haben ^^ Aber wäre am einfachsten
              Entscheid das selbst

              Kommentar


              • #52
                Zitat von Zergling
                Vorgesehen 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.
                ne ^^
                sagt mal einer von euch was am besten ist bitte.
                ansonnsten ist meine aufgabe ja (so wie ichs jetzt verstanden hab ) echt extrem einfach
                PHP-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;
                    }

                test:
                PHP-Code:
                $oProject = new Work('3');
                $oProject->set2$sStartTime$sEndTime);

                $aAusgabe = array(
                'WorkId' => $oProject->getWorkId(),
                'ProjectId' => $oProject->getProjectId(),
                'StartTime' => $oProject->getStartTime(),
                'EndTime' => $oProject->getEndTime(),
                'Timespan' => $oProject->getTimespan()
                ); 
                ausgabe:
                Code:
                Array
                (
                    [WorkId] => 3
                    [ProjectId] => 2
                    [StartTime] => 2007-03-09 13:01:35
                    [EndTime] => 2007-03-09 14:01:35
                    [Timespan] => 10000
                )
                getTimespan() mach ich halt grad.
                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


                • #53
                  Da ändert sich ja fast nichts, bis auf den Konstruktor-Parameter.
                  Joa, aber reicht doch für nen Fehler ^^

                  ok, Dateinamen werd ich mir was überlegen ^^

                  Wollte grad auch noch nach dem Zeit-Format fragen, aber ich übernehm jetz einfach das von dummi
                  Nicht jeder Fehler ist ein Bug.

                  Kommentar


                  • #54
                    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


                    • #55
                      keine idee?
                      [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
                      — The best things in life aren't things[/FONT]

                      Kommentar


                      • #56
                        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


                        • #57
                          wollte nix falsches posten habs vergessen rauszunehmen
                          strtotime() verwende ich jetzt auch, sonnst alles ok?
                          [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
                          — The best things in life aren't things[/FONT]

                          Kommentar


                          • #58
                            Haja, ich sag ja is nich kompliziert

                            Kommentar


                            • #59
                              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


                              • #60
                                Naja im Interface gibt es keine updateWork() insofern musst du schon prüfen ob es sich um ein Update oder Insert handelt.

                                Zum Edit1: So eine Funktion wäre mir nicht bekannt.

                                Kommentar

                                Lädt...
                                X