+0.21
Рейтинг
1.25
Сила

Vlad

Как вынести количество публикаций каждого пользователя на страницу пользователей

Данный топик — расширенный ответ на вопрос, заданный в этом топике т.к. мне уже не первый раз задают этот вопрос.

Нужно в файле сущности пользователя \classes\modules\user\entity\User.entity.class.php (например, после 453 строки) дописать метод:
/**
 * Возвращает количество созданных пользователем топиков и комментариев
 *
 * @return int
 */
public function getPublicationsCount() {
  $iCountTopicUser = $this->Topic_GetCountTopicsPersonalByUser($this->getId(), 1);
  $iCountCommentUser = $this->Comment_GetCountCommentsByUserId($this->getId(), 'topic');
  return $iCountTopicUser + $iCountCommentUser;
}


Читать дальше →

Как бороться с нагрузкой на MYSQL?

Здравствуйте.
Начну с того, что есть сайт с посещаемостью до 20к людей.
Периодически выстраивается большая очередь запросов к БД и тут сайт стает недоступный.
Запросов в секунду до 9, онлайн людей до 90.
Крутится сайт на выделенном сервере Intel® Core™ i7-4770 Quadcore, 2 x 2 TB 6 Gb/s SATA 7200, 16 GB DDR3.
Читать дальше →

Условие {if/else}

В общем, возникла потребность выделить администраторов среди обычных пользователей в списке аккаунтов.
С помощью html и css добавил иконку и написал вот такое условие:
{if $oUserCurrent->isAdministrator()}<style> .item-avatar {
background: url(*****.png) no-repeat;
background-size: 30px;
background-position: 85% 100%;
}</style>
{else}

{/if}

Правда, если я захожу на страницу списка пользователей без авторизации, то возникает ошибка:

А если захожу с администратора, то иконки появляются у всех пользователей.
Возможно ли как-нибудь поменять условие, чтобы всё правильно отображалось?
Другими словами, мне нужно условие, которое сможет проверить, админ ли юзер.

UPD:

Если кому-то понадобится сделать что-то подобное, то напишите похожий алгоритм.
{assign var="name" value=$oUserList->getLogin()} *вытаскиваем логин из базы данных*
<div class="
       {if $name eq 'Имя_пользователя' or $name eq 'Имя_пользователя_2' or $name eq 'Имя_пользователя_3'}
             *class/id div'a*
       {else}
             *class/id div'a*
       {/if}">

Отображение постов (Количество и ID блога) [Решено]

Доброго времени суток.

Возник вопрос: Можно ли средством кода указать в topic_list.tpl (Или где правильнее?) количество топиков и ID из какого блога отображать топики?

Заранее спасибо за помощь.
______________________________________

Решение предоставил AlikMis.

{assign var="aFilter" value=[
	// список id блогов 
	'blog_id' => [
		1, 2, 3
	],
	// список типов блогов 
	'blog_type' => [
		'personal', 'open'
	],
	// список id пользователей
	'user_id' => [
		1, 2, 3
	],
	// опубликован топик или нет
	'topic_publish' => 1/0,
	// выборка по рейтингу топика
	'topic_rating' => [
		// значение рейтинга
		'value' => 1,
		// ваше/ниже значения рейтинга
		'type' => 'top'/'down',
		// или те что отправлены на главную админом, работает только при 'type' => 'top'
		'publish_index'  => 1
	],
	// список типов топиков
	'topic_type' => [
		'topic', 'link', 'question', 'photoset'
	],
	// топики созданные позднее или в это время этой даты
	'topic_new' => 'Y-m-d H:i:s',
	// топики созданные позднее этой даты
	'topic_date_more' => 'Y-m-d H:i:s'
]}
{assign var="iCountTopic" value=COUNTTOPIC}
{assign var="aTopicsByBlog" value=$LS->Topic_GetTopicsByFilter($aFilter, 1, $iCountTopic)}
{include file='topic_list.tpl' aTopics=$aTopicsByBlog['collection']}

Пример вывода постов:

{assign var="aFilter" value=[
	'blog_id' => 2,
	'topic_publish' => 1
]}
{assign var="iCountTopic" value=5}
{assign var="aTopicsByBlog" value=$LS->Topic_GetTopicsByFilter($aFilter, 1, $iCountTopic)}
{include file='topic_list.tpl' aTopics=$aTopicsByBlog['collection']}

