Yii Framework Forum: Gibt es etwas wie CHTML::ActiveDateField - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Gibt es etwas wie CHTML::ActiveDateField Rate Topic: -----

#1 User is offline   thyseus 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 300
  • Joined: 18-April 09
  • Location:Leipzig, Germany

Posted 19 May 2009 - 06:42 PM

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...


0

#2 User is offline   thyseus 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 300
  • Joined: 18-April 09
  • Location:Leipzig, Germany

Posted 20 May 2009 - 01:46 PM

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));
  }
?>


0

#3 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,013
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 21 May 2009 - 02:32 AM

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?
0

#4 User is offline   thyseus 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 300
  • Joined: 18-April 09
  • Location:Leipzig, Germany

Posted 23 May 2009 - 07:45 PM

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

0

#5 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,013
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 24 May 2009 - 06:36 AM

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.
0

#6 User is offline   mbi 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 604
  • Joined: 08-May 09

Posted 09 June 2009 - 08:55 AM

ich nehm sowas hier

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


0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users