Календарь для выбора информационных элементов

Модератор
#
Календарь для выбора информационных элементов
Для создания данного календаря необходимо сделать следующее:
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;
}
#
Re: Календарь для выбора информационных элементов
Дмитрий спасибо полезная вещь.

А можете ли помочь и модифицировать ваше решение чтобы в календаре отображались месяцы и года только те в которых собственно есть информация?

То есть допустим есть два элемента в январе и феврале в 2006 году - значит при выборе 2006 года только два месяца буду в списке.  C Годами - просто в списке те года в которых были созданы элементы.

Спасибо
ку
Модератор
#
Re: Календарь для выбора информационных элементов
compaq, то, что Вы просите сделать - это индивидуальные работы. Обращайтесь в наш отдел продаж.
#
Re: Календарь для выбора информационных элементов
у меня ссылки в календаре ведут на страницу календаря и не показывают новостей!

Может это быть из-за того что новости в инфосистеме у меня распределены по группам

и в календаре месяц с днями недель отображаются каряво...: http://www.altay-magazin.ru/articles/
#
Re: Календарь для выбора информационных элементов
Спасибо за Календарь, но ещё до нового года обещали сделать отдельным модулем для HostCMS.
Модератор
#
Re: Календарь для выбора информационных элементов
Art-Futuro,
Кто обещал и где?
#
Re: Календарь для выбора информационных элементов
Извините, что ввели смуту.
"он был отдельным модулем в HostCMS да ещё с Ajax переключением месяцев" - мы рассмотрим это предложение, но в ближайшее время к реализации это не запланировано.

Запамятовали, давно это было.
#
Re: Календарь для выбора информационных элементов
Посмотрите пожалуйста тут: http://lds-sibir.ru/

Возможно ли, чтобы при нажатии стрелочек около месяца, он переключался - следственно на более поздний или предыдущий?
Модератор
#
Re: Календарь для выбора информационных элементов
Art-Futuro, такое можно сделать, используя JavaScript.
#
Re: Календарь для выбора информационных элементов
Интересный календарик. Вот только у меня проблема. Когда пытаюсь сменить месяц или год, вместо текста появляются знаки вопроса. Я так понимаю, что проблемы с кодировкой. Подскажите, пожалуйста, как их можно решить... На сайте кодировка windows-1251
Авторизация