Тире перед перед концом строки неправильно сохраняется. (РЕШЕНО)

Уже давно на сайте наблюдается такая проблема: если в тексте в конце строки стоит знак тире ("—"), то после сохранения текста редактор или jevix кушают конец строки и две строки слипаются. Мелочь, а не приятно, учитывая, что основной контент — стихотворный. Сейчас приходится после тире ставить пробел, а уже затем перевод строки. Кто-то может подсказать, как это вылечить?
Редактор — tyni МСЕ, пример с сайта:
Дантово озеро, Рейлевы острова — Не останавливай память, предвиденью не завидуй.
Решение найдено PSNet 'ом, под катом

Читать дальше →

Вывод блока прямой эфир и теги

Нужно отключить вывод на страницах топиках блоки в садбаре «Прямой эфир» и «Теги», но при этом что бы на главной и в блогах все это осталось. Подскажите, что нужно изменить или дописать в файле config.php

Email рассылка + LS 1.0.3

Доброго времени суток!
Подскажите кто знает решение следующей проблемы:
Имеется промо-страница (плагин), на этой странице (actions/ActionPromopage/index.tpl) разместил форму подписки на рассылку email сообщений. Код с формой
<script type='text/javascript'>
    var dateFormat="dd.mm.yyyy",us_msg={missing:'Не задано обязательное поле: "%s"',invalid:'Недопустимое значение поля: "%s"',email_or_phone:"Не задан ни email, ни телефон",email_absent:"Не указан электронный адрес",phone_absent:"Не указан телефон",no_list_ids:"Не выбрано ни одного списка рассылки"},us_emailRegexp=/^[a-zA-Z0-9_+=-]+[a-zA-Z0-9\._+=-]*@[a-zA-Z0-9][a-zA-Z0-9-]*(\.[a-zA-Z0-9]([a-zA-Z0-9-]*))*\.([a-zA-Z]{2,6})$/,us_phoneRegexp=/^\s*[\d +()-.]{7,32}\s*$/;
    if(typeof us_=="undefined")
    var us_=new function(){
        function i(a){
            var b=a.getElementsByTagName("input");
            for(var c=0;c<b.length;c++){
                var d=b[c];if(d.getAttribute("name")=="charset"){d.value==""&&(d.value=document.characterSet?document.characterSet:document.charset);
                return}
            }
        }
        function j(a){
            var b=document,c=b.createElement("div");
                c.style.position="absolute",c.style.width="auto",c=b.body.appendChild©,c.appendChild(a),a.style.display="",d.push©
            }
            function k(){
                var a=window,b=document,c=a.innerWidth?a.innerWidth:b.body.clientWidth,e=a.innerHeight?a.innerHeight:b.body.clientHeight;
                for(var f=0;f<d.length;f++){
                    var g=d[f],h=parseInt(g.offsetWidth+""),i=parseInt(g.offsetHeight+"");g.style.left=(c-h)/2+b.body.scrollLeft+f*10,g.style.top=(e-i)/2+b.body.scrollTop+f*10}
            }
            var a=!1,b=window.onload;window.onload=function(){
                us_.onLoad()};var c=null,d=[],e=!1,f=!1,g={},h=new Event("loadFormJavascript");window.addEventListener("loadFormJavascript",function(){us_.onLoad()},!1),this.onLoad=function(){
                    var d,e=document.getElementsByTagName("form"),f=[];for(d=0;d<e.length;d++)f.push(e[d]);for(d=0;d<f.length;d++){
                        var g=f[d],h=g.getAttribute("us_mode");
                        if(!h)continue;h=="popup"&&j(g),i(g)}k(),c=window.onresize,window.onresize=function(){
                            us_.onResize()},a=!0,b&&b();var l=document.getElementsByClassName("formdatepicker");
                            for(var d in l)var m=new Pikaday({field:l[d],format:dateFormat.toUpperCase()})},this.onResize=function(){k(),c&&c()},trim=function(a){
                                return a==null?"":a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},this.onSubmit=function(b){
                                    return a?(_hideErrorMessages(b),!_validateTextInputs(b)||!_validateCheckboxes(b)||!_validateRadios(b)?!1:!0):(alert("us_.onLoad() has not been called"),!1)},_validateTextInputs=function(a){
                                        var b=a.querySelectorAll("input[type=text]");
                                        if(b.length==0)return!0;
                                        for(var c=0;c<b.length;c++){var d=b[c];g[d.name]&&g[d.name].length>0?d.style["border-color"]=g[d.name]:g[d.name]=d.style["border-color"];
                                        var h=d.getAttribute("name");h==="email"&&(e=!0),h==="phone"&&(f=!0);
                                        var i=trim(d.value),j=i==="",k=d.getAttribute("_required")==="1";if(j){if(k){
                                            var l=us_msg.missing.replace("%s",d.getAttribute("_label"));
                                            return _showErrorMessage(l,d),d.style["border-color"]="#ff592d",d.focus(),!1}}
                                            else{
                                                function m(a){
                                                    var b=us_msg.invalid.replace("%s",a.getAttribute("_label"));_showErrorMessage(b,a),a.style["border-color"]="#ff592d",a.focus()}
                                                    var n=d.getAttribute("_validator"),o=null;
                                                    switch(n){case null:case"":case"string":case"number":case"text":break;
                                                    case"date":o=dateFormat.replace(/dd?/i,"([0-9]{1,2})"),o=o.replace(/mm?/i,"([0-9]{1,2})"),o=o.replace(/yy{1,3}/i,"([0-9]{2,4})"),o=new RegExp(o);
                                                    var p=o.exec(i);if(!(p&&p[1]&&p[2]&&p[3]))return m(d),!1;
                                                    var q=parseInt(p[1],10),r=parseInt(p[2],10),s=parseInt(p[3],10),t=new Date(s,r-1,q);
                                                    if(t.getFullYear()!=s||t.getMonth()+1!=r||t.getDate()!=q)return m(d),!1;break;case"email":o=us_emailRegexp;
                                                    break;
                                                    case"phone":o=us_phoneRegexp;
                                                    break;
                                                    case"float":o=/^[+\-]?\d+(\.\d+)?$/;
                                                    break;
                                                    default:return alert('Internal error: unknown validator "'+n+'"'),d.focus(),!1}if(o&&!o.test(i)&&n!="date")return m(d),!1}}return!0},_validateCheckboxes=function(a){
                                                        return _validateOptionsList(a,"checkbox")},_validateRadios=function(a){return _validateOptionsList(a,"radio")},_validateOptionsList=function(a,b){
                                                            function f(a){
                                                                return!a||a==document?null:a.parentNode.nodeName&&a.parentNode.nodeName.toLowerCase()==="ul"?a.parentNode:f(a.parentNode)}var c=a.querySelectorAll("input[type="+b+"]");
                                                                if(c.length==0)return!0;
                                                                var d=new Array,e="";
                                                                for(var g=0;g<c.length;g++)c[g].getAttribute("_required")==="1"&&(e=c[g].getAttribute("name").replace(/(:|\.|\[|\])/g,"\\$1"),d.indexOf(e)===-1&&d.push(e));
                                                                for(var h in d){var e=d[h],i=a.querySelectorAll("input[name="+e+"]:checked").length,j=a.querySelectorAll("input[name="+e+"]");
                                                                if(i===0){var k=f(j[0]),l=us_msg.missing.replace("%s",j[0].getAttribute("_label"));
                                                                return _showErrorMessage(l,k),!1}}return!0},_showErrorMessage=function(a,b){if(b){
                                                                    var c=b.parentNode.querySelector(".error-block");c.innerHTML=a,c.style.display="block"}},_hideErrorMessages=function(a){
                                                                        var b=a.querySelectorAll(".error-block");if(b.length==0)return;for(var c=0;c<b.length;c++){var d=b[c];d.innerHtml="",d.style.display="none"}}}</script>
                                                                        
