Вышел новый релиз блого-социального движка LiveStreet 2.0.

Новые возможности:

  • Новая структура файлов движка. Фреймворк полностью отделен от приложения.
  • Переработанный фронт на базе компонентов
  • Механизм универсальных категорий. Возможность привязки категорий к разным объектам.
  • Механизм дополнительных полей (EAV) для различных объектов
  • Универсальный механизм управления медиа-файлами
  • Управление типами топиков и их кастомизация
  • Встроенная поддержка превью-изображений для топиков
  • Возможность вставлять в топик несколько опросов
  • Система управления правами пользователей
  • Центральный крон
  • Новый удобный механизм загрузки фото и аватара пользователя
  • Поддержка жалоб на пользователей
  • Новый поиск пользователей
  • Упрощения системы рейтинга
  • Поиск по сайту «из коробки» (без sphinx)
  • Новый поиск блогов
  • Категории для блогов
  • Возможность публиковать топики в несколько блогов
  • Опционально каптча при авторизации
  • Новый инсталлятор
  • Возможность запустить процесс обновления LS из консоли (для крупных проектов)
  • Упрощена навигация по топикам
  • Официальная админ-панель (отдельный плагин в комплекте)
  • Редактирование комментариев
  • Поддержка мульти-авторизаций для пользователей (можно одновременно логиниться с разных браузеров)
  • Поддержка работы через https, в том числе принудительное использование для страниц регистрации/авторизации
  • Возможность расширения эвентов отдельными классами
  • Существенная доработка ORM
  • Возможность не только переопределять файлы шаблона, но и наследовать их
  • Для плагинов теперь не обязательно дублировать tpl файлы для всех шаблонов. Можно их все держать в шаблоне default, а в конкретный шаблон копировать только измененные
  • Поддержка разных конфигов для разных окружений
  • Конфиги плагинов теперь можно переопределять в каталоге с главным конфигом (/application/config/plugins/[plugin_name]/config.php)
  • Удобный механизм интеграции плагинов в админ-панель — управление конфигом и собственный функционал
  • Новый модуль кеширования и логирования
  • Новый модуль для работы с изображениями
  • Поддержка миграций для плагинов
  • Весь код отформатирован под PSR-2
  • Большое число мелких фиксов и улучшений ядра

> Скачать можно здесь
> Документация по новой структуре фронта + в дистрибутиве идет плагин docs с доками по каждому компоненту.
> Демка
Поделиться с друзьями
-->

