Вывод разных thanks_tpl в зависимости от времени суток

Всем привет, ранее подобной задачи никогда не стояло, ничего путного не нашёл. Можно ли в modx evo выводить чанк об успешной отправке в eform, разный в зависимости от времени суток? Сработает ли данное решение через if, сталкивался ли кто то с подобной задачей, поддаётся ли сравнению время не в unixtime формате и не будет ли проблемы с часовым поясами? Делал ли кто то подобное, и возможно ли такое вообще в теории?

10 комментариев

avatar
Написать сниппет-обертку, в котором менять шаблон.
avatar
Или можно попробовать обрабатывать скриптом типа

<script type = "text/javascript">
var date = new Date();
var hour = date.getHours();
if (hour >= 22 || hour <= 7)
 document.write("Текст 1"); /* Этот текст будет выводится в промежутке с 22 часов вечера до 7 утра */
else
 document.write("Текст 2"); /* А этот, будет выводится в другое время */
</script>
Комментарий отредактирован 2019-05-31 09:44:35 пользователем tmih
avatar
А вот этот скрипт как раз и запихнуть в сниппет. В сниппет можно будет передавать чанки (шаблоны thanks_tpl для разного времени суток), другие параметры.

А «выстреливать» скриптик при помощи regClientScript.
avatar
Спасибо за подсказку, вот что у меня получилось, осталась одна проблема, не могу найти как передать переменные дня и часа из скрипта в мои переменные сниппета $day и $time

<?php
/*График работы
 Пн-пт 10-20(1-5)
 Сб 11-17(6)
 Вс выходной(0) 
 */	
	
	$day;
	$time ;
	$work_days= array(1,2,3,4,5);
	$sat = 6;
	$sun = 0;
	$work_time = array(10,11,12,13,14,15,16,17,18,19,20);
	$work_time_sat = array(11,12,13,14,15,16,17);
	$thanks_word_worktime ;
	$thanks_word_endwork ;

	

	$src = "<script type='text/javascript'>  
				var now = new Date();
				var day_w = now.getDay();
				var hour_w = now.getHours();
			</script>"; 


$modx->regClientScript($src,true);

if(in_array($day,$work_days) && in_array($time,$work_time) || $day==$sat && in_array($time,$work_time_sat)){
	echo 	$thanks_word_worktime . $day . $time;
}	
else{
	echo $thanks_word_endwork . $day . $time;
}
avatar
Возможно немного поторопился и не понял что эти значения так просто передать невозможно, вместо этого подтянул переменные вариантов текста из php, а параметры и сам сниппет буду вызывать в чанке успешной отправки.

<?php
/*График работы
 Пн-пт 10-20(1-5)
 Сб 11-17(6)
 Вс выходной(0) 
 */	
	$thanks_word_worktime ;
	$thanks_word_endwork ;

	

	$src = "<script type='text/javascript'>  
				var work_days = [1,2,3,4,5];
				var sat = 6;
				var work_time = [10,11,12,13,14,15,16,17,18,19,20];
				var work_time_sat = [11,12,13,14,15,16,17];
				var now = new Date();
				var day_w = now.getDay();
				var hour_w = now.getHours();
				var el = document.getElementById('thanks_text');
				function in_array(value, array) {
					for(var i=0; i<array.length; i++){
						if(value == array[i]) return true;
					}
					return false;
				}
				if (in_array(day_w, work_days) && in_array(hour_w, work_time) || day_w == sat && in_array(hour_w, work_time_sat))  {
				  el.textContent = '$thanks_word_worktime';
				} else {
				  el.textContent = '$thanks_word_endwork';
				}
				
			</script>"; 


$modx->regClientScript($src,true);
avatar
И еще дополню убрал из массива рабочих часов последнее значение. Чтобы условие выполнялось корректно.
avatar
Про еФорм не помню. 100 лет уже не пользовал. А если взять просто сниппет, то и передавать ничего никуда не надо. Говнокод рулезз ))

<?php
/*
thanks

Вызов:
[[thanks? &textWork=`Мы работаем!` &textFree=`Мы отдыхаем!` &workStartHour=`8` &workEndHour=`23`]]
*/

$src = '<script type="text/javascript">
	var date = new Date();
	var hour = date.getHours();
	
	console.log("Сейчас у клиента " + hour + " ч");
	
	if (hour >= ' . $workStartHour . ' && hour <= ' . $workEndHour . ')
	 console.log("' . $textWork . '"); /* Этот текст будет выводиться в рабочее время  */
	else
	 console.log("' . $textFree . '"); /* А этот, будет выводится в другое время */
</script>';

$modx->regClientScript($src,true);


Но: здесь учитывается только время на клиенте. Проблема часовых поясов здесь не затронута.
avatar
Ну и понятное дело, что вместо console.log вы там своё вставите.
avatar
А, теперь только прочитал — вы это уже сделали: «подтянул переменные вариантов текста из php».

Осталось только получить время вызова сниппета по вашему серверному времени. Но вы вроде уже выкрутились: «сам сниппет буду вызывать в чанке успешной отправки».
avatar
В общем с js не прокатило, потому что форма использует ajax, но решение нашел. Ужасно костыльное, тем не менее работает.
У eform есть стандартная библиотека thanks_tpl`ов на разных языках, залез я в русский и нашел ответ при успешной отправке по умолчанию. В самое начало файлика этого словаря вставил мой код, но теперь не js а php.

$start_day;//день начала рабочей недели
$end_day;//день окончания рабочей недели
$starttime_b;//час с которого начинается рабочее время в будни
$endtime_b;//последний рабочий час (если работаем до 17 часов то тут ставим 16)
$starttime_s ;//час с которого начинается рабочее время в субботу
$endtime_s ;//последний рабочий час (тот же принцип как endtime_b)
$sat = 6;//это суббота
$holidays;//сообщение в нерабочее время
$work_time;//сообщение в рабочее время
$day_w = date("w",time ());//получаем день недели через php
$hour_w = date("H",time ());//получаем текущий час
if($holidays_time == 1){//holidays_time берется из тв чекбокса который включает режим "праздников"
        $thanks_message = $holidays;//если праздники активны выводим для нерабочего
}
else{//если праздники неактивны выполняем проверку по условию
        if ($day_w >= $start_day && $day_w <= $end_day  && $hour_w >= $starttime_b && $hour_w <= $endtime_b || $day_w == $sat && $hour_w >= $starttime_s && $hour_w <= $endtime_s )  {
                                          $thanks_message = $work_time;
                                        } else {
                                          $thanks_message = $holidays;
                                        }
}  


потом заменил в этом же файлике стандартное сообщение на

"<div  class='t-input-title t-descr t-descr_md' >$thanks_message</div>"

после чего вызываю eform уже вот так

[!eForm?
	&formid=`testform`
	&tpl=`forma_zakaz_zvonka`
	&report=`otchet_zakaz_zvonka`	
	&to=`[*email*]`
	&subject=`Заказ звонка с сайта [(site_name)]`
	&start_day=`1`
	&end_day=`5`
	&starttime_b=`[*starttime_b*]`
	&endtime_b=`[*endtime_b*]`
	&starttime_s=`[*starttime_s*]`
	&endtime_s=`[*endtime_s*]` 
	&holidays=`[*thanks_word_sat*]`
	&work_time=`[*thanks_word*]`
	&holidays_time=`[*holidays*]`

!]	

В итоге клиент теперь может из панели админа задавать рабочее время, включать/отключать режим «праздников», и выводить тот текст, какой нужно.
Комментарий отредактирован 2019-06-19 23:14:46 пользователем Teaserwil
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.