<script type='text/javascript' src='http://cp.unisender.com/v5/template-editor-new/js/lib/moment/moment-with-langs.min.js'></script>
<script type='text/javascript' src='http://cp.unisender.com/v5/template-editor-new/js/lib/datepicker/pikaday.js'></script>
<link rel='stylesheet' media='all' href='http://cp.unisender.com/v5/template-editor-new/js/lib/datepicker/pikaday.css'>

<form method="POST" action="http://cp.unisender.com/ru/subscribe?hash=59qtg8hgfziqb6cmus6wpyxay4apeqzsgfrt91jy" name="subscribtion_form" onsubmit="return us_.onSubmit(this);" us_mode="embed">
    <input _label="E-mail" name="email" _validator="email" _required="1" type="text">

    <div class="error-block"></div>

    <button type="submit">Напомнить о событии</button>


    <input name="charset" value="" type="hidden">
    <input name="default_list_id" value="" type="hidden">
    <input name="overwrite" value="2" type="hidden">

</form>


Теперь после обновления страницы, вываливается на белом фоне такое сообщение
Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "/var/www/vhosts/site.com/mysite/plugins/mainpage/templates/skin/simple/actions/ActionPromopage/index.tpl" on line 20 "<script type='text/javascript'>var dateFormat="dd.mm.yyyy",us_msg={missing:'Не задано обязательное поле: "%s"',invalid:'Недопустимое значение поля: "%s"',email_or_phone:"Не задан ни email, ни телефон",email_absent:"Не указан электронный адрес",phone_absent:"Не указан телефон",no_list_ids:"Не выбрано ни одного списка рассылки"},us_emailRegexp=/^[a-zA-Z0-9_+=-]+[a-zA-Z0-9\._+=-]*@[a-zA-Z0-9][a-zA-Z0-9-]*(\.[a-zA-Z0-9]([a-zA-Z0-9-]*))*\.([a-zA-Z]{2,6})$/,us_phoneRegexp=/^\s*[\d +()-.]{7,32}\s*$/;if(typeof us_=="undefined")var us_=new function(){function i(a){var b=a.getElementsByTagNam in /var/www/vhosts/site.com/mysite/engine/lib/external/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 627 


