Все же хорошо, что были новогодние каникулы - это позволило мне немного сосредоточиться на написании аггрегатора новостей.
Написано уже порядочное кол-во функций, сейчас дописываются второстепенные функции.
Аггрегатор будет не просто аггрегатором новостей! Функциональность будет такова:
1. Поддержка категорий
Безусловно, эти категории будут относится к IT и языкам программирования. Не обделен будет и Flash... :)
2. Поддержка языков
Конечно, большинство фидов будет на русском языке, но никто не помешает к примеру добавить фид на украинском или английском, а может на казахском или еще каком языке... :)
3. Персональный аггрегатор
Вот тут любому человек, заимеющий аккаунт, сможет самостоятельно добавлять фиды, читать их, обмениваться списком фидов с другими зарегистрированными пользователями...
В скором времени, думаю, что добавиться возможность экспортировать заинтересовавшие посты непосредственно в блог самого пользователя. (Пока этот вопрос на проработке и я его еще не касался, но думаю, что подобное будет не сложно реализовать).
4. Добавление ссылок на посты в закладки на сайте del.icio.us
Если кто хранит свои закладкни на означенном сервисе - думаю, что будет полезным иметь возможность добавлять ссылки на понравившиеся посты непосредственно в ваши закладки.
5. Комментарии к постам
Куда уж тут без комментариев? Любой сможет прокомментировать понравившийся пост. А зарегистированные пользователи смогут сделать это вообще супер просто.
Также прорабатывается вариант по импорту комментариев (где такое разрешается - к примеру WordPress позволяет экспортировать комментарии как RSS) c родного сайта в аггрегатор и соответствующего их визуального оформления...
Также будет предусмотрена возможность подписаться на E-mail уведомления или на RSS-ленту о новых комментариях.
6. Смарт-папки
Эти смарт-папки предусмотрены и для "общественного" и для персонального аггрегатора. Человек сможет самостоятельно добавить смарт-папку, определив при этом ключевое слово или набор оных, и все посты, подпадающие под критерии будут доступны в смарт-папке.
Надеюсь, что это кому-нить пригодится.
Ну, надеюсь, что будет еще кое-что по-мелочи... :)
Как будет устроено все это дело?
Очень просто. Будет один-единственный компонент, который будет отвечать за всю работу аггрегатора.
Сейчас он состоит из 5 базовых функций:
1. ФУНКЦИЯ ПО РАБОТЕ С АККАУНТОМ ПОЛЬЗОВАТЕЛЯ
<cffunction name="AccountService" access="remote" returntype="any" hint="Обеспечивается работа всего комплекса функций по работе с аккаунтом пользователя" output="false">
<cfargument name="handler" type="string" required="yes" hint="Что именно нам предстоит делать с аккаунтом пользователя">
<cfargument name="login" type="string" required="no" hint="Логин пользователя">
<cfargument name="pass" type="string" required="no" hint="Пароль пользователя">
<cfargument name="name" type="string" required="no" hint="Имя и фамилия пользователя">
<cfargument name="email" type="string" required="no" hint="E-mail пользователя">
<cfargument name="siteurl" type="string" required="no" hint="URL сайта или блога пользователя">
<cfargument name="about" type="string" required="no" hint="О пользователе">
<cfargument name="subscriber" type="string" required="no" hint="Подписывается пользователь на комментарии к постам, в которых он оставлял свои комментарии или нет">
<cfargument name="remember" type="string" required="no" hint="Запомнить ли данные пользователя для последующей их подстановки в поля формы">
<cfargument name="language" type="string" required="no" hint="Язык">
<cfargument name="languageid" type="any" required="no" hint="ID языка">
<cfargument name="readwithimages" type="string" required="no" hint="Показывать ли картинки из постов при чтении фидов или нет">
<!--- Определяем какой хандлер вызывается и соответственно действуем --->
<cfif arguments.handler is "MemberLogin"><!--- Если выбрана авторизация пользователя --->
<cfif IsDefined("Session.LogIn")><!--- Если пользователь уже авторизован, то мы принудительно прекращаем его сессию --->
<cfset status = account_memberlogout()>
</cfif>
<cfset status = account_memberlogin(login="#arguments.login#", pass="#arguments.pass#")>
<cfelseif arguments.handler is "MemberLogout"><!--- Если выбрано завершение сеанса --->
<cfset status = account_memberlogout()>
<cfelseif arguments.handler is "MemberRegistration"><!--- Если выбрана регистрация нового пользователя --->
<cfif IsDefined("Session.LogIn")><!--- Если пользователь уже авторизован, то мы принудительно прекращаем его сессию --->
<cfset status = account_memberlogout()>
</cfif>
<cfset status = account_memberregistration(name="#arguments.name#", email="#arguments.email#", login="#arguments.login#", pass="#arguments.pass#", siteurl="#arguments.siteurl#", about="#arguments.about#", remember="#arguments.remember#", subscriber="#arguments.subscriber#", language="#arguments.language#", languageid="#arguments.languageid#", readwithimages="#arguments.readwithimages#")>
<cfelseif arguments.handler is "MemberEditSettings"><!--- Если выбрано изменение настроек и редактирование аккаунта --->
<cfset status = account_membereditsettings(name="#arguments.name#", email="#arguments.email#", login="#arguments.login#", pass="#arguments.pass#", siteurl="#arguments.siteurl#", about="#arguments.about#", remember="#arguments.remember#", subscriber="#arguments.subscriber#", language="#arguments.language#", languageid="#arguments.languageid#", readwithimages="#arguments.readwithimages#")>
<cfelseif arguments.handler is "MemberProfile"><!--- Если просматриваем профиль пользователя --->
<cfset status = account_memberprofile(arguments.login)>
</cfif>
<cfreturn status>
</cffunction>
2. ФУНКЦИЯ ПО РАБОТЕ С ПОСТАМИ
<cffunction name="PostsService" access="remote" returntype="string" hint="Обеспечивается работа всего комплекса функций по работе с постами">
<cfargument name="handler" type="string" required="yes" hint="Что именно нам предстоит делать с постами">
<cfargument name="postid" type="any" required="no" hint="ID поста">
<cfargument name="category" type="string" required="no" hint="Категория">
<cfargument name="categoryid" type="any" required="no" hint="ID категории">
<cfargument name="language" type="string" required="no" hint="Язык">
<cfargument name="languageid" type="any" required="no" hint="ID языка">
<cfargument name="sortby" type="string" required="no" hint="Как сортировать - за день или за все время. Относится к популярным запросам">
<cfargument name="source" type="string" required="no" hint="Название источника поста">
<cfargument name="smart" type="string" required="no" hint="Название смарт-папки">
<cfargument name="smartid" type="any" required="no" hint="ID смарт-папки">
<cfargument name="skip" type="any" required="no" hint="Сколько постов пропустить в выводе">
<!--- Определяем какой хандлер вызывается и действуем --->
<cfif arguments.handler is "GetLatestsPosts"><!--- Выбираем все последние посты --->
<cfset posts = posts_getlatestposts(arguments.skip)>
<cfelseif arguments.handler is "GetByCategory"><!--- Выбираем посты по заданной категории --->
<cfset posts = posts_getbycategory(category="#arguments.category#", categoryid="#arguments.categoryid#", skip="#arguments.skip#")>
<cfelseif arguments.handler is "GetByLanguage"><!--- Выбираем посты по заданному языку --->
<cfset posts = posts_getbylanguage(language="#arguments.language#", languageid="#arguments.languageid#", skip="#arguments.skip#")>
<cfelseif arguments.handler is "GetByPopular"><!--- Выбираем посты по популярности --->
<cfset posts = posts_getbypopular(arguments.sortby)>
<cfelseif arguments.handler is "GetBySource"><!--- Выбираем посты по источнику, автором которых является источник --->
<cfset posts = posts_getbysource(source="#arguments.source#", skip="#arguments.skip#")>
<cfelseif arguments.handler is "GetBySmart"><!--- Выбираем по смарт-папке --->
<cfset posts = posts_getbysmart(smart="#arguments.smart#", smartid="#arguments.smartid#", skip="#arguments.skip#")>
<cfelseif arguments.handler is "GetPost"><!--- Выбираем конкретный пост --->
<cfset posts = posts_getpost(arguments.postid)>
</cfif>
<cfreturn posts>
</cffunction>
3. ФУНКЦИЯ ПО РАБОТЕ С ФИДАМИ
<cffunction name="FeedsService" access="remote" returntype="any" hint="Обеспечивается работа всего комплекса функций по работе с фидами">
<cfargument name="handler" type="string" required="yes" hint="Хандлер для работы с фидами">
<cfargument name="feedid" type="any" required="no" hint="ID фида">
<cfargument name="importfromfriend" type="string" required="no" hint="Импортировать фиды от друга с ником">
<cfargument name="feedids" type="array" required="no" hint="Список (разделенный запятыми) ID фидов">
<cfargument name="sitename" type="string" required="no" hint="Название сайта или блога">
<cfargument name="siteurl" type="string" required="no" hint="URL сайта или блога">
<cfargument name="feedurl" type="string" required="no" hint="URL фида">
<cfargument name="feedtype" type="string" required="no" hint="Тип фида">
<cfargument name="feedinftype" type="string" required="no" hint="Тип распространяемой ифнормации - полная или краткая версия">
<cfargument name="feedlanguage" type="string" required="no" hint="Язык фида">
<cfargument name="feedencoding" type="string" required="no" hint="Кодировка фида. По умолчанию это utf-8">
<cfargument name="categories" type="array" required="no" hint="Список (разделенный запятыми) категорий, к которой относится фид">
<cfargument name="categoriesids" type="array" required="no" hint="Список (разделенный запятыми) ID категорий">
<cfargument name="author" type="string" required="no" hint="ФИО автора фида или владельца сайта или блога">
<cfargument name="authoremail" type="string" required="no" hint="E-mail автора или владельца сайта или блога">
<cfargument name="pingid" type="uuid" required="no" hint="UUID для уведомления аггрегатора">
<cfargument name="personal" type="string" required="no" hint="Персональный ли это фид">
<!--- Определяем хандлер и действуем --->
<cfif arguments.handler is "SubmitFeed"><!--- Регистрация фида --->
<cfset feeds_submitfeed(sitename="#arguments.sitename#", siteurl="#arguments.siteurl#", feedurl="#arguments.feedurl#", feedtype="#arguments.feedtype#", feedinftype="#arguments.feedinftype#", feedlanguage="#arguments.feedlanguage#", feedencoding="#arguments.feedencoding#", categories="#arguments.categories#", categoriesids="#arguments.categoriesids#", author="#arguments.author#", authoremail="#arguments.authoremail#", personal="#arguments.personal#")>
<cfset status = "ok">
<cfelseif arguments.handler is "EditFeed"><!--- Редактирование фида --->
<cfset feeds_editfeed(sitename="#arguments.sitename#", siteurl="#arguments.siteurl#", feedurl="#arguments.feedurl#", feedtype="#arguments.feedtype#", feedinftype="#arguments.feedinftype#", feedlanguage="#arguments.feedlanguage#", feedencoding="#arguments.feedencoding#", categories="#arguments.categories#", categoriesids="#arguments.categoriesids#", author="#arguments.author#", authoremail="#arguments.authoremail#", personal="#arguments.personal#")>
<cfset status = "ok">
<cfelseif arguments.handler is "DeleteFeed"><!--- Удаление фида --->
<cfset feeds_deletefeed(arguments.feedid)>
<cfset status = "ok">
<cfelseif arguments.handler is "PingFeedByURL"><!--- Уведомление по введенному URL --->
<cfset feeds_pingfeedbyurl(arguments.siteurl)>
<cfset status = "ok">
<cfelseif arguments.handler is "PingFeedByUUID"><!--- Уведомление по введенному UUID --->
<cfset feeds_pingbyuuid(arguments.pingid)>
<cfset status = "ok">
<cfelseif arguments.hanfler is "GetFeedInfo"><!--- Получаем информацию о фиде --->
<cfset status = feeds_getfeedinfo(arguments.feedid)>
<cfelseif arguments.handler is "GetPersonalFeeds"><!--- Получаем информацию о персональных фидах --->
<cfset status = feeds_getpersonalfeeds()>
<cfelseif arguments.handler is "ImportFriendFeeds"><!--- Импортируем фиды от друга --->
<cfset feeds_importfriendfeeds(feedids="#arguments.feedids#", importfromfriend="#arguments.inportfromfriend#")>
<cfset status = "ok">
<cfelseif arguments.handler is "ExportFeedsToFriend"><!--- Экспортируем фиды другу --->
<cfset feeds_exportfeedstofriend(feedids="#arguments.feedids#", importfromfriend="#arguments.inportfromfriend#")>
<cfset status = "ok">
<cfelseif arguments.handler is "PingAllFeeds"><!--- Проверяем все зарегистрированные фиды на наличие новых постов --->
<cfset feeds_pingallfeeds()>
<cfset status = "ok">
<cfelseif arguments.handler is "PingAllPersonalFeeds"><!--- Проверяем все персональные фиды на наличие новых постов --->
<cfset feeds_pingallpersonalfeeds()>
<cfset status = "ok">
</cfif>
<cfreturn status>
</cffunction>
4. ФУНКЦИЯ ПО РАБОТЕ С КОММЕНТАРИЯМИ
<cffunction name="CommentsService" access="remote" returntype="any" hint="Обеспечивается работа всего комплекса функций по работе с комментариями">
<cfargument name="handler" type="string" required="yes" hint="Хандлер для работы с комментариями">
<cfargument name="commentid" type="any" required="no" hint="ID комментария">
<cfargument name="postid" type="any" required="no" hint="ID посты">
<cfargument name="author" type="string" required="no" hint="Автор комментария">
<cfargument name="authoremail" type="string" required="no" hint="E-mail автора комментария">
<cfargument name="siteurl" type="string" required="no" hint="URL сайта или блога автора комментария">
<cfargument name="body" type="string" required="no" hint="Тело комментария">
<!--- Отпределям хандлер и работаем --->
<cfif arguments.handler is "SubmitComment"><!--- Добавляем комментарий --->
<cfset comments_submitcomment(postid="#arguments.postid#", author="#arguments.author#", authoremail="#arguments.authoremail#", siteurl="#arguments.siteurl#", body="#arguments.body#")>
<cfset status = "ok">
<cfelseif arguments.handler is "EditComment"><!--- Редактируем комментарий --->
<cfset comments_editcomment(postid="#arguments.postid#", author="#arguments.author#", authoremail="#arguments.authoremail#", siteurl="#arguments.siteurl#", body="#arguments.body#")>
<cfset status = "ok">
<cfelseif arguments.handler is "DeleteComment"><!--- Удаляем комментарий --->
<cfset comments_deletecomment(arguments.commentid)>
<cfset status = "ok">
<cfelseif arguments.handler is "GetPostComments"><!--- Выбираем все комментарии к указанному посту --->
<cfset status = comments_getpostcomments(arguments.postid)>
</cfif>
<cfreturn status>
</cffunction>
5. ФУНКЦИЯ ПОИСКА
Ну, думаю, что эту функцию приводить не обязательно... :)
И еще порядка 25 дополнительных функций и еще порядка 10-15 второстепенных функций.
Как видите, базовые функции являются "рамочными" - т.е. они определяют какое действие необходимо сделать и возлагают все это дело на другие, конкретные, функции, которым передаются все необходимые аргументы... :)
Надеюсь, что и далее смогу вас информировать о продвижении проекта... :)
В конечном результате важен конечный результат!
понедельник, января 16, 2006
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий