пятница, 28 декабря 2007 г.

вывод даты в заголовок из параметров GET DittoCal

Задача: сделать вывод даты из параметров GET DottoCal в заголовок, например "Новости за 15 января 2007 года".

Решение: пришло на ум два варианта - преобразовывать номера месяцев из параметров в названия из массива... и более универсальный, преобразовывать дату из параметров в timestamp и потом выводить в нужном формате через strftime. Приведу скрипт сниппета для последнего решения:
<?php
if (isset($_GET[cal_month])) {
if (isset($_GET[cal_day])) {
$date_string = $_GET[cal_year]."-".$_GET[cal_month]."-".$_GET[cal_day]." 00:00:00"; //задана дата полностью
$nix_date = strtotime($date_string);
return "за ".strftime("%d %B, %Y",$nix_date);
} else {
$date_string = $_GET[cal_year]."-".$_GET[cal_month]."-1 00:00:00"; //заданы месяц и год
$nix_date = strtotime($date_string);
return "за ".strftime("%B, %Y",$nix_date);
}
} else {
return "";
}
?>
здесь нам помогает функция strtotime, которая переводит дату из строки в timestamp. Примечание: сниппет следует вызывать некешированным.

четверг, 27 декабря 2007 г.

устранение проблем с кириллицей в DittoCal

После успешного применения русской локали, единственным неправильно выводившим кириллицу сниппетом остался DittoCal. Все по одной простой причине - названия месяцев и дней недели в нем пропускаются через htmlentities. Мне лично это слегка непонятно - откуда могут возникнуть проблемные символы в названиях месяцев и дней недели?

Вобщем, для нормального вывода последних, нужно просто убрать в соответсвующих местах (ниже строки "#if the day names should be shown") функцию htmlentities. Как оказалось, она убивает кодировку cp1251.

Настройка русской локали на хостинге mediatemple (gs)

Есть небольшой нюанс в переключении на русскую локаль на хостинге mediatemple:
setlocale(LC_TIME, "ru_RU.CP1251");

Мне пришлось попотеть, так как я не знал о существовании способов задания локали кроме как "ru_RU" :)

среда, 26 декабря 2007 г.

Вывод новостей за указанную дату (Ditto+DittoCal)

По умолчанию, DittoCal при нажатии на ссылку даты выводит один (не известно по каким критериям отобранный) пост. DittoCal не учитывает то, что за один день может быть написано несколько постов. Модифицируем DittoCal так, чтобы Ditto, при нажатии на дату календаря, выводил новости просто по фильтрам cal_dateFilter (см. предыдущий пост блога) с учетом парметра &cal_day.
  1. За формирование ссылки на дату в DittoCal отвечает блок 
    $calendar .= '<td'.($classes ? ' class="'.$add_class.' '.htmlspecialchars($classes).'">' : '>').
    ($link ? '<a href="'.htmlspecialchars($link).'" title="'.htmlspecialchars($title).'">'.$content.'</a>' : $content).'</td>';

  2. Заменим последнюю строку на
    <a href="[(base_url)][~[*id*]~]?cal_year='.$year.'&amp;cal_month='.$month.'&amp;cal_day='.$day.'"

вывод новостей в соответствии с парметрами DittoCal

Для того чтобы Ditto видел параметры DittoCal (которые отличаются приставкой "cal_"), возможно нужно изменить фильтр/экстендер dateFilter...

Запись о параметрах GET экстендера dateFilter находится в файле assets/snippets/ditto/extenders/dateFilter.extender.inc.php около строки 100.
  1. Создаем новый экстендер "cal_dateFilter" путем копирования файла dateFilter.extender.inc.php и переименования его в cal_dateFilter.extender.inc.php.
  2. Меняем все упоминания параметров "year", "month" и "day" на "cal_year", "cal_month" и "cal_day" в строках с 101 по 103
  3. В вызове Ditto, который будет выводить новости учитывая параметры DittoCal добавляем параметры &extenders=`cal_dateFilter` &dateSource=`createdon`