Finar.ru
web.finar.ru
video.finar.ru
Темы для BootstrapNew!

Рецепт pmwiki: создание блога

пошаговая инструкция по программированию блога в pmwiki

Автор: Люди, дата: 2008-06-29, просмотров 9951
Тэги

темы: PmWiki

Я считаю, что в общем случае блог - это функионал, обладающий следующими свойствами:

  • хронологическим заполнением;
  • структурированием по тэгам;
  • возможностью комментирования.

На Finar.ru Блог - это всевозможные заготовки для статей, либо просто размышления и исследования. В wiki-представлении, а вернее в ее pmwiki интерпретации, блог есть сборник заметок, принадлежащий группе 'Blog', со следующими характеристиками.

  • на главной Блога выводится:
    • последняя заметка полностью;
    • ссылками N заголовков последних заметок;
    • архив всех заметок, сортированный по дате добавления;
    • ссылки на страницы с заметками существующих тэгов;
  • заметка характеризуется тэгами;
  • существует шаблон, облегчающий создание заметки;
  • каждому дню соответствует не более одной заметки;
  • к каждой заметке добавлена форма для комментириев благодарных посетителей.

В этой инструкции (или рецепте, если угодно) приведена методика обеспечения подобной функциональности в рамках движка pmwiki. Сухой остаток авторской концепции разработки в том, что все нужно делать настолько просто, насколько это возможно без ущерба базовой функциональности. Поэтому в приведенной инструкции используется максимум встроенных возможностей pmwiki и минимум дополнительных плагинов.

Создаем кнопку "Заблогить о сегодня"

Делать заметки будешь тем чаще, чем проще это сделать. Поэтому первым делом научимся делать магическую кнопочку "пост от текущей даты".

Увы и ах, в текущей стабильной версии (2-1-27) pmwiki нет встроенной переменной с текущей датой (возможно, я ошибаюсь - комментируйте). В новых бетаверсиях, правда, есть, но рисковать лениво. Поэтому для включения текущей даты воспользуемся всей мощью php. Заодно научимся интегрировать php в pmwiki. Понадобится плагин phpinc , после установки которого появляется возможность встроить в любую часть wiki-страницы php-код из файла. Вывести текущую дату в наиболее разумном формате YYYY-MM-DD позволяет файл с немудреным содержанием "<?php echo date("Y-m-d"); ?>". Я назвал его date.php.

Чтобы освободить максимум мозговых ресурсов в будущем, создадим шаблон для всех новых страниц. Для этого в Главный Файл config.php добавим строчку "$EditTemplatesFmt = 'Blog.Template';". Теперь всякая новая страница нашего сайта при создании будет брать свое содержание из служебной страницы Blog.Template. Мой Blog.Template выглядит так:


?КОНТЕНТ?

Категории: [[Category.ENGNAME|+]]
----

При добавлении комментария в каждой строчке следует заменить все заглавные буквы на что-то осмысленное.

Создаем тэги.

Как в pmwiki реализованы тэги вполне доходчиво и на русском описано тут . В двух словах, в pmwiki тэгов нет :) Их роль выполняют служебная Группа, Category (или, впрочем, с любым другим именем), суть содержания всех страниц которой сводится к выведению обратных ссылок. Иначе говоря, тэги - это специальные страницы, которые выводят список всех страниц, которые ссылаются на них. Более подробно функциональность тэгов описана по указанной ссылке.

Чтобы вывести тэги на главной странице воспользуемся встроенным функционалом pmwiki:

