Hallo mal wieder,

so, vor längerer Zeit hatte ich ja schon mal erwähnt, dass ich verschiedenes
bezüglich Datumsformat programmieren will. Hier meine Ergebnisse, falls es
jemanden interessiert.Die Klasse AppModel validiert automatisch
Datumsangaben und wandelt bei Bedarf von Deutschen Format in das DB-Format.
Der Helper Datefield gibt ein Eingabefeld für ein Datum als Text-Input aus,
wobei automatisch in deutsches Format konvertiert wird:

### /app/app_model.php

<?php

class AppModel extends Model
{
        var $excludeDateTimeValidation = array();

        function beforeValidate() {
                foreach ($this->_tableInfo->value as $field) {
                        unset($ruleSet);
                        if ($field['type'] == 'date') {
                                $ruleSet = array(
                                        $field['name'].'_isDateFormat' =>
array(  'rule'=>'isDateFormat', 
        
'message'=>'invalid date format'),
                                        $field['name'].'_isValidDate'  =>
array(  'rule'=>'isValidDate',  
        
'message'=>'invalid date')
                                );
                        } elseif (in_array($field['type'], array('datetime',
'timestamp'))) {
                                $ruleSet = array(
                                        $field['name'].'_isDateTimeFormat'
=> array(       'rule'=>'isDateTimeFormat', 
        
'message'=>'invalid date-time format'),
                                        $field['name'].'_isValidDateTime'
=> array(       'rule'=>'isValidDateTime',  
        
'message'=>'invalid date-time')
                                );
                        } elseif ($field['type'] == 'time') {
                                $ruleSet = array(
                                        $field['name'].'_isTimeFormat' =>
array(  'rule'=>'isTimeFormat',
        
'message'=>'invalid time format'),
                                        $field['name'].'_isValidTime'  =>
array(  'rule'=>'isValidTime',
        
'message'=>'invalid time')
                                );
                        }

                        if (isset($ruleSet) && !in_array($field['name'],
$this->excludeDateTimeValidation)) {
                                if (!isset($this->validate[$field['name']]))
{
                                        $this->validate[$field['name']] =
$ruleSet;
                                } else {
                                        if
(!is_array($this->validate[$field['name']])) {
        
$this->validate[$field['name']]=
        
array($field['name'].'_origrule' => array(
                                                                'rule' =>
$this->validate[$field['name']],
                                                                'message' =>
__('This field cannot be left blank',true)
                                                        ));
                                        }
                                        $this->validate[$field['name']] =
am($this->validate[$field['name']], $ruleSet);
                                }
                        }
                }
                return true;
        }

        function isDateFormat($date) {
                return (!isset($date)
                                || $date==''
                                || ereg('^[0-9]{2}.[0-9]{2}.[0-9]{4}$',
$date)
                                || ereg('^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
$date));
        }

        function isTimeFormat($time) {
                return (!isset($time)
                                || $time==''
                                || ereg('^[0-9]{2}:[0-9]{2}:[0-9]{2}$',
$time));
        }

