Strawberry - это мощная и несложная в обращении система публикации новостей,построенная на оригинальной разработке CutePHPTeam и его ветки AJ-Fork, использующая в качестве базы данных текстовые файлы или СУБД MySQL. Системныетребования для работы скрипта минимальны, а возможности неограниченны!Вы можете использовать Strawberry для ведения новостной ленты, как онлайн-дневник(блог) или как настоящую систему управления контентом.
Подробную информацию об использовании скрипта можно почитать на официальномсайте Strawberry
Перед тем, как устанавливать скрипт, советуем ознакомиться с лицензионнымсоглашением.
Все вопросы по использованию скрипта задавайте на форумедля пользователей Strawberry
Вы можете поддержать проект Strawberry:
Take it, use it, love it! (это тонкий юмор)
Внимание! path/to это путь до директории сStrawberry.
Установка Strawberry несложная, следует лишь соблюдать следующие инструкции:
При установки могут возникнуть проблемы. Если инсталяция прервалась (выпоймёте это, страница не загрузится до конца :)) это, конечно, плохо.Это значит что у вашего хостера стоит Safe Mode включённым.
Вам нужно вручную создать папку base в директории data/db/и поставить на base CHMOD 777. Теперь снова попытайтесь проинсталироватьскрипт.
Переезд для версий CuteNews.RU 024, 025, 026, 027, 028, 029, оригинального CuteNews и AJ-Fork. Если AJ-Fork версии 168, то Вам сначало нужно запустить tools/anticonvert.php (входит в дистрибутив AJ-Fork) и только потом использовать наш переезд.
Для версий CuteNews.RU выше 030 или версий Strawberry скрипт делает всё сам, если понадобится. Вы просто должны зайти в админку.
При апгрейде, помимо папок inc и plugins, обновляйте и директорию skins. Не забывайте и про все файлы в главной директории скрипта, файлы в ней (head.php, show_news.php, xmlrpc.php и т.д.) меняются постоянно, если вы не можете изменить их вручную, т.е. довести до "кондиции" новой версии, то перезаписывайте. В противном случае могут возникнуть проблемы.
Чтобы не возникло разного рода проблемпосле обновления скрипта, делайте бэкап. Вобще всегда при удобном случае делайте бэкап и качайте его, либо посылайте на e-mail. В крайнем случае, оставляйте лежать архив на сервере. Таким образом вы сбережёте себе нервы и волосы в разных забавных местах.
Будьте осторожны, миграция работает хреново, например, если вы установите плагин "Кейворды", то считайте кирдык, работать нормально не будет.
Периодически следует делать бэкап данных, потому что в случае сбоя работы сервера вы можете потерять данные. Для этого существует директория backup/. Вам нужно набрать в браузере http://example.com/path/to/index.php?mod=backup и выбрать что бэкапить. Лучше всего сразу делать резервную копию и базы, и папки data/. Вы всегда можете удалить бэкап, скачать его или выслать на e-mail (тот, на который приходят комментарии).
Бэкап данных рекомендуется делать инимум раз в месяц, а также перед апгрейдом скрипта.
Нынешняя маркировка сделана исходя из следующего: версия точка сборка точка билд. Например версия 2 сборка 3 билд 2 = 2.3.2.Если билд не указан, значит он равен нулю (2.3 = 2.3.0).
У версий, которые на релиз явно не тянут есть буквенная приписка определяющая статус: alfa, beta.
Версии в статусе альфы использовать крайне нежелательно. На них мы не даем никакой гарантии. У новой сборки альфы может меняться всё. Беты использовать можно, но на свой страх и риск. И после релиза нужно апгрейдиться в обязательном порядке!
Версии у которых есть какая-либо из вышеперечисленных добавлений служат первым делом для тестов и устранения ошибок.
В базовой сборке (это без учёта подключённых плагинов, у них есть своиописания) существует несколько важных переменных, которые помогут Вамуправлять выводом скрипта и настроить его именно под ваши надобности.
$static['переменная'] = ЗНАЧЕНИЕ; // даётпонять скрипту, что полные новости открываться не будут. Этополезно использовать для нескольких подключений. переменнаяэто одна из нижеперечисленных только без знака доллара ($) в начале. Например$static['number'] = 4;
$template = 'ШАБЛОН'; // позволяет подключитьопределённый шаблон. Например $template = 'Headlines'. Если вы хотитеиспользовать шаблон Default, то определять эту переменную не нужно. Шаблонставиться по умолчанию.
$category = 'ID КАТЕГОРИИ;' // этой переменнойвы показываете новости какой категории должны выводиться. Можно указыватьнесколько категорий: $category = '1,4,7' это значит выводиться новостибудут только из категорий с ID 1, 4 и 7. ID категорий можно посмотретьв админке -> Категории.
$number = КОЛ-ВО; // этим вы указываетесколько должно выводиться новостей за раз. К примеру, $number = 7.
$year, $month, $day,$user (или $author) похожи на переменную $category,только указать можно лишь одно правило. То есть вывод новостей определённогопользователя ($user/$author), за определённый год ($year), месяц ($month),день ($day). Конечно, всё можно использовать "вкупе": показатьновости определённого пользователя из нужной категории (категорий), некогогода, месяца и дня.
$skip = КОЛ-ВО; // эта переменная должнаиспользоваться только, если задействована переменная $number. Переменная переменная $skip позволяет показыватьновости пропуская энное количество, которое и указывается в переменная $skip.
$post // работает только если какая-то новость открыта. Это массив содержащий в себе всю информацию из открытой новости ($post['title'], например, заголовок новости).
$sort = array('поле', 'порядок'); // сортируетновости по "полю" по "порядку".
$link = 'ФАИЛ'; // заставляет новости (календарь, категории, etc.) открываться в ФАЙЛЕ. Если $link не указан, то подразумевается home (домашняя страница сайта). Обратите внимание на то, что это не абы какой фаил, а "фаил" прописанный в urls.ini. Подробнее об этом читайте в rUFUs / Управление УРЛами
Существует так же несколько уже определённых массивов.
$users - содержит в себе всю информацию о всех пользователях. $users[username]['icq'], где username это логин пользователя, даст ICQ юин пользователя.
$categories - содержит всю информацию о категориях. $categories[id]['parent'], где id это ID категории, вернёт "родителя" категории.
$member - содержит всю информацию о авторизированном пользователе. $member['icq'] вернёт ICQ юин пользователя.
Доступные значения у переменных $sort и $post:
date - дата новости
author (не user) - пользователь (его логин)
title - заголовок
short - кол-во знаков в короткой новости
full - кол-во знаков в полной новости
category - категория (в базе категории идут как id1,id2и т.д.)
url - заголовок в транслите или слово указанное в поле"УРЛ" при добавлении/редактировании новости
id - идентификационный номер новости
views - счётчик просмотров
comments счётчик комментариев
Порядков сортировки у $sort всего два (но зато каких! :)):
ASC - (ASCENDING) сортирует по возрастанию
DESC - (DESCENDING) сортирует по убыванию.
Например $sort = array('comments', 'DESC') - будет сортировать комментариив порядке "новые сверху".
Обратите внимание. Всё вышеуказаное может быть расширено плагинами, такими как Keywords, например.
Это очень простой процесс. Нужно лишь наверх файла, в котором будут отображатьсяновости написать:
include 'path/to/head.php';
Обратите внимание. path/to/ это путь к директории,где расположен скрипт.
"Верх" файла это самый-самый верх. Если есть DOCTYPE, то до него:
<? include 'path/to/head.php';?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
Теперь вы поняли что такое "верх". Да? ;)
А там, где вы хотите видеть сами новости:
include rootpath.'/show_news.php';
Все указанные выше переменные нужно писать до подключения (include)show_news.php:
$number = 7;
include rootpath.'/show_news.php';
Можно подключать любое количество show_news.php, просто не забудьте использоватьпеременную $static для подключений, которые не должны показывать полную новость.
Вы можете вместо переменной $cutepath использовать константу rootpath:
include rootpath.'/show_news.php';
Конечно, самый лучший пример это http://ваш-сайт.ру/example/, так как он "боевой":).
Обычное подключение. Выведет абсолютно все новости, из всех категорий,с сортировкой по умолчанию (сортировка по дате, по убыванию (DESC), т.е. новыесверху):
include rootpath.'/show_news.php';
Теперь нам нужно вывести 5 новостей из категории "Вася" (унеё ID, предположим, 1) и Гриша (ID этой 4) с шаблоном Headlines:
$number = 5;
$category = '1,4';
$template = 'Headlines';
include rootpath.'/show_news.php';
Отлично. Сейчас задача следующая: если кто-то открыл полную новость,надо снизу (можно и сверху - без разницы) вывести несколько (7) новостей из той же категории, что и открытая.Шаблон будет Headlines:
$number = 5;
include rootpath.'/show_news.php';
if ($post['category']){ // узнаём, открыта ли какая-то новость и в категориили она вообще
$static['skip'] = 0;
$static['template'] = 'Headlines';
$static['number'] = 7;
$static['category'] = $post['category'];
include rootpath.'/show_news.php';
}
Если не нужно выводить из той же категории, а просто 7 заголовков, то делать это следует так:
$static['skip'] = 0;
$static['template'] = 'Headlines';
$static['number'] = 7;
include rootpath.'/show_news.php';
Плагины и некоторые функции лишний раз обращаются к базе и создают нагрузку, плюс есть функция создающая ужасное PGT (время генерации скрипта)(я работаю над её оптимизацией). Для ускорения работы скрипта и снижения нагрузки на сервер нужно использовать кэширование. По умолчанию оно выключено, включить можно в настройках системы -> закладка "система" -> поле "Кэш".
С помощью rUFUs вы можете настраивать УРЛы скрипта исходя из личных предпочтений.
Обратите внимание! Все примеры ниже предпологают домашнюю страницу сайта http://example.com/index.php, а "Полный путь к директории, где установлена Strawberry" это http://example.com/path/to
В дистрибутиве по умолчанию идут УРЛы следующие:
для новостей http://example.com/index.php?id=ID
для категорий http://example.com/index.php?category=ID
и так далее.
Не то чтобы этот вариант был ужасен, нет, поисковики (по крайней мере нормальные поисковики :)) "кушают" такие страницына "ура", проблемы могут быть у пользователей шастающих по вашему венцу творения. Сами посудите, что проще запомнить и в чём ориентироваться.
К примеру, есть у нас биография господина Ремарка: "Эрих Мария Ремарк. Биография". УРЛ http://example.com/index.php?id=128 об этом ничего не говорит. А вот http://example.com/bio/remark (bio это категория) или http://example.com/remark.html - да. Согласитесь, это логичные УРЛы. Пользователь набирая первые буквы вашего сайта и видя все странички, которые посетил сразу поймёт что про что и зачем. Это называется ЧПУ (человеко-понятные УРЛы).
Выучить синтаксис труда не составит, тем более, если вы ковыряли когда-нибудь ini-файлы, а вот с пониманием и моим объяснением проблемы возникнуть могут. Я попробую как можно проще и доходчивея объяснить что к чему и почему. Чтобы не показывать на пальцах, советую проинсталировать скрипт и для начана поработать с http://example.com/path/to/example. Так же советую сделать бэкап файла data/urls.ini на всякий случай. Если в процессе вылезет ошибка 500, то просто удалите фаил .htaccess из http://example.com/path/to/example (да, он сохраняется в домашнюю директорию сайта).
Итак, для начала разберём дефолтные настройки.
[home]
post = "?id={id}"
category = "?category={category-id}"
user = "?do=users&user={user}"
day = "?year={year}&month={month}&day={day}"
month = "?year={year}&month={month}"
year = "?year={year}"
[rss.php]
post = "?id={id}"
category = "?category={category-id}"
user = "?user={user}"
[print.php]
post = "?id={id}"
[trackback.php]
post = "?id={id}"
post, category, user, day, month и year это стандартные ключи их описание можно посмотреть чуть ниже. Описание {тегов} рядышком со значениями :). Я думаю, с этим, более менее всё понятно. Есть ключ post мы делаем ему маску.
?id={id} в итоге даст http://example.com/index.php?id=128 (128 это пример, конечно же).
Странные штуковины в квадратных скобках это файлы через которые идёт обработка. [home] это "Домашняя директория сайта", сейчас она у нас http://example.com/index.php (это тут, в ридми), а [rss.php] это http://example.com/path/to/rss.php, [print.php] - http://example.com/path/to/print.php, [trackback.php] - http://example.com/path/to/trackback.php.
Если нужно чтобы обработка шла не через аддон (файлы в директории скрипта типа rss.php) или какой-то ваш фаил в директории скрипта, а в директории сайта, то нужно писать так:
[home/file.php]
эта штука поможет сделать ссылку на http://example.com/file.php.
Такая:
[home/folder]
на http://example.com/folder.
А такая:
[home/folder/file.php]
на http://example.com/folder/file.php.
Вызывать сгенерированные УРЛы нужно через $tpl['post']['link']['ключ'], например $tpl['post']['link']['post'] в таком случае ссылка будет формироваться за счёт переменной $link (см. переменные), либо через $tpl['post']['фаил/ключ'], например, $tpl['post']['home/post'] это фиксированный выбор, переменная $link не сможет ничего изменить. Впрочем, это работает только в шаблонах, я имею в виду переменную $tpl. В друших местах сайта нужно вызывать функцию cute_get_link(). Работает она схоже:
cute_get_link(массив, ключ, фаил)
К примеру, делаем выборку из таблицы news и выводим заголовки, которые ещё и ссылки работающие через home/file.php и ключ post:
foreach ($sql->select(array('table' => 'news'))) as $row){
echo '<a href="'.cute_get_link($row, 'post', 'home/file.php').'">'.$row['title'].'</a><br />';
}
Все примеры далее полностью работают, если ваш хостер поддерживает mod_rewrite. Спросите у него и если это верно, то зайдите в настройки системы и в пункте "mod_rewrite" поставьте "Да".
Итак. Давайте попробуем сделать ЧПУ для постов, нужно сделать вид год/месяц/день/заголовок.html и выводить через домашнюю страницу сайта). Сделать это просто. Сначало следует зайти в "Управление УРЛами". В окне .htaccess следует в [home] заменить:
post = "?id={id}"
на вот это:
post = "{year}/{month}/{day}/{title}.html"
Теперь нажать "Сохранить urls.ini", а затем "Создать .htaccess". Всё. Теперь откроте сайт и тыкните на УРЛ. Если вылезла ошибка 404, то поробуйте зайти в домашнюю страницу сайта по FTP и проверить, есть ли .htaccess. Если нет - не беда. Создайте его и поставьте права 666 или 777. Теперь снова сгенерируйте .htaccess. Если и сейчас 404, то спросите хостера ещё раз про mod_rewrite. Может наврал гадюка?
Сейчас попробуем переделать имя файла. К примеру, чтобы наш RSS был по адресу http://example.com/rss.xml, а не http://example.com/path/to/rss.php. Вы ведь можете сменить директорию скрипта, переименовать и т.д., да и просто хочется сделать более симпатичный УРЛ.
Под [rss.php] пишем:
post = "{year}/{month}/{day}/{title}.html"
Сохраняем urls.ini, генерируем .htaccess и заходим на http://example.com/rss.xml. Какая прелесть, работает и кто бы мог подумать?
Обратите внимание, мы сделали новый ключ с иминем feed. Это имя произвольно. Вы можете называть как хотите, главное чтобы ваше имя не перебивало стандартные ключи (post, category, user, day, month и year).
Всё оки, а что делать, если сайт раотает через какие-то переменые, т.е. их нужно передать скрипту? Всё оки-доки. Передать свои переменные можно двумя путями: скрытым и публичным. К примеру, есть у нас переменная kartman. Если она равна news (kartman=news), то открываются новости, иначе кукиш, не будут выводиться. Делаем так.
Первый путь. Путь ниндзя скрытый. В {тег} можно добавлять данные.
Так {тег:kartman=news}:
post = "{year}/{month}/{day}/{title:kartman=news}.html"
или так {тег}{add:kartman=news}:
post = "{year}/{month}/{day}/{title}.html{add:kartman=news}"
Если нужно передать несколько параметров, то пишим не kartman=news, а например kartman=news&some=thing&and=more - в этой строке передаём переменные kartman, some и and.
В УРЛ эти данные не попадут. Поэтому способ и именуется скрытый. В бубличном всё капельку иначе:
post = "{year}/{month}/{day}/{title}.html?kartman=news"
?kartman=news попадёт в УРЛ.
Иногда нужно делать статичные файлы. Например, по адресу http://example.com/category иметь список категорий, а по http://example.com/archives список архивов. Загляните в фаил exapmle/index.php (лежит в директории со скриптом) и увидите как там реализовано:
if ($do == 'search'){
// выводим поиск (аддон)
$number = 12;
include rootpath.'/show_search.php';
} elseif ($do == 'users'){
// выводим список юзерей (аддон)
include rootpath.'/show_users.php';
} elseif ($do == 'category'){
// выводим список категорий (плагин CN Functions)
echo cn_category();
} elseif ($do == 'archives'){
// выводим список архивов (плагин CN Functions)
echo cn_archives();
} else {
// выводим семь новостей
$number = 7;
include rootpath.'/show_news.php';
}
По-русски это звучит так: если переменная do равна search, то делаем это, если равна users... и так далее до несовпадения ни с чем, тогда выводим новости. Но зачем нам УРЛ http://example.com/index.php?do=category, когда можно http://example.com/category? Правильно, незачем.
Поэтому определяемся с файлом (в примеру будет домашняя страница сайта), берём все свои do и пишем под [home]:
doIt = "(search|users|category|archives){add:do=$1}"
Сохраняем и генерируем. Всё. Теперь у нас есть виртуальные папки. Ну не крутатня ли? :)
Видимо, нужно немного пояснить. Дело в том, что {add:что-то}добавляет ?что-то в конец, т.е. что мы будем реврайтить. (что-то|что-то другое) говорит мод_реврайту "или", т.е. что-то или "что-то другое". Знак цифра со знаком доллара определяет последовательность. Вот смотрите, если у нас есть:
(что-то раз|что-то другое раз)(что-то два|что-то другое два)
то всё что между первыми скобками это $1, всё что между вторыми это $2.
Вот пример, он не рабочий (из-за кирилицы), это просто пример:
чтоТо = "(что-то раз|что-то другое раз)(что-то два|что-то другое два){add:чтоРаз=$1&чтоДва=$2}"
Соблюдать последовательность необязательно:
чтоТо = "(что-то раз|что-то другое раз)(что-то два|что-то другое два){add:чтоРаз=$2&чтоДва=$1}"
чтоТо = "(что-то раз|что-то другое раз)(что-то два|что-то другое два){add:чтоДва=$2&чтоРаз=$1}"
чтоТо = "(что-то раз|что-то другое раз)(что-то два|что-то другое два){add:чтоДва=$1&чтоДва=$2}"
Лучше всего, конечно, почитать что-ибудь про regexp`ы. Если вы имели дело с каким-то языком программирования или непосредственно с mod_rewrite, то сталкивались с регулярными выражениями.
Список ключей:
post - ссылка на новость (переменная id)
category - ссылка на категорию (переменная category)
user - ссылка на пользователя (переменная user)
day - ссылка на день (переменная day)
month - ссылка на месяц (переменная month)
year - ссылка на год (переменная year)
Переменные указаные в скобочках говорят какой, собственно, переменной передаются параметры срипту.
Список тегов:
{id} - ID новости (цифры)
{year} - год публикации новости (1980, 1983, 2004, 2005 и т.д.)
{month} - номер (от 01 до 12) месяца публикации новости
{Month} - имя месяца (от jan до dec) публикации новости
{day} - день (от 01 до 31) публикации новости
{title} - заголовок новости(в транслите или присвоенное ей название в поле "УРЛ")
{user} - автор новости
{user-id} - ID автора новости (цифры)
{category-id} - ID категории (цифры)
{category} - имя категории (в транслите или присвоенноеей название в поле "УРЛ")
{categories} - категория со всеми parent`ами, т.е. /категория/суб/наша-категория (цифры)
Первая и самая распространённая ошибка - не создаётся .htaccess. Вам нужно самостоятельно в "домашней странице сайта" создать .htaccess с CHMOD 666. А потом снова создать его из админки.
Вторая. Если вы захотите написать УРЛ для категорий:
category = "{categories}"
Будут некоторые проблемы. Они связаны с mod_rewrite.Тег {categories} оставляет следующее условие для реврайта:
([/_0-9a-z-]+)
Оно подходит почти под всё: тут и цифры разрешены, и буквы, и минус снижмим подчёркиванием, и даже слэш. Что может помочь? Иерархия, конечноже.
[home]
post = "{year}/{month}/{day}/{title}.html"
user = "users/{user}.html"
day = "{year}/{month}/{day}"
month = "{year}/{month}"
year = "{year}"
category = "{categories}"
[rss.php]
post = "{year}/{month}/{day}/{title}.xml"
category = "category/{categories}/rss.xml"
user = "users/{user}.xml"
[print.php]
post = "{year}/{month}/{day}/{title}.phtml"
[trackback.php]
post = "{year}/{month}/{day}/{title}.tb"
Видите, пункт category перемещён как можно ниже, mod_rewrite (именно, как мод Апача, а не пункт в настройках :)) будет егообработать в последнюю очередь и возможно(!) это позволит избежать ошибоки неожиданностей.
updданная ошибка была исправлена в версиях выше 2.5.4, но подобная ошибка может встречатся и с правилами пользователей, которые я, к сожалению, предвидеть не могу. Поэтому "на заметку" оставляю.
upd2 вот пример чего я не могу предвидить:
[home]
post = "{categories}/{title}"
category = "{categories}"
user = "users/{user}.html"
day = "{year}/{month}/{day}"
month = "{year}/{month}"
year = "{year}"
Посмотрите на post и category. Такие правила вызывут "Новость не найдена" при просмотре категории с большой вложенность. Исправить ошибку просто, нужно поменять местами post и category:
[home]
category = "{categories}"
post = "{categories}/{title}"
user = "users/{user}.html"
day = "{year}/{month}/{day}"
month = "{year}/{month}"
year = "{year}"
Для очень умных людей: скрипт формирует правила для mod_rewrite, скрипт обрабатывает то, что даёт ему мод Апача.
Третья. Если вылезет ошибка 500, то нужно зайти по ftp и удалить .htaccess. Потом обязательно необходимо проверить категории. Скорее всего, одна из них без имени! Или вы гсохраняете .htaccess с УРЛами вида "как в старые добрые времена. Этого не допускается.
Хочу рассказать о плагине "Приблуды" (CN functions - с недавнего времени, мультиязычность, извините). Он включает в себя четырефункции: cn_calendar(), cn_title, cn_archives() и cn_category(). Первое это календарь,второе - список архивов и третье - список категорий.
Если вы раньше работали с CuteNews версий 02x, то должны помнить этифункции, только не с префиксом "cn_", а "rufus_".Они имели не много функций и достаточно сложно настраивались (в визуальномплане). С тех пор всё несколько изменилось (это не относится к календарю:)).
Обратите внимание! Это php-функции. Выводить их надо так:
<?=cn_category(); ?>
Со своими настройками так:
<?=cn_category('настройка1', 'настройка2'); ?>
cn_archives():
cn_archives([шаблон [, сортировка]])
- шаблонэто внешний вид, доступны теги:
{count} (кол-во новостей за месяц), {date} (например Апрель 2005),
{link} (ссылка, например /2005/04/,настроить вид ссылки можно в urls.ini фаил - [home], тип - month).
-сортировкаэто, собственно, сортировка, аналог переменной $sort
С cn_category() всё куда сложнее, но и интереснее и разнообразнее:
cn_category([префикс [, шаблон [, нет-префиксу [, уровень]]]])
- префикс это то, что будет идти перед шаблоном,но, будет повторяться в зависимоти от вложенности категорий
-нет-префиксуважная штука, она говорит делать ли префикс для категорий-родителей откоторых и начинается вся цепочка подкатегорий
- шаблон- как и в cn_archivev() это внешний вид. Теги следующие:
{id} - ID категории
{name} - имя
{url} - имя в транслите, либо слово указаное в поле "УРЛ"
{icon} - иконка категории
{prefix} - это префикс, который вы указали в поле "префикс".
[php][/php], между этими тегами можноставить php функцию. Вот для примера (это и шаблон по умолчанию): <ahref="[php]cute_get_link($row, category)[/php]">{name} ([php]count_category_entry({id})[/php])</a><br/>. уровень говорит от какого ID категории показывать.Будут показаны все подкатегории указаного ID.
Заметим, что cn_categoy() построена на функции category_get_tree() (о ней можно почитать ниже). Функции для понимания сложной, но в использовании крайне полезной.
cn_title():
cn_title([разделитель [, направление]])
- c разделителем
-направление указывает "откуда куда" сначала в конец значение false, с конца в начало - true
Ф-ия cn_calendar() выводит календар записей. CSS для календаря:
#calendar - это id всей таблицы календаря
.month - класс заголовка месяца и ссылок на предыдущий/следующий месяц
.weekday - класс названий дней недели с понедельника по пятницу
.day - класс самих дней с понедельника по пятницу
.weekend - класс названий дней недели субботы и воскресенья
.endday - класс самих дней субботы и воскресенья
Для примера CSS можно привести пример:
#calendar {text-align: center;}
#calendar .month, #calendar .month a {font-weight: bold;color: #ccc;}
#calendar .weekday {color: #ccc;}
#calendar .weekday a {color: #ccc;font-weight: bold;}
#calendar .day, #calendar .day a {color: #ccc;}
#calendar .weekend {color: #c60000;}
#calendar .weekend a {color: #c60000;font-weight: bold;}
#calendar .endday, #calendar .endday a {color: #c60000;}
Все нижеприведенные функции крайне полезны.
cute_get_link() - про неё вы уже знаете: cute_get_link(массив [, типссылки [, фаил]]).
Не менее полезая - category_get_tree() (за счёт этой функции работаетcn_category()). Её пример можно увидеть в search.php. Синтаксис прост:
category_get_tree([префикс [, шаблон [, нет-префиксу [,уровень]]]]) всё абсолютно схоже с cn_category()
+1 запрос к БД. cn_category() кэшируется, следовательно, запросов нет, а эта функция не кэшируется
Помимо упомянутой выше есть ещё несколько полезных функций для работы с категориями.
category_get_link(id) - id это номер категории. Функция даст ссылку со всеми родителями
category_get_children(id) - даст список всех дочерних категорий в виде приемлемом для скрипта ("1,2,3")
category_get_title(id [, разделитель]) - получает названиее категории из её ID, учитывая все категории-родители. разделитель это то, что будет стоять между названиями категорий
category_get_id(категория) - функция даёт номер категории исходя из её названия или УРЛа. категория - это, собственно, имя категории или её УРЛ
Остальные функции вы можете посмотреть в inc/functions.inc.php или в документации.
Скрипт работает за счёт двух шаблонов. Первый это шаблон самого сайта, т.е. ваш. Куда угодно вы можете сувать подключение новостей. Второй это шаблон новостей. Все они хранятся в папке data/tpl/. Одна директория внутри это один шаблон. Например, Default это шаблон по умолчанию. active.tpl, full.tpl и т.д. это на самом деле PHP-файлы, которые подключаются в коде скрипта и выводят ту или иную информацию. Со всеми переменными вы можете ознакомится в админке -> шаблоны. Хочу заметить, все переменные для полной/короткой новости ($tpl['post']) работают и для комментариев, и для формы.
Существует так же шаблон mail, он содержит в себе шаблоны всех писем отправляемых скриптом (плагины не в счёт, у них свои шаблоны, определяет их автор плагина и парсятся (обрабатываются) они так же через плагин). По сути, этот шаблон вынесен для перевода пользователями отличными от русского языков.