1: <?php
2:
3: /**
4: * The Date complex data type
5: *
6: * @package alpha::model::types
7: * @since 1.0
8: * @author John Collins <dev@alphaframework.org>
9: * @version $Id: Date.inc 1605 2012-12-13 15:41:06Z alphadevx $
10: * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
11: * @copyright Copyright (c) 2012, John Collins (founder of Alpha Framework).
12: * All rights reserved.
13: *
14: * <pre>
15: * Redistribution and use in source and binary forms, with or
16: * without modification, are permitted provided that the
17: * following conditions are met:
18: *
19: * * Redistributions of source code must retain the above
20: * copyright notice, this list of conditions and the
21: * following disclaimer.
22: * * Redistributions in binary form must reproduce the above
23: * copyright notice, this list of conditions and the
24: * following disclaimer in the documentation and/or other
25: * materials provided with the distribution.
26: * * Neither the name of the Alpha Framework nor the names
27: * of its contributors may be used to endorse or promote
28: * products derived from this software without specific
29: * prior written permission.
30: *
31: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
32: * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
33: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
34: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
36: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
38: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
41: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
42: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
43: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44: * </pre>
45: *
46: */
47: class Date extends AlphaType implements AlphaTypeInterface {
48:
49: /**
50: * The year part
51: *
52: * @var integer
53: * @since 1.0
54: */
55: private $year;
56:
57: /**
58: * The month part
59: *
60: * @var integer
61: * @since 1.0
62: */
63: private $month;
64:
65: /**
66: * The day part
67: *
68: * @var integer
69: * @since 1.0
70: */
71: private $day;
72:
73: /**
74: * The textual version of the day, e.g. Monday
75: *
76: * @var string
77: * @since 1.0
78: */
79: private $weekday;
80:
81: /**
82: * The validation rule (reg-ex) applied to Date values
83: *
84: * @var string
85: * @since 1.0
86: */
87: private $validationRule;
88:
89: /**
90: * The error message returned for invalid values
91: *
92: * @var string
93: * @since 1.0
94: */
95: protected $helper= 'Not a valid date value! A date should be in the ISO format YYYY-MM-DD.';
96:
97: /**
98: * Constructor. Leave $date param empty to default to now.
99: *
100: * @param string $date Date string in the ISO format YYYY-MM-DD.
101: * @since 1.0
102: * @throws IllegalArguementException
103: */
104: public function __construct($date='') {
105: global $config;
106:
107: $this->validationRule = AlphaValidator::ALLOW_ALL;
108:
109: if(empty($date)) {
110: if($config->get('app.default.datetime') == 'now') {
111: $this->year=date('Y');
112: $this->month=date('m');
113: $this->day=date('d');
114: $this->weekday=date('l');
115: }else{
116: $this->year='0000';
117: $this->month='00';
118: $this->day='00';
119: }
120: }else{
121: if (preg_match($this->validationRule, $date)) {
122: $this->populateFromString($date);
123: }else{
124: throw new IllegalArguementException($this->helper);
125: }
126: }
127: }
128:
129: /**
130: * Accepts a full date string in ISO YYYY-mm-dd format and populates relevent Date attributes.
131: *
132: * @param string $date
133: * @since 1.0
134: * @throws IllegalArguementException
135: */
136: public function setValue($date) {
137: $this->populateFromString($date);
138: }
139:
140: /**
141: * Set the Date attributes to match the three values provided
142: *
143: * @param integer $year
144: * @param integer $month
145: * @param integer $day
146: * @throws IllegalArguementException
147: * @since 1.0
148: */
149: public function setDateValue($year, $month, $day) {
150: $valid = null;
151:
152: if (!preg_match('/^[0-9]{4}$/', $year))
153: $valid = 'Error: the year value '.$year.' provided is invalid!';
154: if (!isset($valid) && !preg_match('/^[0-9]{1,2}$/', $month))
155: $valid = 'Error: the month value '.$month.' provided is invalid!';
156: if (!isset($valid) && !preg_match('/^[0-9]{1,2}$/', $day))
157: $valid = 'Error: the day value '.$day.' provided is invalid!';
158: if (!isset($valid) && !checkdate($month, $day, $year))
159: $valid = 'Error: the day value '.$year.'-'.$month.'-'.$day.' provided is invalid!';
160:
161: if (isset($valid)){
162: throw new IllegalArguementException($valid);
163: }else{
164: $this->year = $year;
165: $this->month = str_pad($month, 2, '0', STR_PAD_LEFT);
166: $this->day = str_pad($day, 2, '0', STR_PAD_LEFT);
167: $unixTime = mktime(0, 0, 0, $this->month, $this->day, $this->year);
168: $this->weekday=date('l', $unixTime);
169: }
170: }
171:
172: /**
173: * Get the date value as a string in the format "YYYY-MM-DD"
174: *
175: * @return string
176: * @since 1.0
177: */
178: public function getValue() {
179: return $this->year.'-'.$this->month.'-'.$this->day;
180: }
181:
182: /**
183: * Return the value in UNIX timestamp format
184: *
185: * @return integer
186: * @since 1.0
187: */
188: public function getUnixValue() {
189: return mktime(0, 0, 0, $this->month, $this->day, $this->year);
190: }
191:
192: /**
193: * Get the date value as a string in the format "DD/MM/YYYY"
194: *
195: * @return string
196: * @since 1.0
197: */
198: public function getEuroValue() {
199: return $this->day.'/'.$this->month.'/'.substr($this->year, 2, 2);
200: }
201:
202: /**
203: * Get the date value as a string in the format "MM/DD/YYYY"
204: *
205: * @return string
206: * @since 1.0
207: */
208: public function getUSValue() {
209: return $this->month.'/'.$this->day.'/'.substr($this->year, 2, 2);
210: }
211:
212: /**
213: * Get the year part
214: *
215: * @return integer
216: * @since 1.0
217: */
218: public function getYear() {
219: return $this->year;
220: }
221:
222: /**
223: * Get the month part
224: *
225: * @return integer
226: * @since 1.0
227: */
228: public function getMonth() {
229: return $this->month;
230: }
231:
232: /**
233: * Get the day part
234: *
235: * @return integer
236: * @since 1.0
237: */
238: public function getDay() {
239: return $this->day;
240: }
241:
242: /**
243: * Get the textual weekday part, e.g. Monday
244: *
245: * @return string
246: * @since 1.0
247: */
248: public function getWeekday() {
249: return $this->weekday;
250: }
251:
252: /**
253: * Accepts a full date string in YYYY-MM-DD format and populates relevent Date attributes.
254: *
255: * @param string $date
256: * @throws IllegalArguementException
257: * @since 1.0
258: */
259: public function populateFromString($date) {
260: $valid = null;
261:
262: if($date == '' || $date == '0000-00-00') {
263: $this->year = '0000';
264: $this->month = '00';
265: $this->day = '00';
266: }else{
267: // This is just here for legacy to ensure that any old time value from a Date object is ignored
268: $spilt_by_space = explode(" ", $date);
269:
270: if(isset($spilt_by_space[0])) {
271: $date = $spilt_by_space[0];
272: }else{
273: throw new IllegalArguementException('Invalid Date value ['.$date.'] provided!');
274: }
275:
276: $split_by_dash = explode("-", $date);
277:
278: // Parse for the date parts, seperated by "-"
279: if(isset($split_by_dash[0]) && isset($split_by_dash[1]) && isset($split_by_dash[2])) {
280: $year = $split_by_dash[0];
281: $month = $split_by_dash[1];
282: $day = $split_by_dash[2];
283: }else{
284: throw new IllegalArguementException('Invalid Date value ['.$date.'] provided!');
285: }
286:
287: if (!preg_match('/^[0-9]{4}$/', $year))
288: $valid = 'Error: the year value '.$year.' provided is invalid!';
289: if (!isset($valid) && !preg_match('/^[0-9]{1,2}$/', $month))
290: $valid = 'Error: the month value '.$month.' provided is invalid!';
291: if (!isset($valid) && !preg_match('/^[0-9]{1,2}$/', $day))
292: $valid = 'Error: the day value '.$day.' provided is invalid!';
293: if (!isset($valid) && !checkdate($month, $day, $year))
294: $valid = 'Error: the date value '.$year.'-'.$month.'-'.$day.' provided is invalid!';
295:
296: if (isset($valid)){
297: throw new IllegalArguementException($valid);
298: }else{
299: $this->year = $year;
300: $this->month = str_pad($month, 2, '0', STR_PAD_LEFT);
301: $this->day = str_pad($day, 2, '0', STR_PAD_LEFT);
302: $unixTime = mktime(0, 0, 0, $this->month, $this->day, $this->year);
303: $this->weekday=date('l', $unixTime);
304: }
305: }
306: }
307:
308: /**
309: * Get the validation rule
310: *
311: * @return string
312: * @since 1.0
313: */
314: public function getRule() {
315: return $this->validationRule;
316: }
317:
318: /**
319: * Set the validation rule
320: *
321: * @param string $rule
322: * @since 1.0
323: */
324: public function setRule($rule) {
325: $this->validationRule = $rule;
326: }
327: }
328:
329: ?>