avatar
+7.59
13.931

Артемий

Наверное, вам лучше вообще разделить вывод блогов по типам, раз уж у вас для них планируется отдельное оформление. Можно сделать так:
— блог (его шапка и список топиков) выводится шаблоном «tpls/actions/blog/action.blog.blog.tpl» — переименуйте его в action.blog.one.tpl;
— скопируйте этот же файл, но с соответствующими именами для разных типов блога, в вашем случае: action.blog.two.tpl, action.blog.open.tpl, action.blog.close.tpl, action.blog.personal.tpl
— создайте файл (action.blog.blog.tpl) шаблона в котором будет выбираться нужный тип шаблона с единственной строчкой:
{include file="actions/blog/action.blog.{$oBlog->getType()}.tpl"}


То есть, шаблон блога будет подключать файл блога нужного типа. Теперь, имея различные шаблоны для блогов различного типа, внутри этого шаблона выводите нужные блоки, нужную верстку и т.д.
andreyv
andreyv
В каком виде галерея может быть реализована в Alto? Способов несколько, но наиболее правильным, с моей точки зрения, будет реализовать его в виде отдельного типа топика. Топик-фотоальбом.
Такой тип топика будет иметь в качестве базовых полей:
— наименование;
— описание (здесь можно поступить по-разному: разрешить форматирование и картинки в тексте описания или запретить. Здесь же может возникнуть непонимание пользователя относительно того, что картинки можно добавлять в описание и в фотосет);
— собственно, сам фотосет;
— теги;
— опрос, если владелец захотел узнать, например, понравились ли другим фотографии;
То есть я подвожу к такой мысли, что базовый функционал для организации фотоальбома уже есть и сделать фотоальбом можно легко через админку.

Что касается другого функционала, то его придется дописывать, но с учетом уже готовых функций из коробки выглядеть всё будет так:
1. Видимость альбома: Создаются типы блогов: «закрытые альбомы», «открытые альбомы», «альбомы только для друзей». Каждому пользователю при регистрации автоматически создаются по одному экземпляру каждого блога. Ка сейчас персональный, но добавляются: «Персональные закрытые альбомы», «Персональные открытые альбомы», «Персональные альбомы для друзей». пользователь создавая альбом относит его в один из этих своих типов блогов тем самым регулируя их видимость. Поскольку альбом это топик, то его легко перенести в любой другой блог.
2. Наборы альбомов: Пользователь может создавать свои наборы альбомов (блогов типа «Альбомы»), например, «Фото природы для друзей»
3. Коллективные наборы альбомов: Пользователи могут делать коллективные «фото-наборы» (коллективный блог) размещая в них свои тематические фотографии
4. Лучшие фото: Механизм реализации следующий: В БД к записи голоса добавляется поле – id_foto, которое хранит голос за фотографию. Общее количество голосов будут показывать рейтинг всего альбома.
5. Просматриваемые фото и комментарии к фото: аналогично, внеся изменения в БД, можно разделить в рамках одного топика (альбома) комментарии к каждой фото и просмотр каждой фото.
6. Виджеты с фото, альбомы в профиле и т.д. Так как альбом – это топик, то выборка различных данных по топику сложности не представляет и этот функционал еть в движке.
7. Вывод альбомов отдельным списком: Сейчас Alto выводит персональные и коллективные блоги на отельных страницах, добавить новое условие на вывод какого-либо другого типа топика, например «открытые альбомы пользователя» не сложно, функционал в движке уже есть. Также есть экшен «ActionFilter», который выводит отдельный вид контента на странице.
8. Фотосет: фотосет сейчас довольно хорошо выполняет функции захгрузки фото, но его можно дополнить другими функциями: порядок фото, пометка человека на фото и т.д.
Вот в краце, как интегрировать функционал альбома с уже существующим функционалом Alto.
Если что-то забыл – пишите, дополню список.
aVadim
aVadim
Да, проверил — есть меленький бажок. Надо в файле assets/js/experience/script.min.js закомментировать строку:
setFixMenu('.menu-level-2-container', 'fixed');
Т.е. должно стать так:
//setFixMenu('.menu-level-2-container', 'fixed');
После этого параметр включения/выключения будет работать нормально.

