+22.15
Рейтинг
88.90
Сила
  • avatar kerby
  • 0
После кучи исследований для себя я признал максимально оптимизированным методом получения рандомного топика такой:

Получаем количество топиков и случайным образом выбираем число из этого диапазона, скажем так:
select floor(rand()*count(topic_id)) from prefix_topic


Ну а потом получаем вот этот самый случайный топик:
select * from prefix_topic limit NNNN,1

где NNNN — этот вот самый порядковый номер топика.

Элегантно и эффективно, на мой вкус.
  • avatar kpoxas
  • 0
Размер шрифта заголовка ищите в topic.css

.topic .topic-header .topic-title { font-size: 27px; line-height: 1.1em; font-weight: normal; margin: 0 0 10px; }
  • avatar kpoxas
  • 0
в /classes/modules/topic/entity/Topic.entity.class.php править min и max

$this->aValidateRules[]=array('topic_title','string','max'=>200,'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_create_title'),'on'=>array('topic','link','photoset'));
$this->aValidateRules[]=array('topic_title','string','max'=>200,'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_question_create_title'),'on'=>array('question'));
		
Код счетчика Google Analytics необходимо установить между тэгами <head></head>
Код Яндекс Метрики необходимо установить  между тэгами <body></body>
  • avatar himd
  • 0
В файле whois.tpl шаблона добавил такой код:

{if $oGeoTarget->getRegionId()}
{$oUserProfile->getProfileRegion()|escape:'html'}
{/if}

между

{$oUserProfile->getProfileCountry()|escape:'html'}{if $oGeoTarget->getCityId()},{/if}
{/if}

и этим

{if $oGeoTarget->getCityId()}

И все заработало
На самом деле немного удивлен, почему не сделано так. Это обычная практика. Добавление текущего времени в хэш.
$sCacheName = $sCacheDir."/".md5(serialize($aFiles).'_head' . time()).".{$sType}";
  • avatar Gmugra
  • 0
А я просто в базе жертву убиваю при помощи флажка активации :) как-то так:
UPDATE prefix_user 
SET 
	user_password = concat(user_password,'.ban'), 
	user_mail = concat(user_mail,'.ban'), 
	user_activate = 0,
	user_settings_notice_new_topic = 0,
	user_settings_notice_new_comment = 0,
	user_settings_notice_new_talk = 0,
	user_settings_notice_reply_comment = 0,
	user_settings_notice_new_friend = 0
WHERE	user_id = 43;


id жертвы только найти надо сначала, ну и префикс таблиц в собственной базе знать. :)
  • avatar PSNet
  • 1
  • avatar emmy
  • 1
В файле плагина, в методе activate

можно использовать следующую конструкцию

if(!$this->isFieldExists('prefix_user', 'user_lang')) {
$this->ExportSQL(dirname(__FILE__).'your_sql_file.sql');
}

В результате sql будет выполняться только тогда, когда нет поля user_lang в таблице prefix_user.
У некоторых ls на поддоменах, например, site.ru/lvl1/lvl2/livestreet/.
Можно решить следующим образом:
$sWebPath = rtrim(preg_replace('~^http[s]{0,1}:\/\/[\w\d.-]+~i', '', Config::Get('path.root.web')), '/');
  • avatar vdenu
  • 0
Считается, что с инвайтами в LS действует чудесная схема, хотя на самом деле всё очень примитивно и не вариативно. За инвайты отвечает функция GetCountInviteAvailable() в сlasses\modules\user\User.class.php. Гляньте туда, там не сложно.
  • avatar skif
  • 0
Это не должно быть столь сложно.

1. Обязательным поле можно сделать изменив aValidateRules в сущности пользователя
protected $aValidateRules=array(
                ...
		array('user_profile_name','string','allowEmpty'=>false,'on'=>array('registration','')),
                ...
	);


