Select Boxes [function]

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
velo
phpBB 2.0.1
Сообщения: 252
Стаж: 19 лет
Благодарил (а): 10 раз
Поблагодарили: 26 раз

Select Boxes [function]

Сообщение velo »

Достаточно часто при создании каких либо модификаций, мне приходилось создавать выпадающие селекты для дат и времени. Приходилось каждый раз создавать эти селекты, и поэтому я решил написать функцию, которая создаёт их, и собственно делюсь ею, может кому то пригодится:

OPEN includes/function.php
FIND BEFORE ADD

Код: Выделить всё

// Use function create_selectbox:
//	create_selectbox ($sel_name, $finish_year, [$input_date], [$separator], [$class], [$minute_interv], [$isnow], [$isyear], [$ismonth], [$isday], [$ishour], [$isminute]);
// 
// Variables:
// 	$sel_name (string) name && id select box . No default (requered)
// 	$finish_year (string) finish of dropdown year . No default (requered)
//	$input_date (int) input date for select selected. Default = 0 i.e. not selected
//	$separator (string) usefull separator between select boxes. Default = ' '
//    $class (string) class of select boxes. Default = ' '
//	$minute_interv (int) interval of minute drop. Default = 5
// 	$isnow (bool) using start date = time now ? Default - false
//	$isyear (bool) using select year? Default - true
// 	$ismonth (bool) using select month? Default - true
//	$isday (bool) using select day? Default - true
//	$ishour (bool) using select hour? Default - true
//	$isminute  (bool) using select minute? Default - true
// 

function create_selectbox ($sel_name, $finish_year, $input_date = 0, $separator = ' ', $class= '', $minute_interv = 5, $isnow = false, $isyear = true, $ismonth = true, $isday = true, $ishour = true, $isminute = true)
{

	global $user, $template; 
	
	$class = ($class != '') ? 'class="' . $class . '"' : '';
	// Day
	if ($isday == true)
	{
		$s_day = '<select name="' . $sel_name . '_day" id=="' . $sel_name . '_day" ' . $class . '><option value="">' . $user->lang['SELECT_DAY'] . '</option>';
		for ( $i = 1; $i <= 31; $i++ )
		{
			$null = ( $i < 10 ) ? '0' : '';
			$s_day .= '<option value="'.$null.$i.'">'.$i.'</option>';
		}
		$s_day .= '</select>';
	
		$sday 	= ($input_date > 0) ? $user->format_date($input_date,'d') : ( ($isnow == true)? $user->format_date(time(),'d') : request_var($sel_name . '_day', ''));
		$s_day = str_replace('value="'.$sday.'">', 'value="'.$sday.'" selected="selected">', $s_day);
	}
	
	// Month
	if ($ismonth == true)
	{
		$month_name = array ('', $user->lang['datetime']['January'], $user->lang['datetime']['February'], $user->lang['datetime']['March'], $user->lang['datetime']['April'], $user->lang['datetime']['May'], $user->lang['datetime']['June'], $user->lang['datetime']['July'], $user->lang['datetime']['August'], $user->lang['datetime']['September'], $user->lang['datetime']['October'], $user->lang['datetime']['November'], $user->lang['datetime']['December']);
		
		$s_month = '<select name="' . $sel_name . '_month" id="' . $sel_name . '_month" ' . $class . '><option value="">' . $user->lang['SELECT_MONTH'] . '</option>';
		for ( $i = 1; $i <= 12; $i++ )
		{
			$null = ( $i < 10 ) ? '0' : '';
			$s_month .= '<option value="'.$null.$i.'">'.$month_name[$i].'</option>';
		}
		$s_month .= '</select>';
	
		$smonth = ($input_date > 0) ? $user->format_date($input_date,'m') : ( ($isnow == true)? $user->format_date(time(),'m') : request_var($sel_name . '_month', ''));
		$s_month = str_replace('value="'.$smonth.'">', 'value="'.$smonth.'" selected="selected">', $s_month);
	}
	
	// Year
	if ($isyear == true)
	{
		$s_year = '<select name="' . $sel_name . '_year" id="' . $sel_name . '_year"  ' . $class . '><option value="">' . $user->lang['SELECT_YEAR'] . '</option>';
		$actual_year = $user->format_date(time(),'Y');
		for ( $i = $actual_year; $i <= (int)$finish_year; $i++)
		{
			$s_year .= '<option value="'. $i.'">' . $i .'</option>';
		}
		$s_year .= '</select>';
		
		$syear 	= ($input_date > 0) ? $user->format_date($input_date,'Y') : (($isnow == true)? $user->format_date(time(),'Y') : request_var($sel_name . '_year', ''));
		$s_year = str_replace('value="'.$syear.'">', 'value="'.$syear.'" selected="selected">', $s_year);
	
	}
	
	// Hour
	if ($ishour == true)
	{
		$s_hour = '<select name="' . $sel_name . '_hour" id="' . $sel_name . '_hour"  ' . $class . '><option value="">' . $user->lang['SELECT_HOUR'] . ' </option>';
		for ( $i = 0; $i < 24; $i++ )
		{
			$null = ( $i < 10 ) ? '0' : '';
			$s_hour .= '<option value="'.$null.$i.'">'.$null.$i.'</option>';
		}
		$s_hour .= '</select>';
		$shour 	= ($input_date > 0) ? $user->format_date($input_date,'H') : (($isnow == true)? $user->format_date(time(),'H') : request_var($sel_name . '_hour', ''));
		$s_hour = str_replace('value="'.$shour.'">', 'value="'.$shour.'" selected="selected">', $s_hour);
	}
	
	//Minute
	if ($isminute == true)
	{
		$s_minute = '<select name="' . $sel_name . '_minute" id="' . $sel_name . '_minute" ' . $class . '><option value="">' . $user->lang['SELECT_MINUTE'] . '</option>';
		$minute_interv = ($minute_interv < 1)? 1 : (($minute_interv > 60) ? 60 : $minute_interv);
		for ( $i = 0; $i < 60; $i=$i+$minute_interv)
		{
			
			$null = ( $i < 10 ) ? '0' : '';
			$s_minute .= '<option value="'.$null.$i.'">'.$null.$i.'</option>';
		}
		$s_minute .= '</select>';
		
		$sminute 	= ($input_date > 0) ? floor($user->format_date($input_date,'i') / $minute_interv) * $minute_interv : (($isnow == true)? floor($user->format_date(time(),'i') / $minute_interv) * $minute_interv : request_var($sel_name . '_minute', ''));
		$s_minute = str_replace('value="'.$sminute.'">', 'value="'.$sminute.'" selected="selected">', $s_minute);
	}
	
	$template->assign_vars(array(
		'S_' . strtoupper($sel_name) . '_SELECT' 	=> $s_day . $separator . $s_month .  $separator . $s_year .  $separator . $s_hour . $separator . $s_minute,
	));
	
}
OPEN language/ru/common.php
FIND BEFORE ADD

