Автоматическое подключение блога. Хак.

upd 15/05/10: для тех у кого были проблемы со счетчиком количества подписчиков — архив хака обновлен с инструкциями и функцией для устранения недочета.
Для версии 0.4 выпущен плагин. (тема)


По просьбам выкладываю хак автоматического присоеднинения к блогу, в который юзер опубликовал свой топик.

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

Для тех, у кого нету изменений в движке хак выложен архивом в разделе бесплатных модулей =>Здесь. Для тех у кого есть изменения, или кому невтерпежь ждать модерации,(пройдена) вся информация под катом.


Инфо для правящих измененный код.

Экшены

Идем в classes/actions (Редактировать будем на примере ActionTopic.class.php — в ActionLink.class.php ActionQuestion.class.php сделать по аналогии)

Находим в функциях EventEdit и EventAdd
/**
		 * Получаем данные для отображения формы
		 * Если админ то делаем доступными все блоги
		 */
		$aAllowBlogsUser=array();
		$aBlogsOwner=array();
		if ($this->oUserCurrent->isAdministrator()) {
			$aBlogsOwner=$this->Blog_GetBlogs();
		} else {
			$aBlogsOwner=$this->Blog_GetBlogsByOwnerId($this->oUserCurrent->getId());		
			$aBlogsUser=$this->Blog_GetRelationBlogUsersByUserId($this->oUserCurrent->getId());			
			foreach ($aBlogsUser as $oBlogUser) {
				$oBlog=$this->Blog_GetBlogById($oBlogUser->getBlogId());
				// делаем через "or" чтоб дать возможность юзеру отредактировать свой топик в блоге в котором он уже не может постить, т.е. для тех топиков что были запощены раньше и был доступ в блог
				if ($this->ACL_CanAddTopic($this->oUserCurrent,$oBlog) or $oTopic->getBlogId()==$oBlog->getId()) {
					$aAllowBlogsUser[]=$oBlogUser;
				}
			}
		}

Заменяем в обеих функциях на:
/**
		 * Получаем данные для отображения формы
		 * Если админ то делаем доступными все блоги
		 */
		$aAllowBlogsUser=array();
		$aBlogsOwner=array();
		if ($this->oUserCurrent->isAdministrator()) {
			$aBlogsOwner=$this->Blog_GetBlogs();
		} else {
			$aBlogsOwner=$this->Blog_GetBlogsByOwnerId($this->oUserCurrent->getId());		
			$aBlogsUserCanWrite=$this->Blog_GetBlogsUserCanWrite($this->oUserCurrent->getId(),$this->oUserCurrent->getRating());			
			foreach ($aBlogsUserCanWrite as $oBlogUser) {
				$oBlog=$this->Blog_GetBlogById($oBlogUser->getBlogId());
				// делаем через "or" чтоб дать возможность юзеру отредактировать свой топик в блоге в котором он уже не может постить, т.е. для тех топиков что были запощены раньше и был доступ в блог
				if ($this->ACL_CanAddTopic($this->oUserCurrent,$oBlog) or $oTopic->getBlogId()==$oBlog->getId()) {
					$aAllowBlogsUser[]=$oBlogUser;
				}
			}
		}


После каждой ищем
/**
                 * Загружаем переменные в шаблон
                 */
                $this->Viewer_Assign('aBlogsUser',$aAllowBlogsUser);

заменяем на
/**
                 * Загружаем переменные в шаблон
                 */
                $this->Viewer_Assign('aBlogsUserCanWrite',$aAllowBlogsUser);

В функицях SubmitAdd и SubmitEdit ищем
if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId()) {
				$this->Message_AddErrorSingle($this->Lang_Get('topic_create_blog_error_nojoin'),$this->Lang_Get('error'));
				return false;
			}

Заменяем на
if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId()) {
				$oBlogUserNew=new BlogEntity_BlogUser();
				$oBlogUserNew->setBlogId($oBlog->getId());
				$oBlogUserNew->setUserId($this->oUserCurrent->getId());
				$this->oEngine->Blog_AddRelationBlogUser($oBlogUserNew);
                                /**
					 * Увеличиваем число читателей блога
					 */
					$oBlog->setCountUser($oBlog->getCountUser()+1);
					$this->Blog_UpdateBlog($oBlog);
			}

Все описанные операции (начиная от заголовка «Экшены») необходимо проделать и для ActionLink.class.php ActionQuestion.class.php

Мапперы

Идем в classes/modules/blog

Открываем Blog.class.php и в конец (до закрывающей скобки } ) добавляем

/**
	 * Получает список блогов в которые может писать юзер
	 *
	 * @param unknown_type $sUserId
	 * @return unknown
	 */
	public function GetBlogsUserCanWrite($sUserId,$sUserRating) {
		return $this->oMapperBlog->GetBlogsUserCanWrite($sUserId,$sUserRating);
	}