Но в style.min.css, разумеется, надо вернуть все на место
aVadim
aVadim
В последней стабильной версии 1.0.6 это делается примерно так:
$iPhotoId = $oTopic->getPhotosetMainPhotoId();
$aPhotos = $oTopic->getPhotosetPhotos($iPhotoId, 1);
if (isset($aPhotos[$iPhotoId])) {
    $oPhoto = $aPhotos[$iPhotoId];
    // Здесь в $oPhoto оно и есть
}
В текущей разрабатываемой версии 1.0.7 так:
$oPhoto = $oTopic->getPhotosetMainPhoto();
В обоих случаях в результате в переменной $oPhoto получим фотографию, отмеченную как превью, в виде объекта ModuleTopic_EntityTopicPhoto. И получить ссылку на само изображение можно методом getUrl():
$oPhoto->getUrl(500); 
$oPhoto->getUrl('150crop'); 
$oPhoto->getUrl('300x200'); 
$oPhoto->getUrl('x100');
и т.д.

Либо, если поставить плагин TopicIntro, то можно еще проще:
$oTopic->getPreviewImageUrl('250crop');
С помощью плагина https://github.com/altocms/alto-plugin-topicintro/ в любом месте, где доступен топик нужно указать
<img src="{$oTopic->getPreviewImageWebPath('400crop')}" alt="image" />
Его, даже делать не нужно:
— Идем сюда https://ulogin.ru/constructor.php
— Берем плагин для Livestreet
— На всякий случай здесь common/plugins/ulogin/classes/hooks/HookUloginWidget.class.php ставим <?php вместо <?
— В файле common/plugins/ulogin/classes/actions/ActionUlogin.class.php меняем $this->User_DeleteFoto($oUser) на $this->User_DeletePhoto($oUser) и $this->UploadFoto($photo_big,$oUser) на $this->UploadPhoto($photo_big,$oUser)
— Радуемся
Подтверждаю.
Перенес базу сначала обновив LS 0.4.2->0.5.1->1.0.3
А затем установив alto, поставив галочку о конвертации.
Хотел бы указать ряд моментов, мне пригодились:
1. Смотрите внимательно при переносе базы. Первый раз получил после установки в некоторых местах fatal error, некоторые топики отсутствовали. Причина была проста-база обширная (свыше 70 мб, 5500 пользователей 11 тыр комментариев) и при ее сжатии через phpadmin файл не докачался. Повторил все еще раз — ошибок больше нет.
2.Если будете ставить на другой домен или поддомен (например для тестирования или настройки) — обратите внимание, что аватары и рисунки в профиле в базе сохраняются с полным путем, вида site.com/uploads/images/00/00/4.jpg.
При этом при работе на другом поддомене или домене аватары показываться будут, но везде в штатном размере 100х100, функция их уменьшенного показа $oUser->getAvatarUrl(24) (в комментариях, прямом эфире и т.д.)работать не будет.
Нужно обязательно прописать новый путь к аватарам вида newsite.com/uploads/images/00/00/4.jpg.
Обновить все легко в phpmyadmin, например так:
UPDATE `prefix_user` SET
`user_profile_avatar` = REPLACE(`user_profile_avatar`, 'http://site.com/uploads/images/', 'http://newsite.com/uploads/images/');

После переноса сохранились все топики, блоги, статичные страницы, юзеры, их связи, переписка.
Естественно, не сохранились плагины от старых версий LS. Особо они не нужны, но для меня актуально прикрепление файлов к топику. К сожалению, в коробке alto такое не умеет, в каталоге плагин такое тоже не нашел. А жаль. В свое время покупал aceBlogExtender только из-за возможности прикреплять файлы (именно прикреплять, а не создавать отдельный вид топика-файла). Нужно как-то думать как пристроить большое количество прикрепленных к топикам файлов.
altocms.ru/blog/questions/537.html#comment8900
Мой комментарий про простейший плагин, правда в контексте возможностей движка для переопределения стандартных классов, но принцип неизменен и для простого «Hello World».
Для простейшего вывода своего шаблона — просто определяем свой экшен и назначаем ему шаблон.
class PluginExample_ActionExample extends ActionPlugin {
public function Init() {
        $this->SetDefaultEvent('index'); //обработчик по умолчанию
        $this->SetTemplateAction('название_файла_шаблона'); //шаблон для экшена
    }
protected function RegisterEvent() {//регистрируем эвент
        $this->AddEvent('index','EventIndex');

    }
protected function EventIndex() {//выполняем эвент

    }
}

