00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 class eZDateOperatorCollection
00032 {
00033
00034
00035 function eZDateOperatorCollection( $monthName = 'month_overview' )
00036 {
00037 $this->MonthOverviewName = $monthName;
00038 $this->Operators = array( $monthName );
00039 }
00040
00041
00042
00043
00044 function &operatorList()
00045 {
00046 return $this->Operators;
00047 }
00048
00049
00050
00051
00052 function namedParameterPerOperator()
00053 {
00054 return true;
00055 }
00056
00057
00058
00059
00060 function namedParameterList()
00061 {
00062 return array( 'month_overview' => array( 'field' => array( 'type' => 'string',
00063 'required' => true,
00064 'default' => false ),
00065 'date' => array( 'type' => 'integer',
00066 'required' => true,
00067 'default' => false ),
00068 'optional' => array( 'type' => 'array',
00069 'required' => false,
00070 'default' => false ) ) );
00071 }
00072
00073
00074
00075
00076 function modify( &$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$operatorValue, &$namedParameters )
00077 {
00078 $locale =& eZLocale::instance();
00079 if ( $operatorName == $this->MonthOverviewName )
00080 {
00081 $field = $namedParameters['field'];
00082 $date = $namedParameters['date'];
00083 if ( !$field )
00084 return $tpl->missingParameter( $operatorName, 'field' );
00085 if ( !$date )
00086 return $tpl->missingParameter( $operatorName, 'date' );
00087 $optional = $namedParameters['optional'];
00088 $dateInfo = getdate( $date );
00089 if ( is_array( $operatorValue ) )
00090 {
00091 $month = array();
00092 $month['year'] = $dateInfo['year'];
00093 $month['month'] = $locale->longMonthName( $dateInfo['mon'] );
00094 $weekDays = $locale->weekDays();
00095 $weekDaysMap = array();
00096 $i = 0;
00097 $dayNames = array( 0 => 'sun', 1 => 'mon', 2 => 'tue',
00098 3 => 'wed', 4 => 'thu', 5 => 'fri', 6 => 'sat' );
00099 foreach ( $weekDays as $weekDay )
00100 {
00101 $weekDaysMap[$weekDay] = $i;
00102 $weekDayName = $locale->shortDayName( $weekDay );
00103 $weekDayIdentifier = $dayNames[$weekDay];
00104 $month['weekdays'][] = array( 'day' => $weekDayName,
00105 'class' => $weekDayIdentifier );
00106 ++$i;
00107 }
00108 $days = array();
00109 $lastDay = getdate( mktime( 0, 0, 0, $dateInfo['mon']+1, 0, $dateInfo['year'] ) );
00110 $lastDay = $lastDay['mday'];
00111 for ( $day = 1; $day <= $lastDay; ++$day )
00112 {
00113 $days[$day] = false;
00114 }
00115 foreach ( array_keys( $operatorValue ) as $key )
00116 {
00117 $item =& $operatorValue[$key];
00118 $value = null;
00119 if ( is_object( $item ) and
00120 method_exists( $item, 'hasattribute' ) and
00121 method_exists( $item, 'attribute' ) )
00122 {
00123 if ( $item->hasAttribute( $field ) )
00124 $value = $item->attribute( $field );
00125 }
00126 else if ( is_array( $item ) )
00127 {
00128 if ( array_key_exists( $field, $item ) )
00129 $value = $item[$field];
00130 }
00131 if ( $value !== null )
00132 {
00133 $info = getdate( $value );
00134 if ( $info['year'] == $dateInfo['year'] and
00135 $info['mon'] == $dateInfo['mon'] )
00136 {
00137 $days[$info['mday']] = true;
00138 }
00139 }
00140 }
00141 $currentDay = false;
00142 if ( isset( $optional['current'] ) and $optional['current'] !== false )
00143 {
00144 $info = getdate( $optional['current'] );
00145 $currentDay = $info['yday'];
00146 }
00147 $today = mktime();
00148 $todayInfo = getdate( $today );
00149 $todayClass = false;
00150 if ( isset( $optional['today_class'] ) )
00151 $todayClass = $optional['today_class'];
00152 $dayClass = false;
00153 if ( isset( $optional['day_class'] ) )
00154 $dayClass = $optional['day_class'];
00155 $link = false;
00156 if ( isset( $optional['link'] ) )
00157 $link = $optional['link'];
00158 $yearLinkParameter = false;
00159 $monthLinkParameter = false;
00160 $dayLinkParameter = false;
00161 if ( isset( $optional['year_link'] ) )
00162 $yearLinkParameter = $optional['year_link'];
00163 if ( isset( $optional['month_link'] ) )
00164 $monthLinkParameter = $optional['month_link'];
00165 if ( isset( $optional['day_link'] ) )
00166 $dayLinkParameter = $optional['day_link'];
00167 $weeks = array();
00168 $lastWeek = 0;
00169 for ( $day = 1; $day <= $lastDay; ++$day )
00170 {
00171 $timestamp = mktime( 0, 0, 0, $dateInfo['mon'], $day, $dateInfo['year'] );
00172 $info = getdate( $timestamp );
00173 $weekDay = $weekDaysMap[$info['wday']];
00174
00175
00176
00177
00178
00179
00180 $week = date( 'W', $timestamp );
00181
00182 if ( $weekDay == 0 && $weekDaysMap[0] == 0 )
00183 {
00184 ++$week;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193 if ($week >= 52 || $week == 1)
00194 {
00195
00196
00197 $timestampPrevWeek = mktime( 0, 0, 0, $dateInfo['mon'], $day-7, $dateInfo['year'] );
00198 $isNewYear = date('Y', $timestampPrevWeek) < date('Y', $timestamp);
00199 if ($isNewYear && $week != 1)
00200 {
00201
00202
00203 $week = $lastWeek;
00204 }
00205 else
00206 {
00207
00208
00209 $week = $lastWeek;
00210 }
00211 if ($weekDay == 0)
00212 {
00213 ++$week;
00214 }
00215 }
00216
00217 $lastWeek = $week;
00218
00219 if ( !isset( $weeks[$week] ) )
00220 {
00221 for ( $i = 0; $i < 7; ++$i )
00222 {
00223 $weeks[$week][] = false;
00224 }
00225 }
00226 $dayData = array( 'day' => $day,
00227 'link' => false,
00228 'class' => $dayClass,
00229 'highlight' => false );
00230 if ( $currentDay == $info['yday'] )
00231 {
00232 if ( isset( $optional['current_class'] ) )
00233 $dayData['class'] = $optional['current_class'];
00234 $dayData['highlight'] = true;
00235 }
00236 if ( $dateInfo['year'] == $todayInfo['year'] and
00237 $dateInfo['mon'] == $todayInfo['mon'] and
00238 $day == $todayInfo['mday'] )
00239 {
00240 if ( $dayData['class'] )
00241 $dayData['class'] .= '-' . $todayClass;
00242 else
00243 $dayData['class'] = $todayClass;
00244 }
00245 if ( $days[$day] )
00246 {
00247 $dayLink = $link;
00248 if ( $dayLink )
00249 {
00250 $dayLink .= '/(year)/' . $info['year'];
00251 $dayLink .= '/(month)/' . $info['mon'];
00252 $dayLink .= '/(day)/' . $info['mday'];
00253 }
00254 $dayData['link'] = $dayLink;
00255 }
00256 $weeks[$week][$weekDay] = $dayData;
00257 }
00258
00259 $next = false;
00260 if ( isset( $optional['next'] ) )
00261 $next = $optional['next'];
00262 if ( $next )
00263 {
00264 $nextTimestamp = mktime( 0, 0, 0, $dateInfo['mon'] + 1, 1, $dateInfo['year'] );
00265 $nextInfo = getdate( $nextTimestamp );
00266 $month['next'] = array( 'month' => $locale->longMonthName( $nextInfo['mon'] ),
00267 'year' => $nextInfo['year'] );
00268 $nextLink = $next['link'];
00269 $nextLink .= '/(year)/' . $nextInfo['year'];
00270 $nextLink .= '/(month)/' . $nextInfo['mon'];
00271 $month['next']['link'] = $nextLink;
00272 }
00273 else
00274 $month['next'] = false;
00275
00276 $month['current'] = array( 'month' => $locale->longMonthName( $info['mon'] ),
00277 'year' => $info['year'] );
00278 $currentLink = $next['link'];
00279 $currentLink .= '/(year)/' . $info['year'];
00280 $currentLink .= '/(month)/' . $info['mon'];
00281 $month['current']['link'] = $currentLink;
00282
00283 $previous = false;
00284 if ( isset( $optional['previous'] ) )
00285 {
00286 $previous = $optional['previous'];
00287 }
00288 if ( $previous )
00289 {
00290 $previousTimestamp = mktime( 0, 0, 0, $dateInfo['mon'] - 1, 1, $dateInfo['year'] );
00291 $previousInfo = getdate( $previousTimestamp );
00292 $month['previous'] = array( 'month' => $locale->longMonthName( $previousInfo['mon'] ),
00293 'year' => $previousInfo['year'] );
00294 $previousLink = $previous['link'];
00295 $previousLink .= '/(year)/' . $previousInfo['year'];
00296 $previousLink .= '/(month)/' . $previousInfo['mon'];
00297 $month['previous']['link'] = $previousLink;
00298 }
00299 else
00300 {
00301 $month['previous'] = false;
00302 }
00303 $month['weeks'] = $weeks;
00304 $operatorValue = $month;
00305 }
00306 }
00307 }
00308
00309
00310 var $Operators;
00311 };
00312
00313 ?>