Открываем classes/modules/blog/mapper/Blog.mapper.class.php и также в конец вставляем

public function GetBlogsUserCanWrite($sUserId,$sUserRating) {
		$sql = "SELECT 
			b.*			 
			FROM 
				".DB_TABLE_BLOG." as b				
			WHERE 				
				b.blog_type<>'personal'
				AND
				b.user_owner_id<> ?
				AND
				b.blog_limit_rating_topic <= ?
				";	
		$aBlogs=array();
		if ($aRows=$this->oDb->select($sql,$sUserId,$sUserRating)) {
			foreach ($aRows as $aUser) {
				$aBlogs[]=new BlogEntity_BlogUser($aUser);
			}
		}
		return $aBlogs;
	}


С самим движком все, переходим к шаблону — тут чуть-чуть.

Темплейты:

Редактируем файлы templates/skin/new/actions/ActionTopic/add.tpl (а также файлы add.tpl других экшенов — ActionLink и ActionQuestion)

Находим во всех трех файлах
{foreach from=$aBlogsUser item=oBlogUser}
    <option value="{$oBlogUser->getBlogId()}" {if $_aRequest.blog_id==$oBlogUser->getBlogId()}selected{/if}>{$oBlogUser->getBlogTitle()}</option>
{/foreach}

Заменяем $aBlogsUser на $aBlogsUserCanWrite

Вот и все. Делал как и говорил, для заказчика. Кто хочет — пример можно посмотреть на yurobzor.ru
Интересный ресурс по поисковой оптимизации. На нем вы найдете много полезной информации по SEO и продвижению.

46 комментариев

avatar
Спасибо за реализацию идеи!
avatar
Пожалуйста :)
Надеюсь, что этот хак поможет, чтобы на многих проектах юзеры не тыкались, не понимая ничего. Очень не понятна система, что чтобы написать в блог, надо сначала в другом абсолютно разделе его найти, и подключиться через малюсенькую кнопочку. И только потом писать в него.
avatar
я тоже не сразу понял как написать в тот или иной блог, т.е. не интуитивно организована система.
avatar
спасибо… только собирался засесть за реализацию, а тут ты. Круто! :)
avatar
Прими мои благодарности! Только об этом хотел попросить своего прогера! ,)
  • pix
  • 0
avatar
Ну теперь у Вас есть возможность попросить вашего прогера сделать для LS что-нибудь другое не менее полезное :)
avatar
Попросил, первый «блин» .)) -> livestreet.ru/blog/2748.html
avatar
работает на отлично :) Огромное спасибо!
avatar
спасибо — всё на высоте. )
  • sn3g
  • 0
avatar
спасибо! вечерком поставлю.

этого реально не хватало!
avatar
Хак классный, особенно для новых проектов — спасибо! Потом будет неудобно, если количество коллективных блогов будет большим.
  • Jet
  • 0
