0
Другие записи за это число:
2010/04/16_01 - Романа Ерыкалова с Днем рождения! Модуль TAGS
<< предыдущая заметкаследующая заметка >>
16 апреля 2010
О нововведениях в движке и модуле LAST

Всех пользователей движка касается, особенно Тему Павлова, разумеется.

Речь пойдет на примере модуля last. Это такая служебная фича, которая выводит на одной странице сразу последние nlast записей блога и позволяет их листать вглубь.

Некоторым нравится делать эту страницу стартовой в блоге (по умолчанию стартовой открывается последняя запись, но можно установить любую страницу по умолчанию, отредактировав в config.php переменную «$rootpage = 'last';»)

Серьезно же я занялся модулем last, когда на сайте LUME понадобилось работать с блоком новостей (с точки зрения движка пофиг, назвать поток записей «блог» или «новости»). И многое пришлось доработать. Значит, по порядку.

1) Стратегия служебных страниц-модулей (всякие там списки, рейтинги, поиски), когда по адресу /last ищется и запускается /module/last.php, который и делает страницу, оказалась не совсем верной. В некоторых случаях это полезно, но чем дальше развивается движок, тем больше требований к нему, и тем меньше желания доверить выдавать конечную страницу отдельно взятому скрипту. К примеру, дизайн страницы last тоже каждому хочется собственный, и его следует задавать в шаблонах, а не копаться в файле last.php, переправляя весь разрозненный ужас.

Поэтому от идеи /module/last.php (и прочих служебных страниц) мы постепенно отходим к идее темплайтов. Выглядит это так: кладется /site_module/last.php — и это уже не программа, выдающая страницу, а посто модуль в формате движка, который выдает движку данные по обращению из кода страницы {_last:_} Это позволяет и служебные страницы верстать как html-темплейты, где в коде имеется обращение {_last:_}. И складывать в той же папке template/last.htm (Чтобы темплейты служебных страниц не путались с темплейтами дизайна страниц блога мы их называем *.htm, в то время как темплайты блога, как мы помним, *.html).

Справедливости ради следует отметить, что вызвать {_last:_} можно из любого места, хоть в тексте заметки блога, только это будет пиздец и рекурсия, если сама заметка попадет в число тех 10, которые она выводит. Рекурсию, впрочем, я отключил на всякий случай, но смысла не появилось. Но если создать отдельную страницу с именем (а не датой в блоге), и в нее прописать только {_last:_}, то это удобно. Я вот себе сделал страницу в простеньком дизайне: http://lleo.aha.ru/blog/lastx Проще говоря, единственный смысл хранить вызов last это в файле, а не в базе, связан с инсталляцией движка, когда новому пользователю надо дать все инструменты, и проще положить файлы, чем запихивать что-то в его базу.


2) Возникает вопрос: ну хорошо, а если модуль last при своем выполнении тоже внутри содержит какие-то элементы дизайна, которыми он выводит нужную информацию? Можно ли как-то ему их передать? Теперь можно. Вызывая модуль, мы можем передать ему параметром некий его конфиг (модуль должен уметь такой конфиг читать, а лучше, если несет в себе еще и переменные по умолчанию — но для всего этого я написал процедурки).

Например, вот так задается теперь обращение к модулю last:

{_LAST:
nskip = 10

next = <small><a href={nextpage}>&lt;&lt;&nbsp;предыдущие {n}</a></small>
prev = <small><a href={prevpage}>следующие {n}</a>&nbsp;&gt;&gt;</small>

prevnext = <table width=100%><tr><td align=left>{next}</td><td align=right>{prev}</td></tr></table><p>

comment = <div style='text-align: right; font-size:10pt; margin-right: 5px'><a href={link}#comments>комментариев {ncomm}</a> | <a href="javascript:majax('comment.php',{a:'comform',id:0,lev:0,comnu:comnum,dat:{num}});">оставить комментарий</a></div>

template = <div style='text-align:justify;padding:0 15px;'><div class='header' id='Header_{num}' style='text-align:left'>{edit}<a href='{link}'>{Y}-{M}-{D}: {Header}</a></div>{zamok}<div id='Body_{num}'>{Body}</div>{comment}</div><hr width=100% color=green>
_}

Ясно? То есть, мы делаем html-шаблон last.htm в том дизайне, какой нам нужен, где центральной командой является обращение {_last:_}. И в этом обращении в понятном текстовом формате передаем все прочие кусочки и шаблоны дизайна, которые модулю last понадобятся.

