Не понятны переменные в шаблоне index.tpl

Добрый день, уважаемые разработчики!
У экшенов есть шаблон index.tpl со следующим содержимым:
{include file='header.tpl' menu='blog' menu_content='blog'}
{include file='topic_list.tpl'}
{include file='footer.tpl'}

Я замучился искать, что означает menu='blog' menu_content='blog' — по видимому перменные шаблона, но где они конкретно задаются и что означают.

Поддержка Unicode

Добрый день! Хочу спросить 1 момент: есть ли поддержка в LS 2.0 юникода? Например при вводе "✌️" должна оставаться как есть (этот смайл как ни странно работает), а есть и такие: "(здесь обрывается)" — пончик, она на выходе получается "????" (4 вопросительных знака). Я предполагаю, что Smarty не понимает\не поддерживает юникода. Куда копать?

Дата в смарти

Нужно вывести сокращенное название месяца, но работает только полное:

{date_format date=$oTopic->getDateAdd() format="F"}


Пробовал:

{date_format date=$oTopic->getDateAdd() format="f"}
{date_format date=$oTopic->getDateAdd() format="b"}


Не работает. Можно ли? Придумал только скрывать div-ом часть месяца, но это не правильно как-то.

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 


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

Как получить в шаблоне значение из конфига плагина?

Пишу так:
{$smarty.config.plugin.myPlugin.profilename.charlimit.max}


В конфиге это выглядит так:
$config['profilename']['charlimit']['max'] = 19;


Но ничего не выводится. Почему?

Языковой файл плагина

Интересно, а где находится информация о том что массив в языковом файле плагина не добавляется к общему массиву, а к элементу [«plugin»][«название плагина»] => array(«здесь то что в файле»)? И что в итоге в шаблоне надо подставлять {$aLang.plugin.названиеплагина.названиеключа}? Это как то совсем не очевидно. Я это понял только посмотрев содержимое docs.livestreetcms.com/api/1.0/ModuleLang#GetLangMsg-detail.

Похоже это появилось в версии 1.0.1 livestreet.ru/blog/11132.html#comment199625:
В ЛС 1.0.1 поменялся вывод языка из плагинов на такую конструкцию.

Вывод списка последних топиков в блок

Всем привет. Есть ли простой способ (не заморачиваясь с классами и тп) вывести в блок список 5 последних топиков? Пустой блок, скажем, создал.
… и вконец запутался со smarty.

Ответ:

{assign var="aTopics" value=$LS->Topic_GetTopicsByBlogId(__BLOG_ID__, 1, 10, array ('blog'), false)}
{assign var="aTopics" value=$aTopics.collection}
{foreach from=$aTopics item=oTopic}
    <a href="{$oTopic->getUrl()}">{$oTopic->getTitle()|escape:'html'}</a>
{/foreach}