Создание типов блогов. (LIVESTREET 0.2!)
Добрый день всем!
Недавно задался вопросом создания нового типа блогов(инструкцию по созданию новых типов топика написал benone за что ему огромное спасибо). На своем проекте я задумал реализовать еще дополнительные типы блогов, которые бы имели возможность выводиться отдельно от остальных(Тобишь некое подобие группы коллективных блогов). В моем случае это блоги по городам — их надо отделить от остальных коллективных блогов-обсуждений.
Для начала я добавил в поле blog_type возможное значение 'city'
После в шаблоне для создания Блога в чекбоксе добавил второй тип помимо open.
Теперь при создании блога его тип добавляется в БД.
Реализовать вывод списка только городских блогов я решил на основе экшена Blogs.
Создаю actions/ActionCities.class.php
class ActionBlogs extends Action {
Функция GetBlogsRating(на основе которой я создал GetBlogsCities) для вывода блогов у экшена Blogs расположена в модуле blog.
Туда же пробуем добавить функцию GetBlogCities(абсолютно похожие с родителем GetBlogsRating
В Blog.class.php
В маппер блогов добавляем функции для работы с базой данных, получающие блоги с типом city
В config.route.php добавляю экшен связанный с запросом cities.
В шаблоны добавляю шаблон схожий с Blogs action/ActionCities/index.tpl
Вывод городских блогов в стиле коллективных — топиками мне не нужен — хотел реализации вывода в стиле списка всех блогов. Поэтому делать его я и не планировал.
Думаю не я один хотел бы создать новые типы блогов(те же хабраподобные Корпоративные блоги также возможно кому то нужны). Давайте вместе сделаем мануал по их созданию, как benone сделал по типу топиков(также и по выводу такой группы блогов в стиле коллективных — топиками) Пока грамотно как видите реализовать не удалось.
Помогите найти мои ошибки — вместе мы сделаем возможный функционал лайвстрита шире и лучше)
Пока топик в «решение проблем» после составления мануала можно даже в «техническую документацию» будет перенести.
С уважением, Владимир.
Недавно задался вопросом создания нового типа блогов(инструкцию по созданию новых типов топика написал benone за что ему огромное спасибо). На своем проекте я задумал реализовать еще дополнительные типы блогов, которые бы имели возможность выводиться отдельно от остальных(Тобишь некое подобие группы коллективных блогов). В моем случае это блоги по городам — их надо отделить от остальных коллективных блогов-обсуждений.
Для начала я добавил в поле blog_type возможное значение 'city'
После в шаблоне для создания Блога в чекбоксе добавил второй тип помимо open.
<label for="blog_type">Тип блога:</label>
<select name="blog_type" id="blog_type" style="width: 100%;" onChange="">
<option value="open">Открытый</option>
<option value="city">Город</option>
</select>
</p>
Теперь при создании блога его тип добавляется в БД.
Реализовать вывод списка только городских блогов я решил на основе экшена Blogs.
Создаю actions/ActionCities.class.php
class ActionBlogs extends Action {
/**
* Класс обработки УРЛа вида /cities/
*
*/
class ActionCities extends Action {
public function Init() {
}
protected function RegisterEvent() {
$this->AddEventPreg('/^(page(\d+))?$/i','EventShowCities');
}
/**********************************************************************************
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
**********************************************************************************
*/
protected function EventShowCities() {
/**
* Передан ли номер страницы
*/
$iPage= preg_match("/^\d+$/i",$this->GetEventMatch(2)) ? $this->GetEventMatch(2) : 1;
/**
* Получаем список блогов
*/
$aResult=$this->Blog_GetBlogsCities($iPage,BLOG_BLOGS_PER_PAGE);
$aBlogs=$aResult['collection'];
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/blogs');
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign("aBlogs",$aBlogs);
$this->Viewer_AddHtmlTitle('Список городских команд');
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('index');
}
}
Функция GetBlogsRating(на основе которой я создал GetBlogsCities) для вывода блогов у экшена Blogs расположена в модуле blog.
Туда же пробуем добавить функцию GetBlogCities(абсолютно похожие с родителем GetBlogsRating
В Blog.class.php
/**
* Получает список команд городов по рейтингу
*
* @param unknown_type $iLimit
* @return unknown
*/
public function GetBlogsCities($iCurrPage,$iPerPage) {
$s1=-1;
if ($this->oUserCurrent) {
$s1=$this->oUserCurrent->getId();
}
if (false === ($data = $this->Cache_Get("blog_rating_{$iCurrPage}_{$iPerPage}_$s1"))) {
$data = array('collection'=>$this->oMapperBlog->GetBlogsCities($iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
$this->Cache_Set($data, "blog_rating_{$iCurrPage}_{$iPerPage}_$s1", array("blog_update","blog_new"), 60*15);
}
return $data;
}
В маппер блогов добавляем функции для работы с базой данных, получающие блоги с типом city
/**запрашивает блоги по типу город*/
public function GetBlogsCities(&$iCount,$iCurrPage,$iPerPage) {
$iCurrentUserId=-1;
if (is_object($this->oUserCurrent)) {
$iCurrentUserId=$this->oUserCurrent->getId();
}
$sql = "SELECT
b.*,
u.user_profile_avatar as user_profile_avatar,
u.user_profile_avatar_type as user_profile_avatar_type,
u.user_login as user_login,
IF(bu.blog_id IS NULL,0,1) as current_user_is_join
FROM
".DB_TABLE_BLOG." as b
LEFT JOIN (
SELECT
blog_id
FROM ".DB_TABLE_BLOG_USER."
WHERE user_id = ?d
) AS bu ON b.blog_id = bu.blog_id,
".DB_TABLE_USER." as u
WHERE
b.blog_type='city'
AND
b.user_owner_id=u.user_id
ORDER by b.blog_rating desc
LIMIT ?d, ?d
;
";
$aReturn=array();
if ($aRows=$this->oDb->selectPage($iCount,$sql,$iCurrentUserId,($iCurrPage-1)*$iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
$aReturn[]=new BlogEntity_Blog($aRow);
}
}
return $aReturn;
}
В config.route.php добавляю экшен связанный с запросом cities.
'cities' => 'ActionCities',
В шаблоны добавляю шаблон схожий с Blogs action/ActionCities/index.tpl
Вывод городских блогов в стиле коллективных — топиками мне не нужен — хотел реализации вывода в стиле списка всех блогов. Поэтому делать его я и не планировал.
Думаю не я один хотел бы создать новые типы блогов(те же хабраподобные Корпоративные блоги также возможно кому то нужны). Давайте вместе сделаем мануал по их созданию, как benone сделал по типу топиков(также и по выводу такой группы блогов в стиле коллективных — топиками) Пока грамотно как видите реализовать не удалось.
Помогите найти мои ошибки — вместе мы сделаем возможный функционал лайвстрита шире и лучше)
Пока топик в «решение проблем» после составления мануала можно даже в «техническую документацию» будет перенести.
С уважением, Владимир.
29 комментариев
расширения движка это хорошо :)
по сути: ты путаешь тип блога и рубрика(её то как раз и нет) блога. Т.е. blog_type — это не тематическое разделение, а функциональное. Для заведения разных разделов блога нужно добавить в таблицу поле, например, blog_category, которое и будет связывать блоги с категориями(городской, деревенский и т.п.).
По текущей реализации, в маппере стоит b.blog_type<>'city' а нужно наоборот b.blog_type='city'
Экшен ты создал как actions/ActionCities.class.php, а класс в нём не переименовал в class ActionCities extends Action {поэтому он и ругается, что не может найти его
Спасибо за указание моих косяков. Пошел исправлять — по результатам отпишусь)
дополнительные функции-то ладно, их можно отдельно подключать, а вот родные мне не хотелось бы трогать без особой надобности (
Забыл упомянуть, что в ActionBlog.class.php надо добавить возможный тип топика
if (!in_array(getRequest('blog_type'),array('open','city'))) {
$this->Message_AddError('Неизвестный тип блога','Ошибка');
$bOk=false;
В файле include/ajax/joinLeaveBlog.php
надо также добавить дополнительный тип.
/*** Как только заработают другие виды блогов(кроме open) тут нужно внести коррективы, чтоб можно было покинуть блог по приглашениям*/
$oUserCurrent=$oEngine->User_GetUserCurrent();
if ($oBlog->getType()=='open' or 'city') {
Рубрик нет, поэтому и пришло первое в голову — сортировать по типу(если коллективные сортируются по типу 'open'
Впринципе это самое простое решение для разбиения блогов на категории, для тех, кому не нужно выводить топики из этой группы блогов.
это не так, коллективные могут быть как open, так и close и invate — это в будущем будет поддерживаться
Вопрос: close — закрытый блог(только по приглашениям), а invate это что будет?
На 0,3 работать будет(у меня работает, собственно), только если у вас много типов блогов разумнее сделать переменной этот тип и сделать всего одну функцию для фильтрации…
Советую почитать азбуку mysql.
Нужно сделать две категории коллективных блогов: категорий_1 и категория_2, причем при выборе «категория_2» нужно, чтобы рядом появлялся еще один выпадающий список с готовыми подкатегориями.
Вот например
Это уже абсолютно не относится к технической реализации фильтрации в самом движке. Не ленитесь, и поройтесь.
можнонадо. Пример:(Раздел) Фильмы
На странице actions делаем выборку по категории, в топе блогов этого раздела так же.
Колдовал, перепроверял, комменты читал-перечитывал, в БД добавил всё — сдаёмсу!
Кто уже прикрутил?
P.S. LS 0.3
Делал?
Решается так (строка ~505):
Правда, это 4 ветка…
С кешем все просто
Эта строчка сейчас немного другая, аналогично надо изменить второй параметр метода Cache_Set на «blog_ваштекст_{$iCurrPage}_{$iPerPage}_$s1» и вуаля, работает ))
Если кому будет нужно, могу расписать аналогичный процесс для последней ветки…
ps надкатегории блогов (те по сути типы блогов) есть в плагине aceblogextender