Ergebnis 1 bis 11 von 11

Thema: DatePicker und save_callback ->Datenbankquery?

  1. #1
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard 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

  2. #2
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    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'))
        ) 

  3. #3
    Contao-Nutzer Avatar von easy
    Registriert seit
    17.03.2011.
    Ort
    Remagen
    Beiträge
    58

    Standard

    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

  4. #4
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    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
    Geändert von psren (04.05.2011 um 09:13 Uhr)

  5. #5
    Contao-Nutzer Avatar von easy
    Registriert seit
    17.03.2011.
    Ort
    Remagen
    Beiträge
    58

    Standard

    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?

  6. #6
    Contao-Nutzer Avatar von easy
    Registriert seit
    17.03.2011.
    Ort
    Remagen
    Beiträge
    58

    Standard

    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.

  7. #7
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    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>
            '
    ;
        }
    }



    ?>

  8. #8
    AG Core-Entwicklung
    Registriert seit
    16.10.2009.
    Ort
    Bad Lausick
    Beiträge
    437

    Standard

    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.

  9. #9
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

    Zitat 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 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 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.
    Geändert von psren (04.05.2011 um 12:26 Uhr) Grund: fehler im BB-Code, Eränzung

  10. #10
    AG Core-Entwicklung
    Registriert seit
    16.10.2009.
    Ort
    Bad Lausick
    Beiträge
    437

    Standard

    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.

  11. #11
    Contao-Urgestein
    Registriert seit
    07.04.2010.
    Ort
    Stuttgart
    Beiträge
    2.733
    User beschenken
    Wunschliste

    Standard

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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •