Приветствую всех. Пытаюсь переделать (точнее, выкинул) календарь на новостном небольшом сайте, ибо дюже грузит сервер; на локальном сервере даже иногда загрузка прекращается за истечением времени. Календарь используется глав. редактором для выбора дней, когда на сайте постилась новость на передовице. Решил взять простой (как мне показалось) календарь на jquery-ui datepicker, но я с жабоскриптом не дружу, и вообще занимаюсь описанным выше вынужденно, и не по профессии, так уж вышло. Собственно, задача стоит именно как-то добавить в дейтпикер обращение к БД и "вкукоживание" ссылки. Помогите разобраться. datepicker-ru.js: Код (Javascript): /* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ /* Written by Andrew Stromnov (stromnov@gmail.com). */ ( function( factory ) { if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define( [ "../scripts/datepicker" ], factory ); } else { // Browser globals factory( jQuery.datepicker ); } }( function( datepicker ) { datepicker.regional.ru = { closeText: "Закрыть", prevText: "<Пред", nextText: "След>", currentText: "Сегодня", monthNames: [ "Январь","Февраль","Март","Апрель","Май","Июнь", "Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" ], monthNamesShort: [ "Янв","Фев","Мар","Апр","Май","Июн", "Июл","Авг","Сен","Окт","Ноя","Дек" ], dayNames: [ "воскресенье","понедельник","вторник","среда","четверг","пятница","суббота" ], dayNamesShort: [ "вск","пнд","втр","срд","чтв","птн","сбт" ], dayNamesMin: [ "Вс","Пн","Вт","Ср","Чт","Пт","Сб" ], weekHeader: "Нед", dateFormat: "dd.mm.yy", firstDay: 1, isRTL: false, showMonthAfterYear: false, yearSuffix: "" }; datepicker.setDefaults( datepicker.regional.ru ); return datepicker.regional.ru; } ) ); Старый тормозной календарь calendar.php: PHP: <?php function main_calendar($fill='') { global $rubric; global $tplEx, $phpEx, $template, $siteurl, $site_root, $now; global $db, $connection; $month_names=array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"); if (isset($_GET['y'])) $y=$_GET['y']; if (isset($_GET['m'])) $m=$_GET['m']; if (isset($_GET['date']) AND strstr($_GET['date'],"-")) list($y,$m,$d)=explode("-",$_GET['date']); if (!isset($y) OR $y < 1970 OR $y > 2037) $y=date("Y"); if (!isset($m) OR $m < 1 OR $m > 12) $m=date("m"); if (!isset($d) OR $d < 1 OR $d > 30) $d=date("d"); $month_stamp=mktime(0,0,0,$m,1,$y); $day_count=date("t",$month_stamp); $weekday=date("w",$month_stamp); if ($weekday==0) $weekday=7; $start=-($weekday-2); $last=($day_count+$weekday-1) % 7; if ($last==0) $end=$day_count; else $end=$day_count+7-$last; $prev=date('Y-m',mktime (0,0,0,$m-1,$d,$y)); $next=date('Y-m',mktime (0,0,0,$m+1,$d,$y)); $i=0; echo "<table class=\"calendar\">"; echo "<tr>"; echo "<td colspan=\"7\">"; echo "<table id=\"month-selector\">"; echo "<tr>"; echo "<td align=\"left\"><a href=\"/news/?date=",$prev,"\"><img src=\"/images/arrow-left.png\" alt=\"\"></a></td>"; echo "<td align=\"center\"><strong>",$month_names[$m-1]," ",$y,"</strong>","</td>"; echo "<td align=\"right\"><a href=\"/news/?date=",$next,"\"><img src=\"/images/arrow-right.png\" alt=\"\"></a></td>"; echo "</tr>"; echo "</table>"; echo "</td>"; echo "</tr>"; echo "<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td><span class=\"red\">Сб</span></td><td><span class=\"red\">Вс</span></td><tr>"; for($d=$start;$d<=$end;$d++) { if(!($i++%7)) echo "<tr>"; if ($d < 1 OR $d > $day_count) echo "<td class=\"day\">"," "; else{ $pubtime1=mktime(0,0,0,$m,$d,$y); $pubtime2=mktime(0,0,0,$m,$d+1,$y)-1; // $q_news = "SELECT * FROM news WHERE news.pubdate>='$pubtime1' AND news.pubdate<='$pubtime2'"; $q_news = "SELECT * FROM `" . ARTICLES_TABLE . "` WHERE date >= '" . $pubtime2 . "' AND date <= '" . $pubtime1 . "'"; if (!empty($rubric)) { $rubric = (int)$rubric; $q_news .= " AND FIND_IN_SET($rubric, rubrics) > 0"; } $r_news=$mysqli->query($q_news) or die("can't execute query news"); $n_news=$r_news->num_rows; $now="$y-$m-".sprintf("%02d",$d); $currentDay = date("d"); if(is_array($fill) AND in_array($now,$fill)) { echo "<td class=\"day-active\">"; } else if ($currentDay == $d) { echo "<td class=\"day\" style=\"background-color: #D8E9F7\">"; } else { echo "<td class=\"day\">"; } if($n_news>0) echo "<a href=\"/news/?date=",$now,"\" class=\"noline\">","<div style=\"padding:2pt 3pt;\">",$d,"</div>","</a>"; else echo "<div style=\"padding:2pt 3pt;\">",$d,"</div>"; } echo "</td>"; if(!($i%7)) echo "</tr>"; } echo "</table>"; } ?> <div style="width: 240px; margin: 0 auto 20px"> <h6 style="text-align: center">Архив</h6> <div> <?php main_calendar(array($_GET['date'])); ?> </div> </div> Собственно, из оригинального тормозного календаря, я хочу взять обращения к БД, но как их вкукожить в Javascript, не знаю. С уважением. ЗЫ Совсем забыл. Сейчас у меня календарь подключен так: HTML: <div style="width: 240px; margin: 0 auto 20px"> <h6 style="text-align: center">Архив</h6> <div> <label>Дата:</label><input type="text" id="datepicker" size="10" value="{NOW}"> </div> </div>
Добрый день! Календарь грузит сервер из-за того, что после каждого клика по ссылке страница полность перезагружается PHP: if($n_news>0) echo "<a href=\"/news/?date=",$now,"\" class=\"noline\">","<div style=\"padding:2pt 3pt;\">",$d,"</div>","</a>"; 1.Сама функция main_calendar судя по mktime немолодая. Её можно улучшить, но если она работает как надо, то можно переделать только ссылку PHP: if($n_news>0) echo "<div class=\"noline\" role=\"link\" onClick=\"reloadCalender('$now')\" style=\"padding:2pt 3pt;\">",$d,"</div>"; 2. Hеобходимо добавить id в div PHP: <div id="calender-container"> <?php main_calendar(array($_GET['date'])); ?> </div> 3. Нужно добавить JS функцию reloadCalender, которая должна отправлять AJAX Get-Request и получив HTML Response актуализировать контен в div id="calender-container" без перезагрузки страницы Если интересует, могу показать как это сделать. Удачи! P.S. Не понято откуда берутся $_GET['y'] и $_GET['m'] в функции main_calendar
Видимо, сам календарь спрашивает, когда жмёшь стрелку. Спасибо, испытал, работает лучше. Да, интересует.
Ну, и чтоб два раза не вставать, как говорится. Вопрос есть - ни у кого случайно нету файла поддержки mysqli для phpBB2? Очень надо. Это должно быть что-то типа mysqli.php
За один заход не получится т.к. не могу протестироать код. Предлагаю сделать следущее: 1. Добавить несколько CSS директив Код (CSS): .calendar img{cursor:pointer} .bg{background-color: #D8E9F7} .day div{padding:2pt 3pt} 2. Изменить функцию main_calendar, убрав из неё echo и вернув HTML string PHP: function main_calendar($fill='') { global $rubric; global $tplEx, $phpEx, $template, $siteurl, $site_root, $now; global $db, $connection; $month_names=array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"); if (isset($_GET['y'])) $y=$_GET['y']; if (isset($_GET['m'])) $m=$_GET['m']; if (isset($_GET['date']) AND strstr($_GET['date'],"-")) list($y,$m,$d)=explode("-",$_GET['date']); if (!isset($y) OR $y < 1970 OR $y > 2037) $y=date("Y"); if (!isset($m) OR $m < 1 OR $m > 12) $m=date("m"); if (!isset($d) OR $d < 1 OR $d > 30) $d=date("d"); $month_stamp=mktime(0,0,0,$m,1,$y); $day_count=date("t",$month_stamp); $weekday=date("w",$month_stamp); if ($weekday==0) $weekday=7; $start=-($weekday-2); $last=($day_count+$weekday-1) % 7; if ($last==0) $end=$day_count; else $end=$day_count+7-$last; $prev=date('Y-m',mktime (0,0,0,$m-1,$d,$y)); $next=date('Y-m',mktime (0,0,0,$m+1,$d,$y)); $i=0; $calenderHTML = <<<HTML <table class="calendar"> <tr> <td colspan="7"> <table id="month-selector"> <tr> <td align="left"> <img src="/images/arrow-left.png" onClick="reloadCalender('$prev')"> </td> <td align="center"> <strong>{$month_names[$m-1]} $y</strong>, </td> <td align="right"> <img src="/images/arrow-right.png" onClick="reloadCalender('$next')" > </td> </tr> </table> </td> </tr> <tr> <td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td> <td><span class="red">Сб</span></td> <td><span class="red">Вс</span></td> <tr> HTML; for($d=$start;$d<=$end;$d++) { if(!($i++%7)) echo "<tr>"; if ($d < 1 OR $d > $day_count) echo "<td class=\"day\">"," "; else{ $pubtime1=mktime(0,0,0,$m,$d,$y); $pubtime2=mktime(0,0,0,$m,$d+1,$y)-1; // $q_news = "SELECT * FROM news WHERE news.pubdate>='$pubtime1' AND news.pubdate<='$pubtime2'"; $q_news = "SELECT * FROM `" . ARTICLES_TABLE . "` WHERE date >= '" . $pubtime2 . "' AND date <= '" . $pubtime1 . "'"; if (!empty($rubric)) { $rubric = (int)$rubric; $q_news .= " AND FIND_IN_SET($rubric, rubrics) > 0"; } $r_news=$mysqli->query($q_news) or die("can't execute query news"); $n_news=$r_news->num_rows; $now="$y-$m-".sprintf("%02d",$d); $currentDay = date("d"); if(is_array($fill) AND in_array($now,$fill)) { $calenderHTML .= "<td class=\"day-active\">"; } else if ($currentDay == $d) { $calenderHTML .= "<td class=\"day bg\" >"; } else { $calenderHTML .= "<td class=\"day\">"; } if($n_news>0) $calenderHTML .= "<div class=\"noline\" role=\"link\" onClick=\"reloadCalender('$now')\" >$d</div>"; else $calenderHTML .= "<div>$d</div>"; } $calenderHTML .= "</td>"; if(!($i%7)) $calenderHTML .= "</tr>"; } $calenderHTML .= "</table>"; return $calenderHTML; } 3.Изменить вызов функции PHP: <div id="calender-container"> <?php echo main_calendar(array($_GET['date'])); ?> </div> Необходимо это отладить и переходить к JS. Удачи!
Такой файл есть на "phpbb2 refugees", но они закрыли доступ из России. Если б я мог взять файл, я б по пустому не спрашивал. --- Добавлено --- Спасибо, буду дома, проверю и отпишусь.
Забейте. Также долго, также вымирает. Есть мнение, всё-таки, как-то в datepicker вкукожить ссылки, но только как. --- Добавлено --- Нифига себе! Спасибо, испытаю.
Добрый день! Какая версия PHP? Спойлер: Исправил функцию main_calendar Код (Text): function main_calendar($fill='') { global $rubric; global $tplEx, $phpEx, $template, $siteurl, $site_root, $now; global $db, $connection; $month_names=array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"); if (isset($_GET['y'])) $y=$_GET['y']; if (isset($_GET['m'])) $m=$_GET['m']; if (isset($_GET['date']) AND strstr($_GET['date'],"-")) list($y,$m,$d)=explode("-",$_GET['date']); if (!isset($y) OR $y < 1970 OR $y > 2037) $y=date("Y"); if (!isset($m) OR $m < 1 OR $m > 12) $m=date("m"); if (!isset($d) OR $d < 1 OR $d > 30) $d=date("d"); $month_stamp=mktime(0,0,0,$m,1,$y); $day_count=date("t",$month_stamp); $weekday=date("w",$month_stamp); if ($weekday==0) $weekday=7; $start=-($weekday-2); $last=($day_count+$weekday-1) % 7; if ($last==0) $end=$day_count; else $end=$day_count+7-$last; $prev=date('Y-m',mktime (0,0,0,$m-1,$d,$y)); $next=date('Y-m',mktime (0,0,0,$m+1,$d,$y)); $i=0; $month_name = $month_names[$m-1]; $calenderHTML = <<<HTML <table class="calendar"> <tr> <td colspan="7"> <table id="month-selector"> <tr> <td align="left"> <img src="/images/arrow-left.png" onClick="reloadCalender('$prev')"> </td> <td align="center"> <strong>$month_name $y</strong> </td> <td align="right"> <img src="/images/arrow-right.png" onClick="reloadCalender('$next')" > </td> </tr> </table> </td> </tr> <tr> <td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td> <td><span class="red">Сб</span></td> <td><span class="red">Вс</span></td> <tr> HTML; for($d=$start;$d<=$end;$d++) { if(!($i++%7)) echo "<tr>"; if ($d < 1 OR $d > $day_count) echo "<td class=\"day\">"," "; else{ $pubtime1=mktime(0,0,0,$m,$d,$y); $pubtime2=mktime(0,0,0,$m,$d+1,$y)-1; // $q_news = "SELECT * FROM news WHERE news.pubdate>='$pubtime1' AND news.pubdate<='$pubtime2'"; $q_news = "SELECT * FROM `" . ARTICLES_TABLE . "` WHERE date >= '" . $pubtime2 . "' AND date <= '" . $pubtime1 . "'"; if (!empty($rubric)) { $rubric = (int)$rubric; $q_news .= " AND FIND_IN_SET($rubric, rubrics) > 0"; } $r_news=$mysqli->query($q_news) or die("can't execute query news"); $n_news=$r_news->num_rows; $now="$y-$m-".sprintf("%02d",$d); $currentDay = date("d"); if(is_array($fill) AND in_array($now,$fill)) { $calenderHTML .= "<td class=\"day-active\">"; } else if ($currentDay == $d) { $calenderHTML .= "<td class=\"day bg\" >"; } else { $calenderHTML .= "<td class=\"day\">"; } if($n_news>0) $calenderHTML .= "<div class=\"noline\" role=\"link\" onClick=\"reloadCalender('$now')\" >$d</div>"; else $calenderHTML .= "<div>$d</div>"; } $calenderHTML .= "</td>"; if(!($i%7)) $calenderHTML .= "</tr>"; } $calenderHTML .= "</table>"; return $calenderHTML; } Вы не поняли, для ускорения д.б.изменён PHP код, в который встроен календарь и подключена JS reloadCalender. PHP: <? /* здесь должно быть обязательно подключение к БД м.б любой PHP код, но не должно быть echo и HTML */ // здесь д.б. Подключена функция main_calendar if(filter_input(INPUT_GET, 'date')){ echo main_calendar(); // не надо указывать $_GET как параметр - superglobal variables exit; } ?> ... ... <div id="calender-container"> <?php echo main_calendar(); ?> </div> ... </body> <script> calenderContainer = document.getElementById("calender-container"); function reloadCalender(date){ const req = new XMLHttpRequest(); req.addEventListener("load", function(){ calenderContainer.innerHTML = this.responseText; }); req.open("GET", "/news/?date=" + date); req.send(); } </script> Если нужно ещё в datepicker вкукожить ссылки, то их нужно обрабатывать аналогично. Удачи!
Это версия выдала ошибку на {$month_names[$m-1]} в строке. Я исправил функцию main_calendar и убрал это, но рекомендую Вам перейти на актуальную версию PHP
Добрый вечер! В общем, так... От календаря я отказался совсем. Он нужен был редакторам, чтобы статьи отслеживать. Вместо него я написал другой функционал, но уже в админку, а не на главную страницу: теперь там файлик articles.php, позволяющий управлять статьями новостей полностью - находить, править, также добавил функционала, который просили давно - а именно, добавил систему премодерации и блокировки. Вроде все довольны. Без календаря, главная страница летает, но пока на тестовом сервере. Допилю шаблоны, и закину на основной сервер. По версии. Как оказалось, на сервере версия актуальная, но код сайта в целом отсталый, да (например, найдены куски уворованного автором кода, со ссылкой на сайт, отключённый ещё в 2011-м, это уже мною исправлено). Поэтому стоит костыль через композер, понижающий требования к версии. Через него тоже тормоза, не без этого. Отключать тот костыль и переходить на акутальную версию я пока не могу ввиду того, что я и сам малость отстаю в уровне, увы ПХП это не моё основное занятие, я автоэлектрик, и кодю вынужденно. Также, переписал полностью немного разного - например, исправил некоторые обращения к БД, так как криво и косо было, и тоже глючно. Например, новости на одни только передовицу и слайдер грузились через восемь зацикленных обращений к БД - каждый раз за одной мелочью, но с загрузкой целой строки таблицы, и не одной местами. Исправил на адресные конкретные запросы, один запрос вне цикла и по одному в цикле - итого, три. Стало быстрее. Посему, тему с календарём можно считать исчерпанной. Но вам спасибо большое - я не мог решиться, но решился и переписал кучу всего сам
Возвращаясь к теме. Я сумел-таки влезть на phpBB3refugees, и слил mysqli.php для phpBB2 - если кому надо, могу сюда закинуть.
Я и это исправил. Надо было лишь немного осознать, что именно мне надо. У меня на Главную вызываются: 1) 6 новостей на слайдер 2) 10 новостей на передовицу 3) 10 прочих новостей 4) 4 рекл. блока. Теперь это всё вне циклов и двумя запросами - первый на новости, второй на рекл. блоки.