        function isDateTimeFormat($datetime) {
                return (!isset($datetime)
                                || $datetime==''
                                || ereg('^[0-9]{2}.[0-9]{2}.[0-9]{4}
[0-9]{2}:[0-9]{2}:[0-9]{2}$', $datetime)
                                || ereg('^[0-9]{4}-[0-9]{2}-[0-9]{2}
[0-9]{2}:[0-9]{2}:[0-9]{2}$', $datetime));
        }

        function isValidDate($date) {
                if (!isset($date) || $date=='') return true; 

                if (ereg('^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$',
$date)) { 
                        $val=explode('-', $date); 
                        $year=$val[0];
                        $day=$val[2];
                } elseif
(ereg('^[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]$', $date)) {
                        $val=explode('.', $date);
                        $year=$val[2];
                        $day=$val[0];
                } else {
                        return false;
                }
                $month=$val[1];

                if ($day>31 || $day<1)  return false;
                if ($month>12 || $month<1)  return false;
                switch($month) {
                        case 2 :
                                if($day > 29) return false;
                                if (!($year % 4 == 0 && ($year % 100 != 0 ||
$year % 400 == 0)) && $day>28) return false;
                                break;

                        case 4 : 
                        case 6 : 
                        case 9 : 
                        case 11 : 
                                if ($day>30) return false;
                                break;
                }
                return true;
        }

        function isValidTime($time) {
                if (!isset($time) || $time=='') return true; //bei leeren
Eingaben gibt es nichts zu tun

                if (ereg('^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$', $time)) { //
Eingabe ist im DB-Format
                        $val=explode(':', $time); // Zeit zerlegen
                        $hour=$val[0];
                        $minute=$val[1];
                        $second=$val[2];
                } else {
                        return false;
                }

                if ($hour>23)  return false;
                if ($minute>59)  return false;
                if ($second>59)  return false;

                return true;
        }

        function isValidDateTime($datetime) {
                $val=explode(' ', $datetime);
                $date=$val[0];
                $time=$val[1];

                return ($this->isValidDate($date) &&
$this->isValidTime($time));
        }

        function beforeSave() {
                foreach ($this->_tableInfo->value as $field) {
                        $val = null;
                        if (isset($this->data[$this->name][$field['name']]))
                                $val =
$this->data[$this->name][$field['name']];
                        if (isset($val) && $val<>'') {
                                if (in_array($field['type'],
array('datetime', 'timestamp'))) {
                                                if
(!$this->convDateTime($val)) $val='';
        
$this->set(array($field['name'] => $val));
                                } elseif ('date' == $field['type']) {
                                                if (!$this->convDate($val))
$val='';
        
$this->set(array($field['name'] => $val));
                                }
                        }
                }
                return true;
        }

        function convDate(&$date) {
                $targetFormat = '^[0-9]{4}-[0-9]{2}-[0-9]{2}$';
                $sourceFormat = '^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$';
                $sourceDelimiter = '.';
                $targetDelimiter = '-';

                if (!isset($date) || $date=='' || ereg($targetFormat,
$date)) return true;

                if (ereg($sourceFormat, $date)) {
                        $val = explode($sourceDelimiter, $date);
        
$date=$val[2].$targetDelimiter.$val[1].$targetDelimiter.$val[0];
                        return true;
                }

                return false;
        }


        function convDateTime(&$datetime) {

                if (!isset($datetime) || $datetime=='') return true; //bei
leeren Eingaben gibt es nichts zu tun

                if (   ereg('^[0-9]{4}-[0-9]{2}-[0-9]{2}
[0-9]{2}:[0-9]{2}:[0-9]{2}$', $datetime)
                        || ereg('^[0-9]{2}\.[0-9]{2}\.[0-9][0-9]{4}
[0-9]{2}:[0-9]{2}:[0-9]{2}$', $datetime))
                {
                        $val=explode(' ', $datetime); // Datum-Zeit zerlegen
                        $date=$val[0];
                        if ($this->convDate($date)) {
                                $datetime = $date.' '.$val[1];
                                return true;
                        } else {
                                return false;
                        }
                }

                return false;
        }
}

?>

### /app/views/helpers/datefield.php

<?php

class DatefieldHelper extends AppHelper
{

        var $helpers = array('Form');

        function input($fieldName, $options = array()) {
                $this->setFormTag($fieldName);
                $type=null;

                if (isset($this->fieldset['fields'][$this->field()])) {
                        $type = $this->fieldset['fields'][$this->field()];
                } elseif (ClassRegistry::isKeySet($this->model())) {
                        $model =& ClassRegistry::getObject($this->model());
                        $type = $model->getColumnType($this->field());
                }
                if ($type == 'date') {
                        $val = $this->_convDate($this->value($fieldName));
                } elseif ($type == 'datetime' || $type == 'timestamp') {
                        $valarr = explode(' ', $this->value($fieldName));
                        $val = $this->_convDate($valarr[0]).' '.$valarr[1];
                }

                $options['value'] = $val;
                $options['type'] = 'text';
                return $this->Form->input($fieldName, $options);
        }

        function _convDate($date) {
                $sourceFormat = '^[0-9]{4}-[0-9]{2}-[0-9]{2}$';
                $targetFormat = '^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$';
                $sourceDelimiter = '-';
                $targetDelimiter = '.';

                if (isset($date)
                        && $date!=''
                        && !ereg($targetFormat, $date)
                        && ereg($sourceFormat, $date))
                {
                        $val = explode($sourceDelimiter, $date);
        
$date=$val[2].$targetDelimiter.$val[1].$targetDelimiter.$val[0];
                }

                return $date;
        }
}

?>

---
liebe Grüße
- Chris


--~--~---------~--~----~------------~-------~--~----~
Sie erhalten diese Nachricht, weil Sie Mitglied sind von Google Groups-Gruppe 
"CakePHP-de für deutsche CakePHP Entwickler".
 Für das Erstellen von Beiträgen in dieser Gruppe senden Sie eine E-Mail
an [email protected]
 Um sich von dieser Gruppe abzumelden, senden Sie eine E-Mail an [EMAIL 
PROTECTED]
 Weitere Optionen finden Sie in dieser Gruppe unter 
http://groups.google.com/group/cakephp-de?hl=de
-~----------~----~----~----~------~----~------~--~---

Antwort per Email an