Подскажите что надо поправить, чтобы скрипт заработал…

Как изменить шапку в пагинации?(решено)

Добрый день.

Я задумал сделать большую такую шапку на главной (на манер bootstrap). Кроме шапки, ниже идет список топиков, затем элементы соц сетей, возможно еще что-то будет накинуто. Но, если пользователь задумает переключиться на след страничку пагинации под топиками, логично предположить что большая шапка, и вся остальная информация ниже списка топиков его совсем не интересует, соответственно ее надо убирать.

По логике я собрался реализовать это таким образом:

1. Для шапки на главную страницу создаю main_header.tpl,
2. В ActionIndex добавляю условие, которое считывает event экшена Index (в нашем случае это: page1, page2 и т.д.) и если эвент равен page, то main_header.tpl не подключается.
Таким образом для страницы мойсайт.ру я имею уникальную главную, а при пагинации, пользователь видит грубо говоря только список топиков.

{if $sAction != 'page%'}
    {include file='main_page.tpl'}
{/if}


Правильно ли я рассуждаю и корректен ли синтаксис?

Я совсем совсем новичок, и в лайвстрите и в вэбразработке, я постепенно осваиваю ее, поэтому если есть желание, то помогите советом!

Микроразметка [решение + проблема]

Сегодня полностью закончил добавлть микроразметку для своего сайта. Всё бы хорошо, но Яндекс ругается на:
ПРЕДУПРЕЖДЕНИЕ: не выполнено обязательное условие для острова «Статья» — обязательное поле description отсутствует
Как это должно быть, я знаю, но вот как это реализовать в LS, я не знаю. По идеи первый абзац поста должен быть заключён в
<p itemprop="description">текст первого абзаца или предложения</p>


Читать дальше →

Новый функционал фреймворка - поведения (behavior)

В новой версии LS 2.0 появится функционал поведений (behaviors), который очень поход на подобный в Yii.
Суть сводится к тому, что теперь определенному типу объектов (пользователи, топики, блоги и т.п.) или конкретному объекту можно назначить через поведения определенный новый функционал.
Добавить новое поведение в объект достаточно просто, можно у объекта определить свойство $aBehaviors. Например:
	protected $aBehaviors=array(
		'category'=>'ModuleCategory_BehaviorCategory',
		'property'=>array(
			'class'=>'ModuleProperty_BehaviorPropertyEntity',
	        	'target_type'=>'article'
		)
	);

В этом примере добавляются два поведения — категории и дополнительные поля. В качестве ключа используется название поведение (далее по этому ключу можно обращаться к поведению), а в качестве значения идут параметры. Параметры идут произвольным массивом имя/значение, 'class' — это служебный параметр, означающий класс поведения. Если у повеления нет параметром, то его можно записать в короткой форме (смотри 'category'). Альтернативным (скорее дополнительным) способом добавления поведения является прямой вызов метода AttachBehavior, например:
$oTopic->AttachBehavior('property','ModuleProperty_BehaviorPropertyEntity');

// далее можно убрать поведение
$oTopic->DetachBehavior('property');


Читать дальше →