Вывод элементов ИС в подгруппах

#
Re: Вывод элементов ИС в подгруппах
Kotoff, ой. Я с неё начал, вообщето. Но эти страницы пропустил как-то ((

Спасибо огромное! Теперь сам разберусь !!!
#
Re: Вывод элементов ИС в подгруппах
Удачи!
Заказов не беру. Консультирую редко.
#
Re: Вывод элементов ИС в подгруппах
Kotoff,
подскажите пожалуйста, где можно прочесть (в какой из документаций, и в каком разделе / на какой странице) - как обращаться к элементам инфосистем и их дополнительным свойствам непосредственно через SQL ? Вообще, структура SQL баз Host CMS где/либо хоть как-то документирована для внешнего пользователя?
#
Re: Вывод элементов ИС в подгруппах
ComradeVoland, структура БД в документации не описана. Более того, обращаться к таблицам в БД напрямую - очень не хорошо, для этого есть API.
А прямых обращений лучше избегать.
Почему?
Потому что структура БД - это не что-то постоянное, она меняется. И в методах API эти изменения учитываются, так что если вы делали что-то с их помощью, то изменения структуры вы не заметите. А вот если вы делали это же прямыми запросами, то они поломаются и надо будет их переписывать.
Сейчас это особенно актуально, потому что происходит переход с 5й версии на 6ю, и структура базы в связи с этим изменилась очень сильно.

Делать прямые запросы допустимо только в двух случаях - если задачу нельзя решить методами API (ну, например, нету нужного метода. хотя лучше в таком случае проконсультироваться в ТП), или если решение через API приводит к слишком сильному падению производительности (а здесь нужно сначала тщательно проанализировать решение и тоже, на всякий случай, проконсультироваться в ТП).

Так вот. Если все сказанное выше вас еще не отпугнуло, то я могу сказать, где можно посмотреть таки структуру базы и примеры запросов.
Первое смотрится через phpMyAdmin, там же можно писать собственные запросы и отлаживать их.
А примеры штатных запросов к БД можно посмотреть в самой HostCMS, включив отладку SQL-запросов в константах.

P.S. И еще добавлю - SQL-запросы в явном виде в 6й версии лучше не использовать, это потенциально небезопасно. Лучше пользоваться новым ORM.
Заказов не беру. Консультирую редко.
#
Re: Вывод элементов ИС в подгруппах
Kotoff, я вкратце обрисую ситуацию.

У заказчика на сайте имеется ИС со списком мероприятий (планируемых, проходящих и прошедших). Там же должен генерироваться календарик на месяц (смена месяца и года в выпадающих списках должны обновлять страничку - с новым календариком, соотв-но). В календарике даты, занятые мероприятием каким-либо, должны быть выделены жырным. В нынешней версии подразумевается, что каждое мероприятие длится сутки и имеет ровно одну дату - дату элемента в ИС. Генерация календарика происходит следующим образом:

$query = "SELECT information_items_id, information_items_date FROM information_items_table WHERE information_systems_id = 16 AND information_items_date LIKE '" . $year . "-" . $month . "-%'";  

      $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];
      }


и затем, в цикле вывода html календаря - вот так:


for ($i = 1; $i <= $day_to_month_cal; $i++)
         {
      $path_cal = $i; //array_search($i, $data_cal);
      if ( if (array_search($i, $data_cal))  ) { $path_cal = '<p>'.$path_cal.'</p>'; }
      echo "<td class='cell' id='day_".$i."'><span>$path_cal</span></td>" ;
      if (date("w", mktime(0, 0, 0, $month, $i, $year)) == 0)   echo "</tr><tr>";
         }


В новой версии требуется хранить также дату окончания мероприятия, если оно длится свыше суток, - в дополнительном свойстве. И выводить жырным все даты, попадающие в интервал между датой начала и датой конца мероприятия.

Ну ок, допустим, вывод календаря я реализую. Но как выбрать события в рамках заданного месяца, и отобрать из них инфу?

------------------------------

....впрочем, возможно, это удастся сделать через showInformationSystem и ОЧЕНЬ извращенный шаблон xsl
#
Re: Вывод элементов ИС в подгруппах
Занятная задачка )

По сути она разбивается на несколько более мелких.
1. Определить границы текущего месяца. То есть нам надо знать в какой день недели начался месяц (это будет нужно в XSL) и сколько в нем дней (это можно сделать стандартными методами php).

2. Определить id тех элементов, у которых дата начала мероприятия попадает в текущий месяц. (это будет массив id'шников)
3. Определить id тех элементов, у которых дата окончания мероприятия попадает в текущий месяц. (это тоже будет массив id'шников)

4. Объединить эти два массива, выкинуть дубли.

5. Развернуть массив в строку через запятую, и передать его в фильтр отображаемых элементов, с помощью SQL-оператора IN()

6. В external_propertys передать номер дня недели, в который начинается месяц, и число дней в нем.


7. Вызвать ShowInformationSystem() У вас в XML должны попасть только элементы начинающиеся или заканчивающиеся в нужном месяце.

8. в XSL уже строить календарь. Тут вот, пожалуй, самое интересное - как определять жирность конкретного числа. Я предполагаю, что это надо решать с помощью exslt nodeset, но это навскидку, может быть можно как-то еще проще. Вообще, конечно, может понадобиться и exslt date.

Вопросы и примечания.

а) могут ли события пересекаться? В общем-то случае могут конечно. И если они пересекаются, то как мы отображаем это пересечение в календаре?
б) зачем дата окончания в доп.свойстве? Есть же отличное поле "дата окончания публикации". И стоит задействовать именно его.
Потому что п.3 мы можем реализовать с помощью метода GetExternalInformationSystemItem() фильтром по основному свойству, а вот п.4 не можем - я не нашел штатного метода для фильтрации по значению доп.свойства. Поэтому лучше использовать основное. А чтобы просроченные элементы не исчезали при выводе полного списка элементов где-то в другом месте, нужно передавать в этом другом месте в метод ShowInformationSystem() в $property['show_item_type'] дополнительное значение putoff_date.

P.S. ну и постучитесь, наверное, в аську, посмотрим вместе.
Заказов не беру. Консультирую редко.
#
Re: Вывод элементов ИС в подгруппах
Kotoff, в какую аську?
#
Re: Вывод элементов ИС в подгруппах
ComradeVoland, ну угадайте
Заказов не беру. Консультирую редко.
#
Re: Вывод элементов ИС в подгруппах
Kotoff, тьхублин! готов поклясться на Библии Дельфи IV. что ещё час назад никакой ICQ в Вашем профайле не было!
#
Re: Вывод элементов ИС в подгруппах
ComradeVoland, да хоть на учебнике по ассемблеру! - Но моя аська живет в моем профиле с 3 февраля 2008 года  
Заказов не беру. Консультирую редко.
Авторизация