parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

пожалуйста

egr 16.12.2002 15:31

В чистом виде, пожалуйста:
Базовый класс:
#######
# Calendar class v3.2.1
# абстрактный класс для формирования XML кода календаря (метод ^xml[])
# Описание атрибутов:
# in - показывает что этот день является сегодняшним днём
# f - наличие материалов в этот день
# hit - этот день выбран пользователем -> на него не ставить ссылку и выбирать
# данные только за этот день
@CLASS
calendar

#######
@init[date;days_of_files]
# получение текущей даты
$date_now[^date::now[]]

# Инициал. хэш показывающий какой период времени передан
# при создании экземпляра класса
$self.date[$date]

# вызов метода для создания специфических для языка переменных
# в классе производном от этого и определить только один
# метод @i18n[]
^i18n[]

# определение переменных месяца и года для пред. месяца календаря
$calendar_month_prev[^date::create($date.year;$date.month)]
^calendar_month_prev.roll[month](-1)
$prev_m($calendar_month_prev.month)
$prev_y($calendar_month_prev.year)

# определение переменных месяца и года для след. месяца календаря
$calendar_month_next[^date::create($date.year;$date.month)]
^calendar_month_next.roll[month](+1)
$next_m($calendar_month_next.month)
$next_y($calendar_month_next.year)

# the hash of publications(files)
$self.days_of_files[$days_of_files]

#######
@xml[]
$result[
	<month>
		^month_year[]
		^weekdays[]
		^week[]
	</month>
]

#######
# формирование тега для года и месяца
@month_year[][hit]
^if(
	$date.day && $date.month && $date.year ||
	(
		$date_now.month == $date.month && 
		$date_now.year == $date.year &&
		$date.day
	)
){
	$hit[]
}{
	$hit[hit="1"]
}

<month_year
	month="$date.month"
	month_title="$month"
	next_month="$next_m"
	prev_month="$prev_m"
	year="$date.year"
	next_year="$next_y"
	prev_year="$prev_y"
	$hit
/>

#######
# тег названий дней недели
@weekdays[]
<weekdays>
^for[i](0;6){
	<day title="$calendar_locale.day_names.$i"/>
}
</weekdays>

#######
# формирование тегов для каждой недели месяца
# day - день месяца, может быть нулем, если начало/конец
# первой/последней недели месяца не приходятся на понедельник/воскресенье
@week[][day;in;f;hit;d_attr]
^calendar_month.menu{
	<week>
	^for[i](0;6){
		$day($calendar_month.$i)
# формирование атрибута дня
		^switch($day){
			^case(0){
				$d_attr[]
			}
			^case(1;2;3;4;5;6;7;8;9){
				$d_attr[d="0${day}"]
			}
			^case[DEFAULT]{
				$d_attr[d="$day"]
			}
		}
# формирование атрибута текущего дня
		^if(
			$date_now.day == $day &&
			$date_now.month == $date.month &&
			$date_now.year == $date.year
		){
			$in[in="1"]
		}{
			$in[]
		}
# формирование атрибута нахождения в данном дне
		^if($day == $date.day){
			$hit[hit="1"]
		}{
			$hit[]
		}
# формирование атрибута наличия материалов за день
		^if($days_of_files.$day){
			$f[f="1"]
		}{
			$f[]
		}
		<day $d_attr $in $f $hit/>
	}
	</week>
}
производный класс:
#######
# Вызывать так: формировать объект конструктором init
# $object[^calendar_ru::init[$date;$days_of_files]]
# далее получаем XML календаря ^object.xml[]
@CLASS
calendar_ru

#######
@USE
calendar.p

#######
@BASE
calendar

#######
@init[date;days_of_files]
^calendar:init[$date;$days_of_files]

#######
# Метод, в котором определяются специфические для разных языков
# параметры календаря
@i18n[][m;y]
# the hash of local calendar (month and day names)
$calendar_locale[ 
	$.month_names[ 
		$.1[Январь]
		$.2[Февраль]
		$.3[Март]
		$.4[Апрель]
		$.5[Май]
		$.6[Июнь]
		$.7[Июль]
		$.8[Август]
		$.9[Сентябрь]
		$.10[Октябрь]
		$.11[Ноябрь]
		$.12[Декабрь]
	]
	$.day_names[
		$.0[Пн]
		$.1[Вт]
		$.2[Ср]
		$.3[Чт]
		$.4[Пт]
		$.5[Сб]
		$.6[Вс]
	]
]
$m($date.month)
$y($date.year)
$month[$calendar_locale.month_names.$m]
$calendar_month[^date:calendar[rus]($y;$m)]
при работе возникает ошибка:
(void) not a method or junction, can not call it
menu

d:/apache/htdocs/classes/calendar.p(95)
95-я строка (это первая строка метода @week[] базового класса) начинается с ^calendar_month.menu{
т.е. из метода нельзя обратиться к полю $calendar_month которое по идее должно быть у объекта, поскольку конструктор объекта вызывает тот метод, в котором это поле определяется.