Для создания данного календаря необходимо сделать следующее:
1. Создаете шаблон страниц с названием "Шаблон для календаря". Код шаблона:
<?php
$kernel->show_current_page();
?>
2. Создаете макет страниц с названием "Макет для календаря". Код макета:
<?php
$kernel->show_current_template();
?>
3. Создаете узел структуры. В выпадающем списке "Шаблон страницы" выбираете "Шаблон для календаря", для параметра "Тип раздела" выбираете "Динамическая страница.", в выпадающем списке "Макет" выбираете "Макет для календаря". В поле "Динамическая страница" вставляете код (
ОБРАТИТЕ ВНИМАНИЕ, В КОДЕ ЗАПРОСА $query = "SELECT information_items_id, information_items_date FROM information_items_table WHERE information_systems_id = 5 AND information_items_date LIKE '" . $year_cal . "-" . $month_cal . "-%'";
ВМЕСТО 5 ИСПОЛЬЗУЙТЕ КОД ТОЙ ИНФОРМАЦИОННОЙ СИСТЕМЫ, ДЛЯ ИНФОРМАЦИОННЫХ ЭЛЕМЕНТОВ КОТОРОЙ ОТОБРАЖАЕТСЯ КАЛЕНДАРЬ. Также в строке$path_cal = !empty($path_cal) ? '<a href="/articles/?day=' . $day_cal . '&month=' . $month_cal. '&year=' . $year_cal . '">'.$i.'</a>' : $i;
вместо /articles/ вставьте путь к узлу структуры, с которым связана информационная система, для элементов которой отображается календарь):
<?
if (!defined('ALLOW_PANEL'))
{
define('ALLOW_PANEL', false);
}
function conv($str)
{
return $str;
//return iconv('Windows-1251', 'UTF-8', $str);
}
ob_start("conv");
$month_cal = !empty($_REQUEST['month']) ? $_REQUEST['month'] : date("m");
$month_cal = strlen($month_cal) == 1 ? '0'.$month_cal : $month_cal;
$year_cal = !empty($_REQUEST['year']) ? $_REQUEST['year'] : date("Y");
$day_to_month_cal = date("t", mktime(0, 0, 0, $month_cal, 01, $year_cal));
$primary_day_to_month_cal = date("w", mktime(0, 0, 0, $month_cal, 01, $year_cal));
?>
<!-- Формитуем выпадаюшие списки месяца и года -->
<select id="calendar_month" onchange="javascript:renewCalendar();">
<?
// массив месяцев
$months_arr = array(1 => 'январь', 2 => 'февраль', 3 => 'март', 4 => 'апрель', 5 => 'май', 6 => 'июнь', 7 => 'июль', 8 => 'август', 9 => 'сентябрь', 10 => 'октябрь', 11 => 'ноябрь', 12 => 'декабрь');
foreach ($months_arr as $key => $value)
{
?>
<option value="<?=$key?>" <?=($key == $month_cal) ? 'selected="selected"' : ''?>> <?=$value?> </option>
<?
}
?>
</select>
<select id="calendar_year" onchange="javascript:renewCalendar();">
<?
for ($i = date("Y"); $i >= 2000; $i--)
{
?>
<option value="<?=$i?>" <?=($i == $year_cal) ? 'selected="selected"' : ''?>> <?=$i?> </option>
<?
}
?>
</select>
<?
$query = "SELECT information_items_id, information_items_date FROM information_items_table WHERE information_systems_id = 5 AND information_items_date LIKE '" . $year_cal . "-" . $month_cal . "-%'";
$DataBase = & singleton('DataBase');
$result = $DataBase->select($query);
$data_cal = array();
// формируем массив данных для календаря
while ($row = mysql_fetch_assoc($result))
{
$explode = explode(' ',$row['information_items_date']);
$explode = explode('-', $explode[0]);
$data_cal[$row['information_items_id']] = $explode[2];
}
?>
<table>
<tr>
<th>Пн</th>
<th>Вт</th>
<th>Ср</th>
<th>Чт</th>
<th>Пт</th>
<th>Сб</th>
<th><span>Вс</span></th>
</tr>
<?
// если первый день воскрессенье, то устанавливаем значение $primary_day_to_month_cal в 7
if ($primary_day_to_month_cal == 0)
{
$primary_day_to_month_cal = 7;
}
// ставим пустые столбцы, если первый день не понедельник
for ($i = 1; $i < $primary_day_to_month_cal; $i++)
{
echo '<td></td>';
}
for ($i = 1; $i <= $day_to_month_cal; $i++)
{
$path_cal = array_search($i, $data_cal);
$day_cal = strlen($i) == 1 ? '0'.$i : $i;
$path_cal = !empty($path_cal) ? '<a href="/articles/?day=' . $day_cal . '&month=' . $month_cal. '&year=' . $year_cal . '">'.$i.'</a>' : $i;
if (date("w", mktime(0, 0, 0, $month_cal, $i, $year_cal)) == 0)
{
echo "<td><span>$path_cal</span></td></tr><tr>";
}
else
{
echo "<td>$path_cal</td>";
}
}
if (date("w", mktime(0, 0, 0, $month_cal, $day_to_month_cal, $year_cal)) != 0)
{
for ($i = 1; $i <= (7 - date("w", mktime(0, 0, 0, $month_cal, $day_to_month_cal, $year_cal))); $i++)
{
echo "<td></td>";
}
}
?>
</table>
<?
ob_end_flush();
die();
?>
4. В шаблон страниц/макет, используемый для показа страниц, НА КОТОРЫХ НЕОБХОДИМО ОТОБРАЖАТЬ КАЛЕНДАРЬ, в необходимое место вставить код(
ОБРАТИТЕ ВНИМАНИЕ, В КОДЕ ЗАПРОСА $query = "SELECT information_items_id, information_items_date FROM information_items_table WHERE information_systems_id = 5 AND information_items_date LIKE '" . $year_cal . "-" . $month_cal . "-%'";
ВМЕСТО 5 ИСПОЛЬЗУЙТЕ КОД ТОЙ ИНФОРМАЦИОННОЙ СИСТЕМЫ, ДЛЯ ИНФОРМАЦИОННЫХ ЭЛЕМЕНТОВ КОТОРОЙ ОТОБРАЖАЕТСЯ КАЛЕНДАРЬ. Также в строке $path_cal = !empty($path_cal) ? '<a href="/articles/?day=' . $day_cal . '&month=' . $month_cal. '&year=' . $year_cal . '">'.$i.'</a>' : $i;
вместо /articles/ вставьте путь к узлу структуры, с которым связана информационная система, для элементов которой отображается календарь):
<div style="display: block">
<h4>Архив статей:</h4>
<div id="calendar">
<?
$month_cal = !empty($_REQUEST['month']) ? $_REQUEST['month'] : date("m");
$month_cal = strlen($month_cal) == 1 ? '0'.$month_cal : $month_cal;
$year_cal = !empty($_REQUEST['year']) ? $_REQUEST['year'] : date("Y");
$day_to_month_cal = date("t", mktime(0, 0, 0, $month_cal, 01, $year_cal));
$primary_day_to_month_cal = date("w", mktime(0, 0, 0, $month_cal, 01, $year_cal));
?>
<!-- Формитуем выпадаюшие списки месяца и года -->
<select id="calendar_month" onchange="javascript:renewCalendar();">
<?
// массив месяцев
$months_arr = array(1 => 'январь', 2 => 'февраль', 3 => 'март', 4 => 'апрель', 5 => 'май', 6 => 'июнь', 7 => 'июль', 8 => 'август', 9 => 'сентябрь', 10 => 'октябрь', 11 => 'ноябрь', 12 => 'декабрь');
foreach ($months_arr as $key => $value)
{
?>
<option value="<?=$key?>" <?=($key == $month_cal) ? 'selected="selected"' : ''?>> <?=$value?> </option>
<?
}
?>
</select>
<select id="calendar_year" onchange="javascript:renewCalendar();">
<?
for ($i = date("Y"); $i >= 2000; $i--)
{
?>
<option value="<?=$i?>" <?=($i == $year_cal) ? 'selected="selected"' : ''?>> <?=$i?> </option>
<?
}
?>
</select>
<?
$query = "SELECT information_items_id, information_items_date FROM information_items_table WHERE information_systems_id = 5 AND information_items_date LIKE '" . $year_cal . "-" . $month_cal . "-%'";
$DataBase = & singleton('DataBase');
$result = $DataBase->select($query);
//echo "Первый день месяца: $primary_day_to_month_cal<br>";
//echo "Дней в месяце: $day_to_month_cal";
$data_cal = array();
// формируем массив данных для календаря
while ($row = mysql_fetch_assoc($result))
{
$explode = explode(' ',$row['information_items_date']);
$explode = explode('-', $explode[0]);
$data_cal[$row['information_items_id']] = $explode[2];
}
?>
<table>
<tr>
<th>Пн</th>
<th>Вт</th>
<th>Ср</th>
<th>Чт</th>
<th>Пт</th>
<th>Сб</th>
<th><span>Вс</span></th>
</tr>
<?
// если первый день воскрессенье, то устанавливаем значение $primary_day_to_month_cal в 7
if ($primary_day_to_month_cal == 0)
{
$primary_day_to_month_cal = 7;
}
// ставим пустые столбцы, если первый день не понедельник
for ($i = 1; $i < $primary_day_to_month_cal; $i++)
{
echo '<td></td>';
}
for ($i = 1; $i <= $day_to_month_cal; $i++)
{
$path_cal = array_search($i, $data_cal);
$day_cal = strlen($i) == 1 ? '0'.$i : $i;
$path_cal = !empty($path_cal) ? '<a href="/articles/?day=' . $day_cal . '&month=' . $month_cal. '&year=' . $year_cal . '">'.$i.'</a>' : $i;
if (date("w", mktime(0, 0, 0, $month_cal, $i, $year_cal)) == 0)
{
echo "<td><span>$path_cal</span></td></tr><tr>";
}
else
{
echo "<td>$path_cal</td>";
}
}
if (date("w", mktime(0, 0, 0, $month_cal, $day_to_month_cal, $year_cal)) != 0)
{
for ($i = 1; $i <= (7 - date("w", mktime(0, 0, 0, $month_cal, $day_to_month_cal, $year_cal))); $i++)
{
echo "<td></td>";
}
}
?>
</table>
</div>
</div>
5. В файл hostcms.js, расположенного в папке /templates/template1/ добавьте следующий код (
ОБРАТИТЕ ВНИМАНИЕ, в строке makeRequest('/articles/calendar/', "POST", "on_req_calendar", arrayToPostData(data));
вместо
/articles/calendar/
задавайте путь к узлу структуры, созданному в пункте №3):
function renewCalendar()
{
var year = document.getElementById('calendar_year').value;
var month = document.getElementById('calendar_month').value;
doRenewCalendar(month, year);
}
function doRenewCalendar(month, year)
{
var data = new Array();
data[0] = new Array();
data[0][0] = 'month';
data[0][1] = month;
data[1] = new Array();
data[1][0] = 'year';
data[1][1] = year;
makeRequest('/articles/calendar/', "POST", "on_req_calendar", arrayToPostData(data));
document.getElementById('calendar').innerHTML='<p class="article_rating_ajaxload">Идет загрузка...</p>';
}
function on_req_calendar(http_request)
{
document.getElementById('calendar').innerHTML=http_request.responseText;
}
function makeRequest(url, type, function_name, data_to_send) {
var http_request = false;
if (window.XMLHttpRequest) {
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) {
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
return false;
}
http_request.onreadystatechange = function() {
alertContents(http_request, function_name);
};
http_request.open(type, url, true);
if (type=='POST'){
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http_request.setRequestHeader('Accept-Charset', 'windows-1251,UTF-8;q=0.7,*;q=0.7');
}
http_request.send(data_to_send);
}
function arrayToPostData(arr){
var res="";
for(var i=0; i<arr.length; i++){
res+= arr[i][0]+'='+urlEncode(arr[i][1]);
if (i!=arr.length-1){
res+='&';
}
}
return res;
}
function urlEncode(data){
var offset = parseInt('350', 16);
var offset2 = parseInt('1D0D', 16);
data+='';
var res="";
for(var i=0; i<data.length; i++){
if ((data.charAt(i)).search("[0-9a-zA-Z-_.]")==-1){
if ((data.charAt(i))==' '){
res+='+';
} else {
var code = data.charCodeAt(i);
code = (code>offset2)?code-offset2:code;
code = (code>offset)?code-offset:code;
if (code.toString(10)<16){
res+='%0'+(code.toString(16)).toUpperCase();
} else {
res+='%'+(code.toString(16)).toUpperCase();
}
}
} else {
res+=data.charAt(i);
}
}
return res;
}
function alertContents(http_request, function_name) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
eval(function_name+'(http_request)');
} else {
alert('There was a problem with the request.');
}
}
}
6. В типовую динамическую страницу, используемую для отображения элементов информационной системы, для которых отображается календарь, перед вызовом метода
ShowInformationSystem вставьте код:
if (isset($_GET['day']) || isset($_GET['month']) || isset($_GET['year']))
{
$element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
$element['prefix'] = ' AND '; // префикс
$element['name'] = 'information_items_date'; // Имя поля для основного св-ва, если тип = 1, то не указывается
$element['if'] = '!='; // Условие
$element['value'] = '0'; // Значение поля (или параметра)
$day = quote_smart(to_str($_REQUEST['day']));
$month = quote_smart(to_str($_REQUEST['month']));
$year = quote_smart(to_str($_REQUEST['year']));
if ($year)
{
$like = $year;
}
else
{
$like = '%';
}
if ($month)
{
$like .= '-' . $month;
}
else
{
$like .= '-%';
}
if ($day)
{
$like .= '-' . $day . '%';
}
else
{
$like .= '-%';
}
$element['sufix']= " AND information_items_date LIKE '{$like}'";
$property['select'][] = $element;
$GLOBALS['INFSYS_result']['group'] = false;
}