2. Для вывода в шаблоны сущность пользователя расширить функцией (если проект только стартует и нет пользователей с незаполненным полем ФИО, то функцию можно и не вставлять, а заменить в шаблонах getLogin() на getProfileName() в нужных местах)
public function getRealName() {

	if ($this->_getDataOne('user_profile_name')) {
		return $this->_getDataOne('user_profile_name');
	} else {
		return $this->_getDataOne('user_login');
	}

}
и уже ей заменить все $oUser->getLogin(); (это пожалуй будет самым трудоемким). И этот пункт так же делает невозможным создание плагина потому как нужно будет переписывать много кода в шаблоне. Это конечно же несколько смущает потому как существенно затруднит апгрейд движка.

Ну и соответственно нужно будет добавить необходимые поля в шаблоны и немного кода в экшен регистрации. Если пойти дальше то можно вовсе упразднить логин как таковой, и использовать id пользователя в его качестве.

Вообще можно было бы конечно сделать настройку вида
$config['module']['user']['use_real_names'] = true;
но это уже вопрос к разработчикам и к Максиму в частности )
     public function Init()
    {
        $conn = $this->Database_GetConnect(Config::Get('plugin.wpimport.wpdb'));
        $this->oMapper = Engine::GetMapper(__CLASS__, 'wpimport', $conn);
    }

В модуле когда идет подключеие маппера то передаются параметры подключения к другой базе и все. можешь пользоваться
Я сделал так: engine/lib/internal/template/js/comments.js, ~84 строка:

if (this.iCurrentShowFormComment==idComment && reply.is(':visible')) {
	reply.hide();
	return;
}


Закомментировать

reply.hide();

Т.е:

//reply.hide();
  • avatar PSNet
  • 0
много раз освещалось — в конфиге rewrite ('people' => 'users')
  • avatar PSNet
  • 0