3) Также при отладке last оказалось, что движок не обучен работать, когда на одной странице отображаются несколько заметок. В смысле, показать он их покажет, но вот система правки и редактирования глючила. Это я тоже поправил, теперь можно править в режиме last любую заметку системой правки и вызывать ее на редактирование в системе редактирования.

PS: 2temapavlov — сорри, пока с категориями cat модуль last не подружился. Впиши их, если надо. Но вообще тэги надо делать отдельной таблицей в базе, иначе плохо работает поиск и индексация. Кроме того, когда-нибудь движок станет многопользовательским, и все равно придется выводить тэги в отдельную таблицу, чтобы можно было искать метки записей (типа «юмор») по блогам всех пользователей.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Linux Opera
 Москва
0
0
Roman Erykalov
Это просто подарок на ДР. Причем, двойной: 1) теперь last можно подключить к дизайну понятным мне способом, и 2) я вижу, что тэги замаячили на горизонте.
Вот спасибо!
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Ух ты! А ты тоже last пользуешь?

С Днем рождения!!!
Linux Opera
 Москва
0
0
Roman Erykalov
Спасибо за поздравления. Last у меня висит в меню. Не знаю только, нажимал туда кто-то или нет. И здесь почему-то исчезли в комментах все кнопочки кроме "скрыть". Правда, Артем уже нашел шаманский ход :-)
Linux Firefox
0
0
Артем Павлов
Если я правильно понял, то таблицу тэгов нужно сделать по образу таблицы посетителей, т.е. два поля: тэг и ид_записи?
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Я думаю, так:

-- --------------------------------------------------------
--
-- Структура таблицы `dnevnik_tags`
--

CREATE TABLE IF NOT EXISTS `dnevnik_tags` (
`num` int(10) unsigned NOT NULL COMMENT 'id заметки',
`tag` varchar(128) NOT NULL COMMENT 'имя тэга',
PRIMARY KEY (`num`,`tag`(128)),
KEY `tag` (`tag`(128)),
KEY `num` (`num`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


При записи заметки:
1) Удалить из базы все записи с номером num этой заметки
2) Для каждого из тэгов заметки записать в базу новую запись тэг-num

При поиске заметок по тэгам - что-то типа:

SELECT zapisi.* FROM `dnevnik_zapisi` AS zapisi, `dnevnik_tags` AS tags
WHERE tags.`tag`='юмор' AND zapisi.`num`=tags.`num`

Но это я позже, ладно?
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Да, и соответственно, для каждой заметки придется выводить ее тэги: SELECT `tag` FROM `dnevnik_tags` WHERE `num`='123'
Linux Firefox
0
0
Артем Павлов
Кстати, щас заметил, когда оставляешь комментарий, то он сначала оказывается под листалкой страниц и у него появляется кнопка "ответить", после перезагрузки появляется где надо и кнопка пропадает. Еще кнопка ответить вылезла после того, как я отредактировал комментарий.
Linux Firefox
 Москва
0
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
В смысле - там, в LAST?
Linux Firefox
0
0
Артем Павлов
Неа, здесь сейчас произошло. Еще кнопка "ответить" появляется если скрыть и раскрыть комментарий.
Windows Firefox
0
0
Andrey aka Mem0
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Меня давно интересует вопрос, а можно ли сделать так, что бы записи в блоге листались без перезагрузки страницы? что бы оно, конечно, подгружалось после клика на ссылку, но что бы вся страница оставалась такой же.
Linux Firefox
 Москва
1
0
LLeo
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Теоретически можно. Практически - не вижу смысла.

Когда я закончу оптимизацию движка и вынесу все скрипты и css отдельно, обвязка страницы окажется минимальной, поэтому разницы в весе не будет.

Зато листание без перезагрузки - это очень большие технические проблемы. Например, надо обновить поле title страницы (ведь надо, верно?), поля "следующая" - "предыдущая", счетчик, комментарии и еще кучу мест, не связанных, казалось бы, с текстом самой заметки. А если следующая заметка потребует дополнительных скриптов и css, которых не было при загрузке изначальной страницы? Это говно все тоже надо будет подгрузить. В общем, геморроя на полгода, а выигрыш сомнительный (а то и отрицательный - не факт, что аякс грузится быстрее, чем страница).

всего комментариев: 11

<< предыдущая заметка следующая заметка >>