Пример плагина с подробными комментариями есть в AltoCMS 0.9.7.1 в папке /plugins/demo, в AltoCMS 1.0 /common/console/protected/plugin
Можно делать и в исходном классе, но вот представьте, вы один раз что-то поменяли, потом другой раз, а потом еще раз. и т.д. и тут, в один прекрасный день, вышла новая версия Alto, в которой добавили много интересных вещей и исправили кучу ошибок.

Что вам придется делать в этом случае? Да ничего сложного, по большому счету, просто сначала вспомнить в каких классах и что вы меняли (еще вспомнить нужно вспомнить зачем, ибо со временем это забывается), потом сохранить все эти файлы, потом обновить движок и на основе старых файлов восстановить эти изменения.

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

Теперь подробнее про переопределение.
Для примера возьмем файл /common/classes/actions/ActionBlog.class.php
он содержит
class ActionBlog extends Action {...}
в нем есть свойство которое содержит в массиве список URL с котрыми запрещено создавать блог
protected $aBadBlogUrl = array('new', 'good', 'bad', 'discussed', 'top', 'edit', 'add', 'admin', 'delete', 'invite', 'ajaxaddcomment', 'ajaxresponsecomment', 'ajaxgetcomment', 'ajaxupdatecomment','ajaxaddbloginvite', 'ajaxrebloginvite', 'ajaxremovebloginvite','ajaxbloginfo', 'ajaxblogjoin');
и нам захотелось поменять этот список (добавить или убрать каке-то ключевые слова)
Для этого сделаем простейший плагин.
в папке /common/classes/actions/plugins создадим папку example в этой папке создаем папку classes, а в ней папку actions и уже в этой папке создаем свой файл ActionBlog.class.php со следующим содержанием
<?php
class PluginExample_ActionBlog extends PluginExample_Inherit_ActionBlog {
    protected $aBadBlogUrl
        = array('здесь','пишем','нужные','нам','слова'
        );
}
теперь возвращаемся в корневую папку плагина example и создаем там два файла PluginExample.class.php
<?php

if (!class_exists('Plugin')) {
    die('Hacking attemp!');
}

class PluginExample extends Plugin {

    protected $aInherits=array(
	'action' => array(
            'ActionBlog'
        ),
    );

    public function Init() {
        
    }
}
и файл plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
    <name>
        <lang name="russian">Example</lang>
    </name>
    <author>
        <lang name="russian">автор</lang>
    </author>
    <homepage>http://example.com</homepage>
    <version>1.0.0</version>
    <description>
        <lang name="russian">Описание плагина Example</lang>
    </description>
</plugin>
Вот и все. Теперь можно идти в админку и включать наш плагин. Для тех, кто хочет сказать, что это слишком сложный путь для простого изменения отвечу: для одного изменения да, но если изменения у вас на сайте все же планируются, то проще сделать такой плагин и потом дописывать его по мере необходимости (новый плагин для каждого изменения делать не нужно!).

И напоследок — загляните в /common/console/protected/plugin/ и там вы найдете демо-плагин с подробными комментариями и полной структурой папок и файлов.
1) Запись с ключом custom.config.view.skin удалить
2) Очистить папки /_tmp/cache/ и /_run/
3) В файле /app/config/config.local.php задать нужный скин:
$config['view']['skin'] = 'synio';
Все просто, но в тоже время и нет…
Первое правило — не трогать все, что находится в папках /engine, /common/classes и /common/classes/config
Второе правило — для любого изменения функционала — пиши плагин, ибо в плагине можно переопредилить классы движка, написать свои экшены, переопределить шаблоны и сделать почти все что угодно, кроме изменения двух системных классов (но оно вам и не понадобится)
Для более полной информации посмотрите вот это видео:
youtu.be/Kq35JnRI9hk?t=14m35s
Это доклад Вадима Шемарова (aVadim ) на конференции CMS Conference 2013 — очень полезное видео.
aVadim
aVadim
Если задать '150crop', то получаем квадрат, если просто 150, то изображение, вписанное в квадрат.

Мое упущение — не доглядел, что мы все равно к квадрату привязываемся. Исправим в будущем
aVadim
aVadim
По п.1 — с учетом функционала последней версии не составит особого труда выдавать в качестве изображения по умолчанию первую картинку топика или фотосета.

