Разделение блогов на разделы.

Как уже говорил сама идея сперта у netuser, реализовал своими руками.
netuser предлагал создать дополнительное поле в базе данных. я же не любитель так нагружать базу и воспользовался уже имеющимся полем в таблице prefix_blog, которое называется blog_type.
Сразу скажу, просто так воспользоваться этим столбцом низя. Поэтому мне пришлось все же внести изменения в базу. в данном поле есть ограничение по вводимым данным, поэтому мне пришлось добавить туда названия новых категорий.
после чего я открыл
templates/skin/new/actions/ActionBlog/add.tpl
и внес следующие изменения:
<p><label for="blog_type">{$aLang.blog_create_type}:</label><br />
<select name="blog_type" id="blog_type" onChange="">
<option value="kollektiv">{$aLang.blog_create_type_kollektiv}</option>
<option value="tematik">{$aLang.blog_create_type_tematik}</option>
<option value="open">{$aLang.blog_create_type_open}</option>
</select><br />

из привиденного кода видно что добавил двестрочки с указанием новых полей, это для того чтобы при создании нового блого можно было сразу указать к какой категории его отнести.
Далее изменения коснулись
classes/modules/blog/mapper/blog.maper.class.php
в который было добавленно необходимое количество функций-запросов к базе на выборку данных:
/****Коллективные блоги****/
	public function GetKollektivBlogsRating(&$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 = 'kollektiv'                                                    
                                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;
}


все изменения в этих функциях это название функции и условие отбора.
кстати. вот уж не знаю то ли в исходном коде движка так было, то ли в тех дополнениях что я ставил на движок, но обнаружил что некоторые SQL запросы не совсем корректно написаны. Самое удивительное что они правильно работали, да и ошибкой собственно это не назовешь, не везде просто были пробелы между «выражением» и знаками условия. И в одном месте вместо != (не равно) стояло <> (больше или меньше), что в принципе приводит к одному результату в нашем случае. ну да не важно… это мелочь которая может сказываться только при очень большом числе однотипных запросов.

соответственно создав необходимое количество таких функций я перешел к следующему файлу:
classes/modules/blog/blog.class.php

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

public function GetKollektivBlogsRating($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->GetKollektivBlogsRating($iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
                $this->Cache_Set($data, "blog_rating_{$iCurrPage}_{$iPerPage}_$s1", array("blog_update","blog_new"), 60*15);
        }
        return $data;
}

здесь так же изменения минимальны. практически копи-паст, только меняем название функции и название той функции к которой обращается сия функция.

Далее открываем файл
classes/actions/ActionBlog.php там я не стал менять имеющийся эвент, а просто по аналогии создал свой, знаю что не правильно это, но оставил я старый из соображений того что если мне придется отказаться от этой затеи будет просто удалить этот, а не вносить заново изменения.

/****************************************************/
	protected function EventShowAllBlogs() {		
		/**
		 * Передан ли номер страницы
		 */			
		$iPage=	preg_match("/^\d+$/i",$this->GetEventMatch(2)) ? $this->GetEventMatch(2) : 1;
		/**
		 * Получаем список блогов
		 */
		$aResult=$this->Blog_GetBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aBlogs=$aResult['collection'];
		$aAllResult=$this->Blog_GetAllBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aAllBlogs=$aAllResult['collection'];	
		$aKollektivResult=$this->Blog_GetKollektivBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aKollektivBlogs=$aKollektivResult['collection'];	
		$aOpenResult=$this->Blog_GetOpenBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aOpenBlogs=$aOpenResult['collection'];		
		$aTematikResult=$this->Blog_GetTematikBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aTematikBlogs=$aTematikResult['collection'];	
		$aPersonalResult=$this->Blog_GetPersonalBlogsRating($iPage,BLOG_BLOGS_PER_PAGE);	
		$aPersonalBlogs=$aPersonalResult['collection'];


		/**
		 * Формируем постраничность
		 */	
		$aPersonalPaging=$this->Viewer_MakePaging($aPersonalResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);
		$aTematikPaging=$this->Viewer_MakePaging($aTematikResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);
		$aOpenPaging=$this->Viewer_MakePaging($aOpenResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);
		$aKollektivPaging=$this->Viewer_MakePaging($aKollektivResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);
		$aAllPaging=$this->Viewer_MakePaging($aAllResult['count'],$iPage,BLOG_BLOGS_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOGS);	

		/**
		 * Загружаем переменные в шаблон
		 */
		$this->Viewer_Assign('aPersonalPaging',$aPersonalPaging);					
		$this->Viewer_Assign("aPersonalBlogs",$aPersonalBlogs);
		$this->Viewer_Assign('aTematikPaging',$aTematikPaging);					
		$this->Viewer_Assign("aTematikBlogs",$aTematikBlogs);
		$this->Viewer_Assign('aOpenPaging',$aOpenPaging);					
		$this->Viewer_Assign("aOpenBlogs",$aOpenBlogs);
		$this->Viewer_Assign('aKollektivPaging',$aKollektivPaging);					
		$this->Viewer_Assign("aKollektivBlogs",$aKollektivBlogs);
		$this->Viewer_Assign('aAllPaging',$aAllPaging);					
		$this->Viewer_Assign("aAllBlogs",$aAllBlogs);
		$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_menu_all_list'));
		/**
		 * Устанавливаем шаблон вывода
		 */
		/*$this->SetTemplateAction('index');*/

Дальше все просто…
в файле templates/skin/new/blog_list.tpl
изменения и все… вроде как кажется готово…
но вот оказалось что нет…
я сейчас уже не вспомню какие файлы я менял, но эти все файлы были mapper или classes, вообщем пришлось расширить некоторые запросы, связанные с b.blog_type, чтобы не утомлять себе перебором всех файлов я просто воспользовался поиском по файлом и их оказалось около 5 шт всего.
там пришлось где встречалось условие связанное с b.blog_type и значением open добавить еще и новые значения.
иначе возникает интересный глюк на сайте. Создать блог ты можешь, создать тут же в блоге топик, тоже можешь и тут же его прокомментировать, но вот посмотреть его среди списка топиков не можешь, его не видно.
вот в принципе и все.
Осталось разобраться как исправить персональные блоги, поскольку фактически вывод персональных это не блог, а список всех топиков пользователя и тех в том числе которые им были написаны в коллективных блогах.
Ах да… и еще нужно внести поправки в разбиение на страницы не правильно переадресовывает. Я даже знаю почему, но вот руки не доходят пока что.

3 комментария

avatar
Жесть.
и воспользовался уже имеющимся полем в таблице prefix_blog, которое называется blog_type
Очень зря, еще давным давно, когда я писал это для 0,2 livestreet.ru/blog/sollutions/444.html обсудили, что это не очень разумно делать, даже если не смотреть на раздвоение логики (это блог_тайп это функциональное разделение, а не логическое), то это просто глупо делать по причине описанной вами же:
добавляем необходимое количество однотипных функций.
А еще кучу enum типов в базе, ага. И кучу правок в логике фильтраторов топиков, иначе все будет тупить.
avatar
именно поэтому и делил по этому полю… потому что функционально…
в моем проекте есть четыре разных функциональных раздела.
вот их и отделил. в будущем планируется 5 функциональный раздел, но под него уже в базе все есть, останется внести необходимые условия.
так же как в проекте предусмотрено два каталога и мне пришлось попотеть чтобы поставить два ЛС-Каталога на один движок.
avatar
Ушел учить Php
  • O3OH
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.