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...
Page 1 of 1
Gibt es etwas wie CHTML::ActiveDateField
#2
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:
models/Post.php:
controllers/PostController.php:
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));
}
?>
#3
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?
Oder hast du dir mal den Datepicker jQuery UI (gibts als Extension) oder vielleicht auch CMaskedTextField angesehen?
#4
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)
)
);
#5
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.
#6
Posted 09 June 2009 - 08:55 AM
ich nehm sowas hier
<?php $this->widget('CMaskedTextField', array('model'=>$form, 'attribute' => 'birthday', 'mask'=>'99.99.9999'));?>Share this topic:
Page 1 of 1

Help














