Thời gian là 1 vấn đề cực kì quan trọng trong khi xử lý dữ liệu .Ví dụ bạn cần lấy 1 thông tin trong khoảng thời gian từ ngày 12 đến ngày 23 hoặc xem thời gian bài viết đăng .Datetime là vấn đề làm đau đầu nhiều người .Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu những vấn đề liên quan đến datetime :

  • Formatting Date and Time Values
  • Các kiến thức cần tham khảo trước
  • Tự động tạo datetime trong yii2
  • Tạo form search với datetime

Formatting Date and Time Values

Đây là 1 số lưu ý trước khi bạn xử dụng formatting trong yii2 nhằm đạt được như ý mình

Formatting Date Ví dụ Time Values
Date() January 01, 2014
Time 15:11
Datetime January 01, 2014 14:23
timestamp 12313123
relativeTime 3 hour ago
duration 1 day, 2 minutes

Các kiến thức cần tham khảo trước

Kiến thức cần tham khảo khi xem bài viết của mình các bạn cần xem lại gồm :

Tự động tạo datetime trong yii2

Tự động tạo datetime trong yii2 là 1 việc cần thiết khi bạn muốn lưu lại ngày tạo dữ liệu ngày sửa dữ liệu khi có thay đổi .Dưới đây là demo về việc tạo dữ liệu trong yii2 .Đầu tiên bạn cần có 1 bảng dữ liệu status như sau :

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Jan 10, 2017 at 11:55 PM
-- Server version: 10.1.16-MariaDB
-- PHP Version: 5.6.24

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `demoyii2`
--

-- --------------------------------------------------------

--
-- Table structure for table `status`
--

CREATE TABLE `status` (
  `id` int(11) NOT NULL,
  `status` varchar(100) NOT NULL,
  `date_create` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `status`
--
ALTER TABLE `status`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `status`
--
ALTER TABLE `status`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Có tác dụng lưu lại các status và thời gian tạo ra nó .Tiếp theo bạn đến phần models có tác dụng kiểm tra rules và tự động tạo thời gian viết status

<?php

namespace common\models;

use Yii;
use phpDocumentor\Reflection\Types\This;
use yii\behaviors\TimestampBehavior;

/**
 * This is the model class for table "status".
 *
 * @property integer $id
 * @property string $status
 * @property integer $date_create
 */
class Status extends \yii\db\ActiveRecord
{
	/** 
	 * behavios add auto time create
	 * 
	 */
	public function behaviors()
	{
		return [
				'timestamp'=>
				[
						'class'=> TimestampBehavior::className(),
						'createdAtAttribute'=>'date_create',
						'updatedAtAttribute'=>'date_create',
				]
		];
	}
	
	
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'status';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['status' ], 'required'],
            [['date_create'], 'integer'],
            [['status'], 'string', 'max' => 100],
        	['status','validateStatus'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'status' => Yii::t('app', 'Status'),
            'date_create' => Yii::t('app', 'Date Create'),
        ];
    }
    
    
    /**
     * check status name duplicate
     * 
     */
    
    /**
     * @param unknown $attribute
     * @param unknown $params
     */
    
    public function validateStatus($attribute, $params)
    {
    	if(!$this->errors)
    	{
    		$status = Status::findOne(['status'=> $this->status]);
    		if($status)
    		{
    			$this->addError('status','Status exit');
    		}
    	}
    }
}

Các bạn lưu ý behaviors() ở đây mình có sử dụng phương thức có sẵn trong yii2 là ‘class’=> TimestampBehavior::className(), với các thông số đi kèm .Bạn có thể tự custom cho mình 1 class riêng để xử lý nhé .Ở phần tiếp theo mình sẽ hướng dẫn các bạn cách viết 1 class như vậy

Còn phần view với controller thì không có sự thay đổi nào khác cả .

Tạo form search với datetime trên

Chúng ta đã lưu dữ liệu dưới dạng int .Vậy để làm sao chúng ta có thể tìm kiếm dữ liệu trong khoảng 1 thời gian nào đó do đó chúng ta cần làm form search với dạng dữ liệu đặc biệt này

Ở đây mình tạo 1 action trong StatusController.php trong mục frontend/controllers

/**
	 * Search dữ liệu giữa 1 khoảng thời gian
	 */
    public function actionSearch()
    {
    	$model_time = new Statusvalue();
    	if($model_time->load(\Yii::$app->request->post()))
    	{
    		$date_from = \Yii::$app->formatter->asTimestamp($model_time->date_from)-60*60;
    		$date_to = \Yii::$app->formatter->asTimestamp($model_time->date_to)+(23*3600-1);
    		$date_to = \Yii::$app->formatter->asTimestamp($model_time->date_to)+3600*24;
    		$searchModel = new StatusSearch();
    		$dataProvider = $searchModel->searchdate_time(Yii::$app->request->queryParams,$date_from,$date_to);
    		return $this->render('index',['dataProvider' =>$dataProvider,'searchModel' => $searchModel]);
    	}
    	else 
    	{
    		return $this->render('search',['model_time'=>$model_time]);
    	}
    }

Ở đây mình dùng thêm models có nhiệm vụ kiểm tra dữ liệu đầu vào đáp ứng 1 số yêu cầu .File Statusvalue() có nội dung như sau :

<?php
namespace common\models;
use yii\base\Model;

class Statusvalue extends Model
{
	public $date_from;
	public $date_to;
	public function rules()
	{
		return [
			['date_from','string'],
			['date_to','string'],
		];
	}
}

Ok giờ đến file view : search.php .Mình sử dụng yii\jui\DatePicker;.Nội dung file như sau :

<?php
use yii\widgets\ActiveForm;
use yii\jui\DatePicker;
use yii\base\Widget;
use yii\helpers\Html;
?>
<?php $form =  ActiveForm::begin(['id'=>'form_submit','action'=>'search']);
?>
<div class="col-md-12">
<div class="col-md-6">Chọn thời gian bắt đầu
<?php echo DatePicker::widget([
           		'options' => ['placeholder' => 'Chọn thời gian bắt đầu'],
              'model' => $model_time,
               'attribute' => 'date_from',
               'language' => 'en',
               'dateFormat' => 'dd-MM-yyyy',
           ]);

?>
</div>
<div class="col-md-6">Chọn thời gian kết thúc
<?php echo DatePicker::widget([
           		'options' => ['placeholder' => 'Chọn thời gian bắt đầu'],
              'model' => $model_time,
               'attribute' => 'date_to',
               'language' => 'en',
               'dateFormat' => 'dd-MM-yyyy',
           ]);

?>
</div>
<div class="form-group">
   	<?= Html::submitButton('Tìm kiếm',['id'=>'submit'])?>
   </div>
<?php $form = ActiveForm::end();?>


</div>

Bạn có thể để ý đến ở đây mình dùng activeForm và DatePicker để tạo giao diện cho from_search.

Bạn có thể test demo ở link dưới đây http://demo.hbsprogram.com/status/ :

Nếu có gì ko hiểu bạn hãy comment bên dưới để chúng ta cùng nhau thảo luận nhé