Комментарии (49)


  1. KaMaToZzz
    31.01.2017 12:52
    +5

    Поздравляю с релизом.

    Хотелось бы поинтересоваться о будущем проекта.
    Какие планы на развитие? Промежуток между последнем релизом 4 года. На сколько актуальная версия 2 по нынешним стандартам?
    Как вы планируете дальнейшее развитие?
    Что сладкого готовите на ближайшее будущее?


  1. RUQ
    31.01.2017 13:25
    +3

    ort и команда, поздравляю.


  1. andreymal
    31.01.2017 13:51
    +12

    Я просто оставлю это здесь в качестве демонстрации уровня ответственности топикстартера и поддержки предыдущих версий



    (плюс ещё две потенциальных sql-инъекции, но эксплуатировать их извне без сторонних плагинов нельзя, поэтому меня послали)


    1. sidristij
      31.01.2017 14:13
      +3

      Спасибо за информацию


    1. SamDark
      31.01.2017 15:34
      +1

      Код на github, уже бы pull request-ов неделали...


      1. andreymal
        31.01.2017 15:34
        -8

        Тут нужно всё выкидывать и переписывать с нуля. На питоне.))


        1. sleeply4cat
          31.01.2017 15:36
          +1

          Почему сразу не на Java? :D


          1. sleeply4cat
            31.01.2017 16:58

            кхм… Неловко вышло.

            если в двух словах,
            табун — не мой сайт и не сайт andreymal (вроде), и вообще там всё плохо с администрацией.
            От глюков и лютой тормознутости лайва страдают все (после ~3000 комментариев страница просто перестаёт загружаться, например), так что существуют несколько вяло шевелящихся проектов альтернативных движков, по какой-то причине пишущихся на питоне. А я упоротый джавист, каждый раз спрашивающий, почему именно питон.


        1. SamDark
          31.01.2017 15:38

          Ну вы же уже запатчили себе именно этот код. Осталось совсем чуть чтобы сделать pull request и помочь продукту, который сами и используете. Да и профит будет — обновляться проще.


          1. SamDark
            31.01.2017 15:39

            Или я не верно понял и этот некий "табун" не ваш?


          1. andreymal
            31.01.2017 15:39
            +1

            Не я, и я его к счастью не использую)
            А почему те, кто запатчили, не делали пулл-реквестов — этого уже знать не могу


            1. SamDark
              31.01.2017 15:42

              Наплюсил в карму за факт репорта. Но вообще на тему безопасности принято сообщать сначала не в публичном месте, а потом уж, если не реагируют совсем, можно и публично.


              1. andreymal
                31.01.2017 15:42
                +4

                Если приглядеться, можно заметить на скриншотах личку и 2014 год)


                1. SamDark
                  31.01.2017 15:44

                  Shame on me :)


        1. SamDark
          31.01.2017 15:40

          Лет несколько...


  1. noonv
    31.01.2017 13:54
    +2

    Поздравляю! :)


  1. udalovs70
    31.01.2017 13:58
    +1

    Осталась очередь за авторами плагинов и шаблонов перевести на новую версию движка…


  1. yvm
    31.01.2017 14:44
    +2

    PSR-2 — хорошо, а PSR-4?


  1. ilyaplot
    31.01.2017 14:54
    +7

    А почему бы не вынести framework за пределы public директории в 2017 году?
    А почему бы не использовать неймспейсы PSR-4 в 2017 году?
    А почему бы не использовать нормальное оформление кода PSR-2 в 2017 году?
    А почему бы не использовать prepeared statements в ORM в 2017 году?
    Дальше смотреть не хочется…


    1. ilyaplot
      31.01.2017 14:57
      +1

      Для тех, кто скажет, что PSR-2 заявлен во второй версии просто процитирую перевод стандарта.

      Имена методов ДОЛЖНЫ быть объявлены с использованием т.н. «camelCase» (первое слово пишется в нижнем регистре, далее каждое слово начинается с большой буквы, а между словами нет разделителей).


      В коде все методы начинаются с заглавной.


      1. ort
        31.01.2017 15:43

        Предполагал, что это дело PSR-1
        Здесь же просто форматирование кода по PSR-2


        1. SamDark
          31.01.2017 15:45

          PSR-2 обязывает использовать PSR-1. Вообще, переводите уж всё на PSR-12. Как закончите, возможно, его примут :)


          1. ort
            31.01.2017 15:55

            это да, обязывает )

            Вообще, переводите уж всё на PSR-12. Как закончите, возможно, его примут :)
            боюсь тогда будет уже какой-нибудь PSR-20 )


            1. SamDark
              31.01.2017 15:58

              Ну, пока не планируется, да и 12-ый не быстро продвигается.


    1. sleeply4cat
      31.01.2017 15:32
      +2

      неужели SQL руками экранируется? 0__о


      1. andreymal
        31.01.2017 15:42
        +2

        Копирую из исходного кода Livestreet 2.0 без изменений

        Скрытый текст
        /**
         * Объект маппера для работы с БД
         *
         * @package application.modules.topic
         * @since 1.0
         */
        class ModuleTopic_MapperTopic extends Mapper
        {
            /**
             * Строит строку условий для SQL запроса топиков
             *
             * @param array $aFilter Фильтр
             * @return string
             */
            protected function buildFilter($aFilter)
            {
                $sDateNow=date('Y-m-d H:i:s');
                $sWhere = '';
                if (isset($aFilter['topic_date_more'])) {
                    $sWhere .= " AND t.topic_date_publish >  " . $this->oDb->escape($aFilter['topic_date_more']);
                }
                if (isset($aFilter['topic_slug'])) {
                    $sWhere .= " AND t.topic_slug =  " . $this->oDb->escape($aFilter['topic_slug']);
                }
                if (isset($aFilter['topic_publish'])) {
                    $sWhere .= " AND t.topic_publish =  " . (int)$aFilter['topic_publish'] . " AND t.topic_date_publish <= '{$sDateNow}' ";
                }
                if (isset($aFilter['topic_rating']) and is_array($aFilter['topic_rating'])) {
                    $sPublishIndex = '';
                    if (isset($aFilter['topic_rating']['publish_index']) and $aFilter['topic_rating']['publish_index'] == 1) {
                        $sPublishIndex = " or topic_publish_index = 1 ) and ( topic_skip_index = 0 and b.blog_skip_index = 0 ";
                    }
                    if ($aFilter['topic_rating']['type'] == 'top') {
                        $sWhere .= " AND ( t.topic_rating >= " . (float)$aFilter['topic_rating']['value'] . " {$sPublishIndex} ) ";
                    } else {
                        $sWhere .= " AND ( t.topic_rating < " . (float)$aFilter['topic_rating']['value'] . "  ) ";
                    }
                }
                if (isset($aFilter['topic_new'])) {
                    $sWhere .= " AND t.topic_date_publish >=  '" . $aFilter['topic_new'] . "'";
                }
                if (isset($aFilter['user_id'])) {
                    $sWhere .= is_array($aFilter['user_id'])
                        ? " AND t.user_id IN(" . implode(', ', $aFilter['user_id']) . ")"
                        : " AND t.user_id =  " . (int)$aFilter['user_id'];
                }
                if (isset($aFilter['blog_id'])) {
                    if (!is_array($aFilter['blog_id'])) {
                        $aFilter['blog_id'] = array($aFilter['blog_id']);
                    }
                    $sBlogList = join("','", $aFilter['blog_id']);
                    $sWhere .= " AND ( t.blog_id IN ('{$sBlogList}') ";
                    $sWhere .= " OR t.blog_id2 IN ('{$sBlogList}') ";
                    $sWhere .= " OR t.blog_id3 IN ('{$sBlogList}') ";
                    $sWhere .= " OR t.blog_id4 IN ('{$sBlogList}') ";
                    $sWhere .= " OR t.blog_id5 IN ('{$sBlogList}') ) ";
                }
                if (isset($aFilter['blog_type']) and is_array($aFilter['blog_type'])) {
                    $aBlogTypes = array();
                    foreach ($aFilter['blog_type'] as $sType => $aBlogId) {
                        /**
                         * Позиция вида 'type'=>array('id1', 'id2')
                         */
                        if (!is_array($aBlogId) && is_string($sType)) {
                            $aBlogId = array($aBlogId);
                        }
                        /**
                         * Позиция вида 'type'
                         */
                        if (is_string($aBlogId) && is_int($sType)) {
                            $sType = $aBlogId;
                            $aBlogId = array();
                        }
        
                        $aBlogTypes[] = (count($aBlogId) == 0)
                            ? "(b.blog_type='" . $sType . "')"
                            : "(b.blog_type='" . $sType . "' AND t.blog_id IN ('" . join("','", $aBlogId) . "'))";
                    }
                    $sWhere .= " AND (" . join(" OR ", (array)$aBlogTypes) . ")";
                }
                if (isset($aFilter['topic_type'])) {
                    if (!is_array($aFilter['topic_type'])) {
                        $aFilter['topic_type'] = array($aFilter['topic_type']);
                    }
                    $sWhere .= " AND t.topic_type IN (" . join(",",
                            array_map(array($this->oDb, 'escape'), $aFilter['topic_type'])) . ")";
                }
                return $sWhere;
            }
        }


        1. andreymal
          31.01.2017 15:46
          +1

          Справедливости ради, в 2.0 это, если верить грепу, единственное такое место, в 1.0.3 такого было побольше


        1. ort
          31.01.2017 15:49
          +1

          Это называется старый код, ORM есть во фреймворке и используется только в части проекта.
          Весь код мы не переписывали, иначе бы и этого бы не было.
          Код проекта ни на что не претендует, модных штук (фреймворки, контейнеры и прочее) не использует. Как-то так.


          1. SamDark
            31.01.2017 15:51
            +1

            Конкретно это место, конечно, стоило бы переписать. С виду вроде всё проэкранировано, но уверенности всё равно нет.


            1. ort
              31.01.2017 16:01

              Как уже выше заметили, это такое одно (надеюсь) сильно запущенное место по части sql. Перевод на ORM потянет за собой кучу entity с переписываем большого пласта кода. Не рискнули.


          1. andreymal
            31.01.2017 15:57
            -2

            Можно было бы хотя бы для приличия // TODO: переписать этот говнокод воткнуть.)

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


            1. SamDark
              31.01.2017 15:59
              +1

              Оптимистичные прикидки — они всегда такие ;)


              1. andreymal
                31.01.2017 16:01

                Они основаны на реальном времени разработки двух лайвстритоподобных сайтов, в связи с чем чуть ближе к реальности чем обычно)


                1. ort
                  31.01.2017 16:03
                  +3

                  Ну одно дело сделать «лайвстритоподобный» сайт, другое дело кастомизируемый open source, где уже твой говнокод будут видеть и другие


                  1. andreymal
                    31.01.2017 16:05
                    -3

                    Лайвстритоподобность подразумевает кастомизируемость, да


                    1. ort
                      31.01.2017 16:08
                      +3

                      Я только рад таким профессионалам, побольше бы


                    1. KaMaToZzz
                      31.01.2017 21:38
                      +1

                      Дядь, сделай уже, а? Покажи как надо пилить, а то только одни разговоры ;)


  1. makenskiy
    31.01.2017 16:21
    +1

    Поздравляю с релизом! Нравится мне этот движок.


  1. Fed_Mikron
    31.01.2017 16:26

    Увидел новость — обрадовался. Движок нравится, версию 2 уж и не ждал, а тут такой сюрприз.
    Но после каментов озадачился, что-то сильно ругаете его…
    Таки имеет смысл переходить на 2.0 (для новых сайтов) или лучше проверенную 1.0.3 использовать?


    1. andreymal
      31.01.2017 16:29
      +2

      Если выбирать между 1.0.3 и 2.0, то 2.0 определённо лучше


      1. Fed_Mikron
        31.01.2017 17:18

        Спасибо


  1. Ugputu
    31.01.2017 17:04
    +1

    Че там? Админку нормальную сделали? Все так-же тормозит как и 3 года назад? Или можно смотреть без боли?


  1. stifff
    31.01.2017 19:57

    А как оно в сравнении с инстансцмс?


  1. spions
    31.01.2017 22:52

    Судя по количеству ошибок php7cc совместимости с php7 нет?
    Или как с первой версией, LS заработает только после сильной правки модуля базы данных?


    1. Shushlyaev
      31.01.2017 23:22

      юзаю на локалке php7, ls2 полёт нормальный


      1. spions
        31.01.2017 23:32

        Работает из коробки? Php7 или 7.1?


        1. Shushlyaev
          31.01.2017 23:33

          из коробки, 7.0. щас проверю на 7.1


        1. Shushlyaev
          31.01.2017 23:42

          7.1, всё работает. локалка (win10, apache+nginx)


    1. motomac
      01.02.2017 09:24

      С MySQL 5.7, по-видимому, несовместимо.