(:pagelist group=Category fmt=#title order=title list=normal -Category.Category:)

Этот код выводит все страницы группы Category за исключением корневой Category.Category и служебной Category.Groupfooter и сортирует их в алфавитном порядке по кириллическим заголовкам.

Выводим последние семь заметок.

Ну это совсем просто:

(:pagelist name=Blog.2* count=7 fmt=#title order=-title:)

Последнюю статью выводим с содержанием:

(:pagelist name=Blog.2* count=1 fmt=#include order=-title:)

Казалось бы тоже просто, ан нет. Использованный формат "#include", обеспечивающий включение статьи целиком, не встроен в pmwiki по умолчанию. Поэтому, чтобы приведенный код заработал, "#include" нужно определить. Делается это на служебной странице Site.PageListTemplates путем добавления следующего кода:

!!!fmt=#include

This format includes whole pages, with titles as links to the pages, 
separated by a horizontal rule underneath each page's content. 
An edit link appears if authorised as editor.

[[#include]]
(:if auth edit:)
%rfloat%[[{=$FullName}?action=edit|[-edit-]]](:if:)
!!![[{=$FullName}|[+{=$Title}+]]]
(:include {=$FullName}:)
----
(:if equal {>$Group}:)
(:if:)
[[#includeend]]

Добавляем форму для комментариев.

Для начала я выбрал Comment Box Plus . Эта штуковина просто встраивает комментарии в код комментируемой страницы. Поддерживается защита от спама. Я двинулся по простому пути:

  1. после инсталляции включил защиту от спама(SDV($EnableAccessCode, true) в commentboxplus.php);
  2. создал страницу blog.groupfooter (вот поэтому-то у меня комменты и слетели при выкладке на сайт. Страницу надо было называть Blog.GroupFooter) с содержанием "
    (:commentboХchrono:)
    " (замените X на x). Это автоматически добавляет форму для комментариев ко всем-всем страницам группы Блог.
  3. директивой (:nogroupfooter:) запретил выполнение предыдущего пункта для избранных страниц, например для главной, которая собирается автоматически по кусочком и вообще не обладает своим контентом.
  4. исправил ошибку в 94й строке (см. Проблемы, решения и новые проблемы (безмозглый заголовок))

Создаем Главную Страницу.

Хотите верьте, хотите нет, но в итоге код главной страницы, почти полностью определяющий функциональность блога, выглядит так:

(:nogroupfooter:)
(:pagelist name=Blog.2* count=1 fmt=#include order=-title:)

(:table border=0 width=75% align=center bgcolor=#CCCCCC cellspacing=0 :)
(:cellnr align=center:)
'''Последние заметки:'''
(:cell align=center:)
'''Тэги:'''
(:cellnr align=center:)
(:pagelist name=Blog.2* count=7 fmt=#title order=-title:)
(:cell width=50% align=center:)
(:pagelist group=Category fmt=#title order=title list=normal -Category.Semimanufactures -Category.Category:)
(:cellnr align=right:)
[-[[Blog.Archive|+]]-]
(:tableend:)

----
[[Blog.(:phpinc date:)|Заблогить о сегодня]]

Комментарии:

~Zarg — 12 August 2008, 17:31

А как всетаки поправить проблему в комментах с датой? когда появляется 11 ������ 2008 в посте коммента

Дико извиняюсь за задержку, но ваш вопрос запостился в середину статьи :) Код комментбокса парсит страницу и ищет первое упоминание о себе, не заботясь о том, что его вызов закомментирован. И туда вставляет комментарий.

Как решить проблему? Э-э-э... дайте вспомнить... для этого надо отредактировать 158, 159, 160 сточки вот так:

 
# date and time formats
SDV($JournalDateFmt,'%d %B %Y');
SDV($JournalTimeFmt,'%H:%M');

Finar.

taurus — 12 November 2008, 03:59

Все-таки про тэги.

У тебя в исходниках статей нет ссылок на категории, а есть директивы вида: .... В документации я директивы tags не нашел. Это какая-то прикрученная фича (как ее прикрутить?) или я что-то не понимаю?

Директива tag - это локальная переменная, генерируемая плагином формы ввода данных для режима редактирования. Она появляется при установке плагина editmore.php, о котором я писал здесь: Баг в editmore.php, рецепте для PmWiki В результате ее работы все ссылки на категории хранятся в tag'e, однако, как побочный эффект, ссылки на категории из тела статьи переползают в значения этой же переменной при каждом сохранении страницы (см. следующий ответ)

taurus — 12 November 2008, 04:02

Sorry, движок обработал пример из моего поста как реальную директиву!

Да, это тот самый editmore.php приводит к таким последствиям. Надо от него, наверное, отказаться, либо исправить эту особенность. Вернул бэкап.

Исправлена ошибка в статье: фраза Blog.template везде заменена на Blog.Template.

Finar.


Оставить комментарий 


Ваше имя:
->