Создание типов блогов. (LIVESTREET 0.2!)

Добрый день всем!
Недавно задался вопросом создания нового типа блогов(инструкцию по созданию новых типов топика написал 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 комментариев

avatar

расширения движка это хорошо :)
по сути: ты путаешь тип блога и рубрика(её то как раз и нет) блога. Т.е. blog_type — это не тематическое разделение, а функциональное. Для заведения разных разделов блога нужно добавить в таблицу поле, например, blog_category, которое и будет связывать блоги с категориями(городской, деревенский и т.п.).
По текущей реализации, в маппере стоит b.blog_type<>'city' а нужно наоборот b.blog_type='city'
Экшен ты создал как actions/ActionCities.class.php, а класс в нём не переименовал в class ActionCities extends Action {поэтому он и ругается, что не может найти его
  • ort
  • +2
avatar
Да, расширения движка это круто)))

Спасибо за указание моих косяков. Пошел исправлять — по результатам отпишусь)
avatar
а у тебя нет в планах подобной модернизации… я про дополнительное поле blog_category? Начал делать по этой схеме корпоративные блоги и вот думаю теперь. Там на в модуле блогов довольно много нужно корректировать, если это поле ввести %

дополнительные функции-то ладно, их можно отдельно подключать, а вот родные мне не хотелось бы трогать без особой надобности (
avatar

Забыл упомянуть, что в 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'

Впринципе это самое простое решение для разбиения блогов на категории, для тех, кому не нужно выводить топики из этой группы блогов.
avatar
если коллективные сортируются по типу 'open'
это не так, коллективные могут быть как open, так и close и invate — это в будущем будет поддерживаться
avatar
Да, точно, вру. Сначала показалось, что именно по этому типу они сортируются… Потому и начал делать так.

Вопрос: close — закрытый блог(только по приглашениям), а invate это что будет?
avatar
А как далеко это будущее?
avatar
Судя по всему не в 0,3 версии. В списке задач версии 0,3 такого нет.
avatar
Досадно. Будем ждать…
avatar
А если есть необходимость категоризировать блоги, т.е. при создании каждого блога указывать категорию, чтобы потом можно было их фильтровать в списке всех блогов, этот механизм можно использовать в 0.3b?
avatar
В чем вопрос то? :) «А если». Если бы вы попробовали создать по мануалу эту штуку, то поняли бы что именно о вашем вопросе пост собственно и написан…
На 0,3 работать будет(у меня работает, собственно), только если у вас много типов блогов разумнее сделать переменной этот тип и сделать всего одну функцию для фильтрации…
avatar
Спасибо, прямо сейчас и попробую. Единственный вопрос — как добавить поле в phpMyAdmin, я зашел в prefix_blog, дальше как? Надо выполнить запрос, правильно?
avatar
Вам не поле надо добавить(оно уже есть), а дополнительный тип в enum строковый объект у blog_type. нажмите карандаш у blog_type.
Советую почитать азбуку mysql.
avatar
Еще вопрос =)

Нужно сделать две категории коллективных блогов: категорий_1 и категория_2, причем при выборе «категория_2» нужно, чтобы рядом появлялся еще один выпадающий список с готовыми подкатегориями.
avatar
А это делается параметром onchange у селекта.
Вот например здесь сделано так:
<fieldset>
		<select onchange="window.location.replace('/top/' + this.value + '/');">
			<option value="24h" >Популярные, за последние 24 часа</option>
			<option value="7d" >Популярные, за последние 7 дней</option>
			<option value="30d" >Популярные, за последние 30 дней</option>

			<option value="all" >Популярные навсегда, за все время</option>
		</select>
	</fieldset>


Это уже абсолютно не относится к технической реализации фильтрации в самом движке. Не ленитесь, и поройтесь.
avatar
Да я не ленюсь, просто ничего в этом не понимаю, вот и спрашиваю.
avatar
Так, как советует выше ort. Поле blog_category (это раздел блогов), соответственно в профиле блога теперь ещё и категорию выбирать можно надо. Пример:

(Раздел) Фильмы

На странице actions делаем выборку по категории, в топе блогов этого раздела так же.
  • Sky
  • 0
avatar
Буду делать на этом движке сайт, как раз нужно реализовать тип блога 'close' и 'invite'. Попробую сделать их исходя из этого мануала, т.к. в ООП я пока еще нуль. Ort как скоро можно ждать версии с типами блога 'close' и 'invite'?
avatar
Можно приобрести платный хак ;-)
avatar
Спасибо. Походу я разобрался. Код хорошо закоментирован, еще немного посидеть и сделаю все что мне нужно :)
avatar
кому не сложно киньте пожалуйста уже отредактированные файлы )
  • ID-N
  • -2
avatar
«Неизвестный тип блога» и всё тут!
Колдовал, перепроверял, комменты читал-перечитывал, в БД добавил всё — сдаёмсу!

Кто уже прикрутил?

P.S. LS 0.3
avatar
ALTER TABLE `prefix_blog` CHANGE `blog_type` `blog_type` ENUM( 'personal', 'open', 'invite', 'close','city' ) DEFAULT 'open';

Делал?
  • tih
  • 0
avatar
«Неизвестный тип блога» и всё тут!


Решается так (строка ~505):

classes/actions/ActionBlog.class.php
/**
* Проверяем доступные типы блога для создания
*/
if (!in_array(getRequest('blog_type'),array('open','close','сюда_дописать_нужный'))) {
			$this->Message_AddError($this->Lang_Get('blog_create_type_error'),$this->Lang_Get('error'));
$bOk=false;
}


Правда, это 4 ветка…
avatar
Соответственно, надо добавить в языки нужные значения
avatar
Ребят, вы прикалываетесь? Это инструкция для версии livestreet 0.2
avatar
Все работает аналогично, функции, с которых скопипастины даже названия не поменяли). Просто скопипастить не получится, а логика таже совершенно! Только с кешем лично мне пока не ясно))
avatar
Имею в виду, что с этого топика скопировать не выйдет, а аналогичные функции из тех же файлов скопировать можно!

С кешем все просто
$this->Cache_Set($data, "blog_rating_{$iCurrPage}_{$iPerPage}_$s1", array("blog_update","blog_new"), 60*15);

Эта строчка сейчас немного другая, аналогично надо изменить второй параметр метода Cache_Set на «blog_ваштекст_{$iCurrPage}_{$iPerPage}_$s1» и вуаля, работает ))

Если кому будет нужно, могу расписать аналогичный процесс для последней ветки…
avatar
плагином уж тогда расписывайте

ps надкатегории блогов (те по сути типы блогов) есть в плагине aceblogextender
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.