avatar
excellent!!!
avatar
не работает в шаблоне g6h
делал всё по инструкции, в итоге даже если присоединиться к коллективному — всё-равно нельзя в него написать (виден только «мой перс блог»
без этого хака всё в порядке :(
avatar
Либо что-то упустили, либо шаблон виноват(что врядли — все таки структура таже и менять там по сути практически ничего не надо). У меня работает, у заказчика работает, по отзывам в топике тоже работает — вывод?

PS может еще банально ограничение блога на рейтинг для написания топика меньше чем ваш?
avatar
Странно у меня то же не работает на стандартном шаблоне («new»). невидно даже тех постов к которым присоединён. :(
avatar
Ну пишите в аську) будем разбираться.
avatar
проделал заново все шаги, тоже самое.
в экшенах точно всё правильно сделал
в мапперах в конце две скобочки "}" — между ними надо писать?
в темплэйтах т.е. один $aBlogsUser на $aBlogsUserCanWrite заменить? $оBlogsUser не трогаем?
от шаблонов не зависит — на new тоже самое
у админов всё ок, не видят коллективные блоги (даже когда добавят) обычные юзеры
«Рейтинг на доступ к коллективным блогам» — 0
«Порог рейтинга, при котором пользователь может создать коллективный блог» — 0
avatar
Посыпаю голову пеплом. Мой недосмотр. Забыл в код-лист вынести кое-что — в «модулях» кто качал — все работает хорошо, поэтому и отписываются об удачной установке. Надо еще заменить вывод:
/**
		 * Загружаем переменные в шаблон
		 */
		$this->Viewer_Assign('aBlogsUser',$aAllowBlogsUser);

на

/**
		 * Загружаем переменные в шаблон
		 */
		$this->Viewer_Assign('aBlogsUserCanWrite',$aAllowBlogsUser);


После всех тех мест, где изменяли функции с комментарием /*Получаем данные для отображения формы

Поправил в самой теме.
avatar
спасибо! заработало :)
avatar
Та же самая проблема. Для топика, опроса или ссылки.

avatar
Вы читаете что написано выше? :)
avatar
Да я тормоз=) У меня тоже заработало, все прекрасно, Большое СПАСИБО=)
avatar
выше eXtravert ответил, и в самом теме поменял — в экшенах надо допоменять
у меня заработало)
комментарий был удален
avatar
Спасибо! Очень нужная вещь, большинство пользователей действительно путаются и не понимают как написать не в свой блог.
avatar
Чета у меня все равно пользователь видит только присоединенные блоги в списке =/
avatar
Попробуйте внимательнее ставить.
Хак уже скачало больше трех сотен пользователей, предположу, что это ваша ошибка.
Возможно, также с каким-то дополнением конфликтует. Обращайтесь в личку, если что.
avatar
Угу, прошелся Beyond Compare и все встало на свои места ;) Спасибо, отличный хак.
avatar
Для SVN версии, поможете сделать это? :)
avatar
пишите в личку.
avatar
э! зачем в личку. судя по комментам из трака, версия 0.4 грядёт уже на днях. так что тут многие вот вот зададутся эти вопросом =) я в том числе
avatar
Все работает, кроме того, что после постинга юзер не добавляется в юзеры этого блога. Что делать?
avatar
Помогите разобраться пожалуйста. Готов оплатить хлопоты.
avatar
Спасибо, все легко получилось))
avatar
Скачал хак заменил папки — всё работает. До этого пробовал ручками переписать убил 2 часа. То одна проблема то другая, но это скорее всего от моей невнимательности. Новому году скину парочку вебмани.
avatar
Спасибо, кстати, хочу сказать отдельное спасибо BorisBritva — с его внимательностью найден один небольшой недочет — скоро дополню архив и описание.

PS Для 0.4 хак тоже будет переделан.

PPS
Новому году скину парочку вебмани.
кому? :)
avatar
Скачал, установил, да вот проблема…
Юзеры могут опрос в любой блог написать, а вот топик создать не могут, не появились в выпадающем списке при создании топиков коллективные блоги…
Ума не приложу почему, устанавливал заменой всех файлов.
Я смотрю, сегодня обновился хак в каталоге, я как раз скачал после обновления этого, может что сломалось в данной версии хака?
avatar
Упс, извините, а сейчас проверил — всё само заработало, ничего не изменял. Видимо что-то с браузером, закэшировал всё по самое немогу.
Большое спасибо за хак! Странно, что изначально не предусмотрено это в движке.
avatar
Один каверзный вопрос (тока что заметил):

«количество читателей» на странице Коллективных блогов то, скока народу ткнуло в «подписаться», а та же часть юзеров, что автоматом присоединилась к блогу, не учитывается. Т.о. у меня на блог Вопросы-ответы 13 читателей (это на странице блогов), а зайти в сам блог и ткнуть в «О блоге», то 33 (включая и тех, кто был присоединён автоматом).

Чтобы эдакое сделать, чтоб на avtoturistu.ru/blogs тоже высвечивалось фактическое кол-во присоединённого к блогу народа?

спасибо!
avatar
Да, именно это и заметил БорисБритва, я писал выше. Скоро вместе с версией под 0,4 выложу и фикс для 0,31 со скриптиком, который исправит в базе значения.
avatar
И у меня та же проблема.
Скоро будет патчик?
avatar
Фикс очень простой.

В ActionTopic.class.php, ActionLink.class.php, ActionQuestion.class.php, там где мы добавляем

if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId()) {
                                $oBlogUserNew=new BlogEntity_BlogUser();
                                $oBlogUserNew->setBlogId($oBlog->getId());
                                $oBlogUserNew->setUserId($this->oUserCurrent->getId());
                                $this->oEngine->Blog_AddRelationBlogUser($oBlogUserNew);
                        }


на самом деле нужно добавить еще две строчки, которые обновят счетчик

if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId()) {
                                $oBlogUserNew=new BlogEntity_BlogUser();
                                $oBlogUserNew->setBlogId($oBlog->getId());
                                $oBlogUserNew->setUserId($this->oUserCurrent->getId());
                                $this->oEngine->Blog_AddRelationBlogUser($oBlogUserNew);

                                $oBlog->setCountUser($oBlog->getCountUser()+1);
                                $this->oEngine->Blog_UpdateBlog($oBlog);

                        }


Неправильные счетчики правятся простеньким SQL-запросом.
avatar
P.S. Вопрос знатокам:
$this->oEngine->Blog_UpdateBlog($oBlog)
и
$this->Blog_UpdateBlog($oBlog)
эквивалентны?
avatar
да
avatar
думаю, чем копить одинаковый код пачками, лучше хук повесить. того по одной строчке в каждом Action-скрипте и один хук на всё
avatar
это будет не фикс хака, а совсем новый хак :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.