Projekt

Obecné

Profil

Stáhnout (4.46 KB) Statistiky
| Větev: | Tag: | Revize:
8baed187 Michal Kliment
<?php defined('SYSPATH') or die('No direct script access.');
/**
* FORGE dateselect input library.
*
* $Id: Form_Dateselect.php 1923 2008-02-05 14:49:08Z Shadowhand $
*
* @package Forge
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*
*
* @method Form_Date label(string $label)
* @method Form_Date rules(string $rules)
* @method Form_Date class(string $class)
* @method Form_Date months(int $month)
* @method Form_Date days(int $day)
* @method Form_Date years(int $year)
*/
class Form_Date extends Form_Input {

protected $data = array
(
'name' => '',
c1bdc1c4 Michal Kliment
'class' => 'date',
8baed187 Michal Kliment
);

protected $protect = array('type');

// Precision for the parts, you can use @ to insert a literal @ symbol
protected $parts = array
(
c1bdc1c4 Michal Kliment
'day' => array(),
8baed187 Michal Kliment
'month' => array(),
'year' => array(),
);

public function __construct($name)
{
// Set name
$this->data['name'] = $name;

// Default to the current time
$this->data['value'] = time();
}

public function __call($method, $args)
{
if (isset($this->parts[substr($method, 0, -1)]))
{
// Set options for date generation
$this->parts[substr($method, 0, -1)] = $args;
c1bdc1c4 Michal Kliment
// Add rule
$this->rules('time_interval');
8baed187 Michal Kliment
return $this;
}

return parent::__call($method, $args);
}

public function html_element()
{
// Import base data
$data = $this->data;

// No labels or values
unset($data['label']);

c1bdc1c4 Michal Kliment
// count date limit
$maxDate = '';
$minDate = '';
8baed187 Michal Kliment
foreach($this->parts as $type => $val)
{
c1bdc1c4 Michal Kliment
if (empty($val))
8baed187 Michal Kliment
{
continue;
}
c1bdc1c4 Michal Kliment
if ($type == 'year')
8baed187 Michal Kliment
{
c1bdc1c4 Michal Kliment
$minDate .= '-'.(intval(date('Y')) - intval($val[0])).'Y ';
if (count($val) > 1)
{
$diff = intval($val[1]) - intval(date('Y'));
$maxDate .= '+'.$diff.'Y ';
}
8baed187 Michal Kliment
}
c1bdc1c4 Michal Kliment
else if ($type == 'month')
8baed187 Michal Kliment
{
c1bdc1c4 Michal Kliment
$minDate .= '-'.(intval(date('m')) - intval($val[0])).'m ';
if (count($val) > 1)
{
$diff = intval($val[1]) - intval(date('m'));
$maxDate .= '+'.$diff.'m ';
}
}
else if ($type == 'day')
{
$minDate .= '-'.(intval(date('d')) - intval($val[0])).'d ';
if (count($val) > 1)
{
$diff = intval($val[1]) - intval(date('d'));
$maxDate .= '+'.$diff.'d ';
}
8baed187 Michal Kliment
}
}
c1bdc1c4 Michal Kliment
// convert timestamp to readable format
$converted_data = $data;
$converted_data['value'] = ($data['value'] ? date('Y-m-d', $data['value']) : '');
$converted_data['minDate'] = trim($minDate);
$converted_data['maxDate'] = trim($maxDate);
$input = form::input($converted_data);
8baed187 Michal Kliment
return $input;
}
c1bdc1c4 Michal Kliment
public function rule_time_interval()
8baed187 Michal Kliment
{
c1bdc1c4 Michal Kliment
// timestamp
$ts = $this->data['value'];
// get min date
// min year
if (empty($this->parts['year']))
{
$min_y = date('Y');
}
else
{
$min_y = $this->parts['year'][0];
}
// min month
if (empty($this->parts['month']))
{
$min_m = date('m');
}
else
{
$min_m = $this->parts['month'][0];
}
// min day
if (empty($this->parts['day']))
{
$min_d = date('d');
}
else
{
$min_d = $this->parts['day'][0];
}
// get max date
// max year
if (count($this->parts['year']) == 2)
{
$max_y = $this->parts['year'][1];
$max_set = TRUE;
}
else
{
$max_y = date('Y');
}
// max month
if (count($this->parts['month']) == 2)
{
$max_m = $this->parts['month'][1];
$max_set = TRUE;
}
else
{
$max_m = date('m');
}
// max day
if (count($this->parts['day']) == 2)
{
$max_d = $this->parts['day'][1];
$max_set = TRUE;
}
else
{
$max_d = date('d');
}
// get min, max timestamps
$min_ts = mktime(0, 0, 0, $min_m, $min_d, $min_y);
// check if given date is in interval
if ($ts && $ts < $min_ts)
{
$this->errors['date_interval'] = TRUE;
}
// max interval set
if (isset($max_set) && $max_set)
{
$max_ts = mktime(0, 0, 0, $max_m, $max_d, $max_y);
if ($ts && $ts > $max_ts)
{
$this->errors['date_interval'] = TRUE;
}
}
if (!$ts)
{
$this->data['value'] = 0;
}
8baed187 Michal Kliment
}

protected function load_value()
{
if (is_bool($this->valid))
return;

$time = $this->input_value($this->name);
c1bdc1c4 Michal Kliment
$this->data['value'] = strtotime($time);
8baed187 Michal Kliment
}

} // End Form Dateselect