Код: Выделить всё

$lang = array_merge($lang, array(
		'SELECT_MONTH'		=> 'Месяц',
		'SELECT_YEAR' 		=> 'Год',
		'SELECT_DAY' 		=> 'День',
		'SELECT_HOUR' 		=> 'ЧЧ',
		'SELECT_MINUTE' 	=> 'ММ',
));
Подсказка по использованию написана перед функцией.
Использование по русски:
Добавляете в нужном месте скрипта вызов функции

Код: Выделить всё

create_selectbox ($sel_name, $finish_year, [$input_date], [$separator], [$class], [$minute_interv], [$isnow], [$isyear], [$ismonth], [$isday], [$ishour], [$isminute]);
где обязательные только первые два параметра, остальные опционально:

$sel_name (string) префикс Имени(name) и ID селектбокса (необходим)
$finish_year (string) Последний год в выпадающем списке (необходим)
$input_date (int) Дата в UNIX формате для выбора селектов при выводе (selected). По умолчанию = 0, т.е. не выбрано.
$separator (string) Сепаратор между боксами, для отображения, по умолчанию = '&nbsp;'
$class (string) Класс для селектбоксов, по умолчанию = '' (нет специального класса)
$minute_interv (int) Интервал между минутами в выпадающем списке. По умолчанию = 5
$isnow (bool) Использовать текущую дату для селектов ? По умолчанию = false
$isyear (bool) Использовать год? По умолчанию - true
$ismonth (bool) Использовать месяц? По умолчанию - true
$isday (bool) Использовать день? По умолчанию - true
$ishour (bool) Использовать часы? По умолчанию - true
$isminute (bool) Использовать минуты? По умолчанию - true

Пример использования:

1. в скрипте вызываю функцию: create_selectbox ('sk', 2012);
2. в шаблоне, в месте, где необходимо отобразить: {S_SK_SELECT} , где SK - первый аргумент функции Загл.буквами.
3. Получаю на выходе (с последним годом 2012):
selbox.jpg

2010-12-17 - Version 1.0.1
Add Variable form name for check fields onsubmit form
Add Create output UTC hidden field for send form

2010-12-22 - Version 1.0.2
Add subsulver2 install
FIX return value (add coockies for value)
FIX dont geate UTC hidden field if not full selectboxes use
Add change select box js file into ACP


Версия 1.0.1
Добавлено:
1. Переменная $form_ - для проверки полей формы с этим именем перед отправкой (onsubmit добавляется в форму посредством js)
2. Hidden field с указанным именем, для отправки значений дат в формате UTC (автозаполнение посредством js)