С одной стороны, это позволит не привязывать скин к какому-то конкретному плагину (типа mainpreview), и скин будет работать и без него. А с другой — если добавить специальный плагин, то можно скин заюзать более эффективно (т.е. назначать дефолтную картинку руками и индивидуально)
aVadim
aVadim
Верно. Если быть более точным — совпадают плагин и название виджета. Но иногда действительно нужно один и тот же виджет указать для разных случаев. Решается добавлением параметра id в описание виджетов, которые должны быть уникальными. Например, так:
$config['widgets'][] = array(
    'id' => 'projects-one'
    'name' => 'projects', 
    ...
);

$config['widgets'][] = array(
    'id' => 'projects-two'
    'name' => 'projects', 
    ...
);
aVadim
aVadim
Спокойно, щас все порешаем. Со второй ошибкой разобрался. А с первой пока нет. А база как создавалась? С нуля?
Так… Работает. Но, с первого раза не вышло — ошибка (глюк) пропала, но шаблон тупо показывал на главной фиксированную ширину. Т.е. «fluid» игнорился напрочь. В чем было дело, я въехал не сразу. Оказалось все просто. Я по аналогии с Вашим советом исправил самый верхний параметр (что логично). Это:
{if {Config::Get('view.grid.type')} == 'fluid'}

исправил на это:
{if {cfg name="view.grid.type" level=Config::LEVEL_SKIN} == 'fluid'}

В совокупности код выглядит так:
{if {cfg name="view.grid.type" level=Config::LEVEL_SKIN} == 'fluid'}
        <style>
            #container {
                min-width: {cfg name="view.grid.fluid_min_width" level=Config::LEVEL_SKIN}px;
                max-width: {cfg name="view.grid.fluid_max_width" level=Config::LEVEL_SKIN}px;
            }
        </style>
    {else}
        <style>
            #container {
                width: {cfg name="view.grid.fixed_width" level=Config::LEVEL_SKIN}px;
            }
        </style>
    {/if}

Огромное спасибо!
plugin/page/templates/skin/default/ActionPage/........tpl
{include file=«header.tpl» noSidebar=true}
убрать то что в жирным
Мой пример работы виджетов Facebook и vk.com на AltoCMS:
В папке с шаблоном создал файл block.fb.tpl
Его содержимое:

<center>{literal}
<script type="text/javascript" src="//vk.com/js/api/openapi.js?63"></script>

<!-- VK Widget -->
<div id="vk_groups"></div>
<script type="text/javascript">
VK.Widgets.Group("vk_groups", {mode: 0, width: "300", height: "281"}, 37759647);
</script>{/literal}</center><br />
<center>{literal}
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1&appId=295789317158161";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<div class="fb-like-box" data-href="http://www.facebook.com/studlifekz" data-width="300" data-show-faces="true" data-stream="false" data-header="false"></div>{/literal}</center>

В файле /config/widgets.php добавил следующее:

$config['widgets'][] = array(
    'name' => 'block.fb.tpl',     // имя нашего файла в папке шаблона
    'wgroup' => 'right',    // группа, куда нужно добавить виджет
    'priority' => 88,      // приоритет
    'action' => array(
        'index',
        'community',
        'filter',
        'blogs',
        'blog' => array('{topics}', '{topic}', '{blog}'),
        'tag',
    ),
    'title' => 'Социалки!', //Любой титл)))
);

Все отображается отлично!
Может это из-за
{literal}Код виджета{/literal}
?!
mif
mif
Этим можно управлять с помощью модификатора Smarty — spellcount
Положите сюда: /engine/lib/external/Smarty/libs/plugins файл modifier.spellcount.php с таким содержимым:
<?php

function smarty_modifier_spellcount($num, $one, $two, $many) {
    if ($num%10==1 && $num%100!=11){
        echo $num.' '.$one;
    }
    elseif($num%10>=2 && $num%10<=4 && ($num%100<10 || $num%100>=20)){
        echo $num.' '.$two;
    }
    else{
        echo $num.' '.$many;
    }
}

и выводите в шаблоне переменную таким способом:
{$oTopic->getCountComment()|spellcount:"комментарий":"комментария":"комментариев"}


Я бы посоветовал взять этот способ разработчикам на вооружение (;
LensorJuuse, решение — нужно в настройках указать — Принудительно обрабатывать CSS (Настройки сайта/CSS и javascript). В этом случае изменения в css сразу отображаются на сайте.