исьюшка: github.com/livestreet/livestreet/issues/298
вроде как решение (не проверял): github.com/livestreet/livestreet/pull/300
СЕО… Звучит угрожающе…
Парни имели ввиду, что при индексации общей ленты страницы, попав в общую ленту не сохраняют свое положение, так как добавляются новые материалы…
Решается очень просто, способов всего два:
1. закрыть от индексации общую ленту (кроме главной) — файл robots.txt
2. понизить значимость ленты в индексе поисковиков — sitemap.xml (смотрите коэффициенты).
и тогда большее значение будет придаваться со стороны ПС именно конкретным статьям, а не потоку.
Я что имею, то введу
и еще, интересные материалы требуют ссылок с других ресурсов, не проставляйте ссыли только на главную…
Блин, спали фишки…
Полный код файла, который получился:
{assign var="oBlog" value=$oTopic->getBlog()}
	{assign var="oUser" value=$oTopic->getUser()}
	{assign var="oVote" value=$oTopic->getVote()}
	{assign var="oFavourite" value=$oTopic->getFavourite()}


	<footer class="topic-footer">
		<ul class="topic-tags js-favourite-insert-after-form js-favourite-tags-topic-{$oTopic->getId()}">
			<li><i class="icon-synio-tags"></i></li>
			
			{strip}
				{if $oTopic->getTagsArray()}
					{foreach from=$oTopic->getTagsArray() item=sTag name=tags_list}
						<li>{if !$smarty.foreach.tags_list.first}, {/if}<a rel="tag" href="{router page='tag'}{$sTag|escape:'url'}/">{$sTag|escape:'html'}</a></li>
					{/foreach}
				{else}
					<li>{$aLang.topic_tags_empty}</li>
				{/if}
				
				{if $oUserCurrent}
					{if $oFavourite}
						{foreach from=$oFavourite->getTagsArray() item=sTag name=tags_list_user}
							<li class="topic-tags-user js-favourite-tag-user">, <a rel="tag" href="{$oUserCurrent->getUserWebPath()}favourites/topics/tag/{$sTag|escape:'url'}/">{$sTag|escape:'html'}</a></li>
						{/foreach}
					{/if}
					
					<li class="topic-tags-edit js-favourite-tag-edit" {if !$oFavourite}style="display:none;"{/if}>
						<a href="#" onclick="return ls.favourite.showEditTags({$oTopic->getId()},'topic',this);" class="link-dotted">{$aLang.favourite_form_tags_button_show}</a>
					</li>
				{/if}
			{/strip}
		</ul>
		
		
		
		<ul class="topic-info">
			<li class="topic-info-author">
				<a href="{$oUser->getUserWebPath()}"><img src="{$oUser->getProfileAvatarPath(24)}" alt="avatar" class="avatar" /></a>
				<a rel="author" href="{$oUser->getUserWebPath()}">{$oUser->getLogin()}</a>
			</li>
			<li class="topic-info-date">
				<time datetime="{date_format date=$oTopic->getDateAdd() format='c'}" title="{date_format date=$oTopic->getDateAdd() format='j F Y, H:i'}">
					{date_format date=$oTopic->getDateAdd() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
				</time>
			</li>
			
			<li class="topic-info-favourite" onclick="return ls.favourite.toggle({$oTopic->getId()},$('#fav_topic_{$oTopic->getId()}'),'topic');">
				<i id="fav_topic_{$oTopic->getId()}" class="favourite {if $oUserCurrent && $oTopic->getIsFavourite()}active{/if}"></i>
				<span class="favourite-count" id="fav_count_topic_{$oTopic->getId()}">{if $oTopic->getCountFavourite()>0}{$oTopic->getCountFavourite()}{/if}</span>
			</li>
		
			{if $bTopicList}
				<li class="topic-info-comments">
					{if $oTopic->getCountCommentNew()}
						<a href="{$oTopic->getUrl()}#comments" title="{$aLang.topic_comment_read}" class="new">
							<i class="icon-synio-comments-green-filled"></i>
							<span>{$oTopic->getCountComment()}</span>
							<span class="count">+{$oTopic->getCountCommentNew()}</span>
						</a>
					{else}
						<a href="{$oTopic->getUrl()}#comments" title="{$aLang.topic_comment_read}">
							{if $oTopic->getCountComment()}
								<i class="icon-synio-comments-green-filled"></i>
							{else}
								<i class="icon-synio-comments-blue"></i>
							{/if}
							
							<span>{$oTopic->getCountComment()}</span>
						</a>
					{/if}
				</li>
			{/if}


			{if $oVote || ($oUserCurrent && $oTopic->getUserId() == $oUserCurrent->getId()) || strtotime($oTopic->getDateAdd()) < $smarty.now-$oConfig->GetValue('acl.vote.topic.limit_time')}
				{assign var="bVoteInfoShow" value=true}
			{/if}
			
			<li class="topic-info-vote">
				<div id="vote_area_topic_{$oTopic->getId()}" class="vote-topic
																	{if $oVote || ($oUserCurrent && $oTopic->getUserId() == $oUserCurrent->getId()) || strtotime($oTopic->getDateAdd()) < $smarty.now-$oConfig->GetValue('acl.vote.topic.limit_time')}
																		{if $oTopic->getRating() > 0}
																			vote-count-positive
																		{elseif $oTopic->getRating() < 0}
																			vote-count-negative
																		{elseif $oTopic->getRating() == 0}
																			vote-count-zero
																		{/if}
																	{/if}
																	
																	{if !$oUserCurrent or ($oUserCurrent && $oTopic->getUserId() != $oUserCurrent->getId())}
																		vote-not-self
																	{/if}
																	
																	{if $oVote} 
																		voted
																		
																		{if $oVote->getDirection() > 0}
																			voted-up
																		{elseif $oVote->getDirection() < 0}
																			voted-down
																		{elseif $oVote->getDirection() == 0}
																			voted-zero
																		{/if}
																	{else}
																		not-voted
																	{/if}
																	
																	{if (strtotime($oTopic->getDateAdd()) < $smarty.now-$oConfig->GetValue('acl.vote.topic.limit_time') && !$oVote) || ($oUserCurrent && $oTopic->getUserId() == $oUserCurrent->getId())}
																		vote-nobuttons
																	{/if}
																	
																	{if strtotime($oTopic->getDateAdd()) > $smarty.now-$oConfig->GetValue('acl.vote.topic.limit_time')}
																		vote-not-expired
																	{/if}

																	{if $bVoteInfoShow}js-infobox-vote-topic{/if}">
					<div class="vote-item vote-down" onclick="return ls.vote.vote({$oTopic->getId()},this,-1,'topic');"><span><i></i></span></div>
					<div class="vote-item vote-count" title="{$aLang.topic_vote_count}: {$oTopic->getCountVote()}">
						<span id="vote_total_topic_{$oTopic->getId()}">
							{if $bVoteInfoShow}
								{if $oTopic->getRating() > 0}+{/if}{$oTopic->getRating()}
							{else}
								<i onclick="return ls.vote.vote({$oTopic->getId()},this,0,'topic');"></i>
							{/if}
						</span>
					</div>
					<div class="vote-item vote-up" onclick="return ls.vote.vote({$oTopic->getId()},this,1,'topic');"><span><i></i></span></div>
					{if $bVoteInfoShow}
						<div id="vote-info-topic-{$oTopic->getId()}" style="display: none;">
							<ul class="vote-topic-info">
								<li><i class="icon-synio-vote-info-up"></i> {$oTopic->getCountVoteUp()}</li>
								<li><i class="icon-synio-vote-info-down"></i> {$oTopic->getCountVoteDown()}</li>
								<li><i class="icon-synio-vote-info-zero"></i> {$oTopic->getCountVoteAbstain()}</li>
								{hook run='topic_show_vote_stats' topic=$oTopic}
							</ul>
						</div>
					{/if}
				</div>
			</li>
			
			{hook run='topic_show_info' topic=$oTopic}
		
		<script type="text/javascript">(function() {
          if (window.pluso)if (typeof window.pluso.start == "function") return;
          var d = document, s = d.createElement('script'), g = 'getElementsByTagName';
          s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true;
          s.src = ('https:' == window.location.protocol ? 'https' : 'http')  + '://share.pluso.ru/pluso-like.js';
          var h=d[g]('head')[0] || d[g]('body')[0];
          h.appendChild(s);
          })();</script>
        <div class="pluso" data-options="small,round,line,horizontal,nocounter,theme=04" data-services="vkontakte,odnoklassniki,facebook,twitter,google,moimir,email,print" data-background="transparent" data-url="{$oTopic->getUrl()}" data-title="{$oTopic->getTitle()|escape:'html'}"></div>
		</ul>

		
		{if !$bTopicList}
			{hook run='topic_show_end' topic=$oTopic}
		{/if}
	</footer>
</article> <!-- /.topic -->


Особое внимание обратите на конец кода для вставки плюсо:
там плюшка со вставкой урла и названия статьи (очень полезно окажется для того чтоб поделиться материалом из общего потока.

Пример как всегда на сайте ДеньД.рф

если нажать на кнопку поделиться в общей ленте, то передастся именно тот материал, к которому относятся кнопки!!!
Например в файле темы topic_part_footer.tpl
замените код блока на такой:

<div class="topic-share" id="topic_share_{$oTopic->getId()}">
			<script type="text/javascript">(function() {
          if (window.pluso)if (typeof window.pluso.start == "function") return;
          var d = document, s = d.createElement('script'), g = 'getElementsByTagName';
          s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true;
          s.src = ('https:' == window.location.protocol ? 'https' : 'http')  + '://share.pluso.ru/pluso-like.js';
          var h=d[g]('head')[0] || d[g]('body')[0];
          h.appendChild(s);
          })();</script>
        <div class="pluso" data-options="small,round,line,horizontal,nocounter,theme=04" data-services="vkontakte,odnoklassniki,facebook,twitter,google,moimir,email,print" data-background="transparent"></div>
		</div>

получится, что вместо стандартного сервиса Zндекса будет показываться Pluso
  • avatar 13i
  • 0