Версия 1.0.2
1. Добавлена инструкция для subsulver2
2. FIX обнуление значений при возврате формы (посредством coockies)
3. FIX отменено создание hidden со значением UTC, если задано, что функция не создает какой либо из селектов Даты Месяца или Года.
4. В АСР в overall_header добавлен вызов скрипта js, что позволяет использовать ф-цию в АСР
Select_Boxes_Function_1_0_2.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось velo 22.12.2010 3:18, всего редактировалось 1 раз.
WORK: phpBB3 3.0.8 + Portal XL 5.0 + MODs + Custom,
PHP Version 5.3.3-7+squeeze25, Apache/2.2.9 (Debian), MySQL(i) 5.1.73-1+deb6u1-log
Аватара пользователя
FladeX
Former team member
Сообщения: 1935
Стаж: 19 лет 3 месяца
Откуда: Саранск
Благодарил (а): 7 раз
Поблагодарили: 59 раз

Re: Select Boxes [function]

Сообщение FladeX »

Я при разработке некоторых модов сталкивался с проблемой - а как же, собственно, правильно оформить выбор даты, ведь в phpBB по умолчанию такого функционала нет, а значит и в качестве примера нечего использовать. Так что мод полезный, спасибо. Теперь оформляйте, если время есть, и на phpBB.com на валидацию ;)
//
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы
velo
phpBB 2.0.1
Сообщения: 252
Стаж: 19 лет
Благодарил (а): 10 раз
Поблагодарили: 26 раз

Re: Select Boxes [function]

Сообщение velo »

Хочется доработать сначала.
Например, при ошибке формы, если вернуться к форме, сейчас введёные поля сбрасываются.
Можно использовать Hidden, который в версии 1.0.1 введён, но нужно "допилить" до нормального состояния.
Сейчас дописываю Мод по проверке IP при голосовании и снятии блокировки с уже проголосовавших АйПи (на основе вот этого поста: Мод для голосовалки ) , вот на нём отработаю эту функцию, и тогда на оф.сайт наверно. А пока ИМХО рано.
WORK: phpBB3 3.0.8 + Portal XL 5.0 + MODs + Custom,
PHP Version 5.3.3-7+squeeze25, Apache/2.2.9 (Debian), MySQL(i) 5.1.73-1+deb6u1-log
Аватара пользователя
FladeX
Former team member
Сообщения: 1935
Стаж: 19 лет 3 месяца
Откуда: Саранск
Благодарил (а): 7 раз
Поблагодарили: 59 раз

Re: Select Boxes [function]

Сообщение FladeX »

Пока будете исправлять, как раз mod team успеет посмотреть и выскажет первую порцию своих замечаний. Сэкономите две недели :)
//
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы
velo
phpBB 2.0.1
Сообщения: 252
Стаж: 19 лет
Благодарил (а): 10 раз
Поблагодарили: 26 раз

Re: Select Boxes [function]

Сообщение velo »

Пока что, для того, чтобы при возврате к форме, не сбрасывались значения полей, нашёл решение, с использованием Кук.
Как это происходит:
1. проверяю, заполнены ли основные поля (ДД ММ ГГ), если они все не = 0, то формирую скрытое поле cо значение даты в UTC,
2. одновременно прописываю это значение в куку для данного селектбокса
3. при возврате (ошибка заполнения формы) на страницу с формой, проверяю, если нет выбраных селектов, то устанавливаю в скрытое поле значение из куки.

(всё это можно гораздо проще сделать, передавая это значение через POST/GET , но я стремлюсь сделать универсальную функцию, которая не потребует дополнительных строк кода в скриптах, где она применяется, т.е. чтобы всё что необходимо со стороны сервера было только в самой функции).
Опять же, можно найти решение с использованием библиотеки, например JQuery, но я хочу сделать так, чтобы те, кто не хочет загружать форум лишними библиотеками, могли также пользоваться этой функцией, поэтому использую чистый js.

Всё работает, значения не сбрасываются, но есть один минус - Для куки устанавливаю срок жизни 5 минут, и если за эти 5 минут открыть такую же (но другую) форму, с тем же Id селектбокса, то значение возьмётся из этой куки, а форма, например может быть уже для другого пользователя.

Может у кого нибудь есть мысль - как можно определить оригинальность этой формы, не затрагивая скриптов, куда эта форма передаётся (т.е. там где проверяется и отправляется)?
WORK: phpBB3 3.0.8 + Portal XL 5.0 + MODs + Custom,
PHP Version 5.3.3-7+squeeze25, Apache/2.2.9 (Debian), MySQL(i) 5.1.73-1+deb6u1-log

Вернуться в «Для авторов (phpBB 3.0.x)»