DatePicker und save_callback ->Datenbankquery?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • psren
    Contao-Urgestein
    • 07.04.2010
    • 2733

    #1

    DatePicker und save_callback ->Datenbankquery?

    Hallo ihr Entwickler,

    ich dachte ich stürze mich auch mal in den Spaß und versuche jetzt mal eine eigene Erweiterung zu schreiben (zum lernen)

    Jetzt habe ich zwei Felder in der Datenbank
    • varchar(10) start
    • varchar(10) stop

    die Felder sind auch angelegt und werden mittels DatePicker befüllt.

    Jetzt wollte ich die beiden Daten vergleichen und habe deshalb den save_callback eingebaut. Die Funktion wird aufgerufen wie gewünscht und auch meine Prüfung klappt.

    Jedoch werden die Felder ja dann nicht in die DB geschrieben. Das wollte ich dann so erledigen:
    PHP-Code:
    class tl_lb_dates extends Backend
    {
    
        public function checkDates(DataContainer $dc)
        {
            $id = $dc->activeRecord->id;
            $start = $this->Input->post('start');
            $stop = $this->Input->post('stop');
    
            //Enddatum kleiner als Startdatum
            if($stop < $start) 
            {
                throw new Exception($GLOBALS['TL_LANG']['ERR']['endbeforestart']);
            } 
            
            else
            {
                $updatearray = array('start'=>$start,'stop'=>$stop);
                //zurückgeben korrekter Daten
                return $this->Database->prepare("UPDATE tl_lb_dates %s WHERE id=?")                    
                                   ->set($updatearray)
                                   ->execute($id);
            }
        }
    } 
    
    Nur so speichert es immer etwas falsches in die Datenbank
    O:18:"DB_M
    (in beiden Feldern)

    Woran liegt das und wie behebe ich es. Vor lauter Suchen bei Google dreh ich schon durch

    Vielen, vielen Dank für die Hilfe!
    psren

    Wenn ich euch helfen konnte könnt ihr euch gerne mal
    meine Amazon Wunschliste anschauen. Dankeschön.
  • psren
    Contao-Urgestein
    • 07.04.2010
    • 2733

    #2
    Falls es noch wichtig ist, so sehen meine Felder aus

    PHP-Code:
        //Startdatum
        'startDate' => array
        (
            'label'                   => &$GLOBALS['TL_LANG']['tl_lb_dates']['startDate'],
            'exclude'                 => true,
            'inputType'               => 'text',
            'eval'                    => array('rgxp'=>'date', 'datepicker'=>$this->getDatePickerString(), 'tl_class'=>'w50 wizard'),
            'save_callback'           => array(array('tl_lb_dates', 'checkDates'))
        ),
        
        //Enddatum
        'stopDate' => array
        (
            'label'                   => &$GLOBALS['TL_LANG']['tl_lb_dates']['stopDate'],
            'exclude'                 => true,
            'inputType'               => 'text',
            'eval'                    => array('rgxp'=>'date', 'datepicker'=>$this->getDatePickerString(), 'tl_class'=>'w50 wizard'),
            'save_callback'           => array(array('tl_lb_dates', 'checkDates'))
        ) 
    

    Wenn ich euch helfen konnte könnt ihr euch gerne mal
    meine Amazon Wunschliste anschauen. Dankeschön.

    Kommentar

    • easy
      Contao-Nutzer
      • 17.03.2011
      • 58

      #3
      Deine Datumsfelder sind als "text" definiert. Es wäre jedoch empfehlenswert, wenn das Datum in der Datenbank als UNIX-Timestamp (int(10)) abgelegt würde. Die Weiterverarbeitung würde damit vereinfacht.

      Was steht denn in $start und $stop drin? Die Felder sind als startDate und stopDate definiert, aber beim Update übergibst Du start und stop!

      Gruß easy

      Kommentar

      • psren
        Contao-Urgestein
        • 07.04.2010
        • 2733

        #4
        Huch das mit den start und stop Feldern hatte ich geändert und dort vergessen zu korrigieren (also das hatte schon in die richtigen Felder geschrieben)

        In die Datenbank wird das so geschrieben:
        O:18:"DB_M
        Das die Datumsfelder als 'text' definiert sind habe ich mit aus der tl_news.php abgeschaut dort sind sie so:
        PHP-Code:
        'start' => array
                (
                    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['start'],
                    'exclude'                 => true,
                    'inputType'               => 'text',
                    'eval'                    => array('rgxp'=>'date', 'datepicker'=>$this->getDatePickerString(), 'tl_class'=>'w50 wizard')
                ), 
        
        also meinst du ich kann das Feld einfach als int abspeichern (das erschien mir auch logisch, aber ich dachte es sei vllt eine Contao-Eigenheit)

        $start und $stop sind wie folgt definiert (und heißen jetzt startDate und stopDate)


        PHP-Code:
        $startDate = $this->Input->post('startDate');
        $stopDate = $this->Input->post('stopDate'); 
        
        Vielen Dank für deine Antwort

        Gruß
        psren
        Zuletzt geändert von psren; 04.05.2011, 10:13.

        Wenn ich euch helfen konnte könnt ihr euch gerne mal
        meine Amazon Wunschliste anschauen. Dankeschön.

        Kommentar

        • easy
          Contao-Nutzer
          • 17.03.2011
          • 58

          #5
          Du musst die Felder natürlich in Integer umwandeln, z.B. mit strtotime($startDate), wenn Du weißt, dass Du ein englisches Datumsformat verarbeitest: 'm.d.Y'. Oder mit mktime(Stunde, Minute, Sekunde, Monat, Tag, Jahr), dann musst Du nur Dein Datum vorher entsprechend zerpflücken.

          Und Du bist Dir sicher, dass Du auch
          $updatearray = array('start'=>$start,'stop'=>$stop);

          geändert hast?
          PHP-Code:
          $updatearray = array('startDate'=>$start,'stopDate'=>$stop); 
          
          Hast Du Dir mal die Werte für $start und $stop anzeigen lassen?

          Kommentar

          • easy
            Contao-Nutzer
            • 17.03.2011
            • 58

            #6
            Noch ein Nachtrag:

            Das Feld in der DCA Beschreibung lässt Du wie, es ist.
            Nur in der Datenbank sollte das Feld dann als int(10) definiert sein.
            Und die Umwandlung von text nach int erfolgt dann in Deiner Callback-Routine.

            Kommentar

            • psren
              Contao-Urgestein
              • 07.04.2010
              • 2733

              #7
              Danke für die nette Hilfe! Ich habe jetzt mal das Datenbankfeld als int(10) und auch die DB geupdatet.

              Allerdings speicher mir das Scipt so (mit strtotime) nichts mehr ab. In der Datenbank landet nur default '0' (also nur die 0) (also der 01.01.1970 was ja eigendlich auch falsch ist)

              Anbei mal mein kompletter Code.
              PHP-Code:
              <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
              
              $GLOBALS['TL_DCA']['tl_lb_dates'] = array(
              
                // Config
                'config' => array
                (
                  'dataContainer'               => 'Table',
                  'enableVersioning'            => true,
                  'ptable'                      => 'tl_lb_locations',
                ),
              
                // List
                'list' => array
                (
                  'sorting' => array
                  (
                    'mode'                    => 4,
                    'fields'                  => array('startDate'),
                    'headerFields'            => array('title', 'slots', 'tstamp', 'published'),
                    'flag'                    => 7,
                    'panelLayout'                => 'search,filter,sorting,limit',
                    'child_record_callback'   => array('tl_lb_dates', 'listDates')
                  ),
                  'label' => array
                  (
                    'fields'                  => array('title'),
                    'format'                  => '%s'
                  ),
                  'global_operations' => array
                  (
                    'all' => array
                    (
                      'label'               => &$GLOBALS['TL_LANG']['MSC']['all'],
                      'href'                => 'act=select',
                      'class'               => 'header_edit_all',
                      'attributes'          => 'onclick="Backend.getScrollOffset();"'
                    )
                  ),
                  'operations' => array
                  (
                    'edit' => array
                    (
                      'label'               => &$GLOBALS['TL_LANG']['tl_lb_dates']['edit'],
                      'href'                => 'act=edit',
                      'icon'                => 'edit.gif',
                    ),
                    'delete' => array
                    (
                      'label'               => &$GLOBALS['TL_LANG']['tl_lb_dates']['delete'],
                      'href'                => 'act=delete',
                      'icon'                => 'delete.gif',
                      'attributes'          => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"',
                    )
                  )
                ),
              
                // Palettes
                'palettes' => array
                (
                  'default'                 => 'title;startDate,stopDate;note;description;published'
                ),
              
                // Subpalettes
                'subpalettes' => array(
                  
                ),
              
                // Fields
                'fields' => array
                (
                  //Titel
                  'title' => array
                  (
                      'label'                 => &$GLOBALS['TL_LANG']['tl_lb_dates']['title'],
                      'inputType'             => 'text',
                      'search'                => true,
                      'sorting'                => true,
                      'eval'                  => array('mandatory' => true)
                  ),
                  
                  //Notizen für Backenduser (toDo List o.Ä)
                  'note' => array
                  (
                    'label'                 => &$GLOBALS['TL_LANG']['tl_lb_dates']['note'],
                    'inputType'             => 'textarea',
                    'search'                => true,
                    'eval'                  => array('allowHtml' => true,'style' => 'height: 100px;','rte' => 'tinyMCE')
                  ),
                  
                  //Beschreibung
                  'description' => array
                  (
                    'label'                 => &$GLOBALS['TL_LANG']['tl_lb_dates']['description'],
                    'inputType'             => 'textarea',
                    'search'                => true,
                    'eval'                  => array('allowHtml' => true,'style' => 'height: 100px;','rte' => 'tinyMCE')
                  ),
                  
                  //sichtbar
                  'published' => array
                  (
                      'label'                   => &$GLOBALS['TL_LANG']['tl_lb_dates']['published'],
                      'exclude'                 => true,
                      'filter'                  => true,
                      'flag'                    => 1,
                      'inputType'               => 'checkbox',
                      'eval'                    => array('doNotCopy'=>true, 'tl_class' => 'w50')
                  ),
                  
                  //Startdatum
                  'startDate' => array
                  (
                      'label'                   => &$GLOBALS['TL_LANG']['tl_lb_dates']['startDate'],
                      'exclude'                 => true,
                      'inputType'               => 'text',
                      'eval'                    => array('rgxp'=>'date', 'datepicker'=>$this->getDatePickerString(), 'tl_class'=>'w50 wizard'),
                      'save_callback'           => array(array('tl_lb_dates', 'checkDates'))
                  ),
                  
                  //Enddatum
                  'stopDate' => array
                  (
                      'label'                   => &$GLOBALS['TL_LANG']['tl_lb_dates']['stopDate'],
                      'exclude'                 => true,
                      'inputType'               => 'text',
                      'eval'                    => array('rgxp'=>'date', 'datepicker'=>$this->getDatePickerString(), 'tl_class'=>'w50 wizard'),
                      'save_callback'           => array(array('tl_lb_dates', 'checkDates'))
                  )
                )
              );
              
              
              class tl_lb_dates extends Backend
              {
              
                  public function checkDates()
                  {
                      $id = $dc->activeRecord->id;
                      $startDate = $this->Input->post('startDate');
                      $stopDate = $this->Input->post('stopDate');
                      
                      //Enddatum kleiner als Startdatum
                      if($stopDate < $startDate) 
                      {
                          throw new Exception($GLOBALS['TL_LANG']['ERR']['endbeforestart']);
                      } 
                      else
                      {
                          $updatearray = array('startDate'=>strtotime($startDate),'stopDate'=>strtotime($stopDate));
                          //zurückgeben korrekter Daten
                          return $this->Database->prepare("UPDATE tl_lb_dates %s WHERE id=?")                    
                                             ->set($updatearray)
                                             ->execute($id);
                      }
                  }
                  
                  public function listDates($arrRow)
                  {
                      $date = ($this->parseDate('d.m.Y',$this->startDate) == $this->parseDate('d.m.Y',$this->stopDate)) ? $this->parseDate('d.m.Y',$this->startDate) : $this->parseDate('d.m.Y',$this->startDate).' - '.$this->parseDate('d.m.Y',$this->stopDate);
                      $time = time();
                      $key = ($arrRow['published'] && ($arrRow['start'] == '' || $arrRow['start'] < $time) && ($arrRow['stop'] == '' || $arrRow['stop'] > $time)) ? 'published' : 'unpublished';
                      
                      return '
                      <div class="cte_type ' . $key . '">'.$date.'</div>
                      <div class="block">'.$arrRow['title'].'</div>
                      ';
                  }
              }
              
              
              
              ?>

              Wenn ich euch helfen konnte könnt ihr euch gerne mal
              meine Amazon Wunschliste anschauen. Dankeschön.

              Kommentar

              • backbone
                AG Core-Entwicklung
                • 16.10.2009
                • 437

                #8
                Bitte nicht selber anfangen Datumsfunktionen zu schreiben, das geht in 99% der Fälle in die Hose (bzw. bringt die für genau ein Datumsformat was). Schau dir mal die Contao-Date Klasse an.

                Ich rate davon ab, int's für die Date-DB-Fields zu nehmen. Ich habe das mal gemacht und nur Schwierigkeiten bekommen (Falsche Defaultdaten, Mandatory-Check macht was er will, ...). Contao selbst (zum Bsp. in den News) speichert Dates in (var)chars ab, also lieber auch so machen.

                Wenn du die "save_callback" nimmst, dann brauchst du einfach nur den Wert der eingetragen werden soll zu returnen. (Evtl. musst dann für jeden Wert einmal checken, aber das wenns aufwändig ist, kannst das cachen.)
                Ihr Partner für Contao und Webentwicklung: http://www.hofff.com.

                Kommentar

                • psren
                  Contao-Urgestein
                  • 07.04.2010
                  • 2733

                  #9
                  Zitat von backbone Beitrag anzeigen
                  Bitte nicht selber anfangen Datumsfunktionen zu schreiben, das geht in 99% der Fälle in die Hose (bzw. bringt die für genau ein Datumsformat was). Schau dir mal die Contao-Date Klasse an.
                  Okay werde ich mal machen.

                  Zitat von backbone Beitrag anzeigen
                  Contao selbst (zum Bsp. in den News) speichert Dates in (var)chars ab, also lieber auch so machen.
                  Okay, also wie ich es am Anfang hatte-

                  Zitat von backbone Beitrag anzeigen
                  Wenn du die "save_callback" nimmst, dann brauchst du einfach nur den Wert der eingetragen werden soll zu returnen. (Evtl. musst dann für jeden Wert einmal checken, aber das wenns aufwändig ist, kannst das cachen.)
                  Du meinst also ich soll als return-Wer voncheckDates einfach nur z.B. $startDate rückgeben?

                  Ergänzung: Okay super. Wenn ich nur den Wert return, dann schreibt es das richtige Datum in die Spalte. Allerdings kann ich ja pro Methode nur einen Wert returnen (array geht ja leider nicht oder?) Wie handle ich denn das am besten, weil 2 unterschiedliche Methoden muss ja nicht sein?!

                  Ergänzung2: Post 777 ich hol mir schnell nen Schnaps :-D

                  Vielen Dank ihr beiden, super dass man mit so netter Hilfe anfangen kann sich da reinzuarbeiten.
                  Zuletzt geändert von psren; 04.05.2011, 13:26. Grund: fehler im BB-Code, Eränzung

                  Wenn ich euch helfen konnte könnt ihr euch gerne mal
                  meine Amazon Wunschliste anschauen. Dankeschön.

                  Kommentar

                  • backbone
                    AG Core-Entwicklung
                    • 16.10.2009
                    • 437

                    #10
                    Du kannst die gleiche Callback für beide Felder verwenden und dann in der methode dann einfach den zum Feld passend wert zurückgeben, ungefähr so:
                    PHP-Code:
                    return $objDCA->strField == 'start' ? $strStartDate : $strEndDate; 
                    
                    Ihr Partner für Contao und Webentwicklung: http://www.hofff.com.

                    Kommentar

                    • psren
                      Contao-Urgestein
                      • 07.04.2010
                      • 2733

                      #11
                      Danke euch beiden, jetzt läuft es wie ich wollte ;-)

                      Wenn ich euch helfen konnte könnt ihr euch gerne mal
                      meine Amazon Wunschliste anschauen. Dankeschön.

                      Kommentar

                      Lädt...