Gibt es etwas wie CHTML::ActiveDateField

Nochmals hallo alle,

gibt es eine Möglichkeit,die ich übersehen habe, um in Formularen editierbare Datums-Felder einzubauen, etwa nach einer Art CHTML::ActiveDateField ? Gibt es irgendwo so etwas, oder sollte ich es mir selbst basteln?

Sinnvoll wäre ja auch DateTime für SQL-Datetime Felder…

Hab zwar noch kein ActiveDateField-ähnliches gefunden, mir aber eines (sehr unelegant) selbst gestrickt:

views/post/_form.php:



<div class="row">


<?php echo CHtml::activeLabel($post,'createTime'); ?>


<?php echo $post->chooseDate($post->createTime, 'createTime'); ?>


</div>


<div class="row">


<?php echo CHtml::activeLabel($post,'updateTime'); ?>


<?php echo $post->chooseDate($post->updateTime, 'updateTime'); ?>


</div>


models/Post.php:



<?php


  public function chooseDate($timestamp = "", $prefix){


    if($timestamp == ""){


        $timestamp = time();


    }


    $months = array(null, 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');


    unset($months[0]);


    $out = '<select name="' .$prefix . 'month">';


    foreach($months as $key => $month){


        if($key == date('m', $timestamp)){


            $out .= '<option value="'.$key.'" selected="selected">'.$month.'</option>';


        }else{


            $out .= '<option value="'.$key.'">'.$month.'</option>';


        }


    }


    $out .= '</select><select name="' . $prefix . 'days">';


    for($i = 1; $i <= 32; $i++){


        if($i == date('j', $timestamp)){


            $out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>';


        }else{


            $out .= '<option value="'.$i.'">'.$i.'</option>';


        }


    }


    $out .= "</select><select name='" . $prefix . "year'>";


    for($i = date('Y'); $i >= 1970; $i--){


        if($i == date('Y', $timestamp)){


            $out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>';


        }else{


            $out .= '<option value="'.$i.'">'.$i.'</option>';


        }


    }


    $out .= "</select>";


    return $out;


?>


} 


controllers/PostController.php:



<?php


  public function actionUpdate()


  {


    $post=$this->loadPost();


    if(isset($_POST['Post']))


    {


      $post->attributes=$_POST['Post'];





     $timestamp_createTime = mktime(0,0,0,$month = $_POST['createTimemonth'], $year = $_POST['createTimedays'], $day = $_POST['createTimeyear']);


     $timestamp_updateTime = mktime(0,0,0,$month = $_POST['updateTimemonth'], $year = $_POST['updateTimedays'], $day = $_POST['updateTimeyear']);





      $post->createTime = $timestamp_createTime;


      $post->updateTime = $timestamp_updateTime;





      if(isset($_POST['previewPost']))


        $post->validate();


      else if(isset($_POST['submitPost']) && $post->save())


        $this->redirect(array('show','id'=>$post->id));


    }


    $this->render('update',array('post'=>$post));


  }


?>


Hmm, ich würd diese Funktion ehrlichgesagt nicht ins Model packen, da dort ja nur das Datenhandling abgewickelt wird. In deinem Fall produzierst du dort aber große Teile der Ausgabe. Warum nicht ein kleines Widget daraus basteln?

Oder hast du dir mal den Datepicker jQuery UI (gibts als Extension) oder vielleicht auch CMaskedTextField angesehen?

Selbstverständlich hast du recht. Ich muss mich unbedingt an das MVC-Paradigma gewöhnen. Ich habe mich letztendlich für den Datepicker von jquery entschieden. Allerdings musste ich das Datumsfeld von INT (für Timestamp) in der SQL-Datenbank auf DATE ändern, damit das angelegte Datum auch vernünftig gespeichert wird:



$this->widget('application.extensions.jui.EJqueryUiInclude', array('theme'=>'humanity'));





// ...





$this->widget('application.extensions.jui.EDatePicker',


				array('name'=>'Post[createTime]', 


				'language'=>'de', 


				'mode'=>'imagebutton', 


				'theme'=>'humanity', 


				'value'=> $post->createTime, 


				'dateFormat'=>'yy-mm-dd', 


				'options'=>array("changeMonth"=>true, "changeYear"=>true, "showButtonPanel"=>true), 


				'htmlOptions'=>array('size'=>10)


)


);


Ein kleiner Tipp noch: Du kannst ruhig auch weiter INT verwenden. Die schöne PHP-Funktion strtotime() wandelt dir nämlich fast jeden gültigen Datumsstring in einen Timestamp um. Und damit die Umwandlung automatisch erfolgt, könnte man das in die AR-Methode beforeSave() deines Records packen.

ich nehm sowas hier

<?php $this->widget('CMaskedTextField', array('model'=>$form, 'attribute' => 'birthday', 'mask'=>'99.99.9999'));?>