Релиз LiveStreet 2.0



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

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

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

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

    Comments 49

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

      Хотелось бы поинтересоваться о будущем проекта.
      Какие планы на развитие? Промежуток между последнем релизом 4 года. На сколько актуальная версия 2 по нынешним стандартам?
      Как вы планируете дальнейшее развитие?
      Что сладкого готовите на ближайшее будущее?
        +3
        ort и команда, поздравляю.
          +12
          Я просто оставлю это здесь в качестве демонстрации уровня ответственности топикстартера и поддержки предыдущих версий



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


          К слову, пароли даже в версии 2.0 (сейчас проверил по гитхабу) хэшируются в обычный md5 даже без соли. В 2017 году, ага.

          В общем, народ, не используйте LiveStreet для мало-мальски серьёзных сайтов.
            +3
            Спасибо за информацию
              +1

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

                –8
                Тут нужно всё выкидывать и переписывать с нуля. На питоне.))
                • UFO just landed and posted this here
                  • UFO just landed and posted this here
                    0

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

                      0

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

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

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

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

                              Shame on me :)

                        0

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

                    +2
                    Поздравляю! :)
                      +1
                      Осталась очередь за авторами плагинов и шаблонов перевести на новую версию движка…
                        +2
                        PSR-2 — хорошо, а PSR-4?
                          +7
                          А почему бы не вынести framework за пределы public директории в 2017 году?
                          А почему бы не использовать неймспейсы PSR-4 в 2017 году?
                          А почему бы не использовать нормальное оформление кода PSR-2 в 2017 году?
                          А почему бы не использовать prepeared statements в ORM в 2017 году?
                          Дальше смотреть не хочется…
                            +1
                            Для тех, кто скажет, что PSR-2 заявлен во второй версии просто процитирую перевод стандарта.
                            Имена методов ДОЛЖНЫ быть объявлены с использованием т.н. «camelCase» (первое слово пишется в нижнем регистре, далее каждое слово начинается с большой буквы, а между словами нет разделителей).


                            В коде все методы начинаются с заглавной.
                              0
                              Предполагал, что это дело PSR-1
                              Здесь же просто форматирование кода по PSR-2
                                0

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

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

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

                            • UFO just landed and posted this here
                                +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;
                                    }
                                }

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

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

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

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

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

                                            0
                                            Они основаны на реальном времени разработки двух лайвстритоподобных сайтов, в связи с чем чуть ближе к реальности чем обычно)
                                              +3
                                              Ну одно дело сделать «лайвстритоподобный» сайт, другое дело кастомизируемый open source, где уже твой говнокод будут видеть и другие
                                                –3
                                                Лайвстритоподобность подразумевает кастомизируемость, да
                                                  +3
                                                  Я только рад таким профессионалам, побольше бы
                                                    +1
                                                    Дядь, сделай уже, а? Покажи как надо пилить, а то только одни разговоры ;)
                                    +1
                                    Поздравляю с релизом! Нравится мне этот движок.
                                      0
                                      Увидел новость — обрадовался. Движок нравится, версию 2 уж и не ждал, а тут такой сюрприз.
                                      Но после каментов озадачился, что-то сильно ругаете его…
                                      Таки имеет смысл переходить на 2.0 (для новых сайтов) или лучше проверенную 1.0.3 использовать?
                                        +2
                                        Если выбирать между 1.0.3 и 2.0, то 2.0 определённо лучше
                                      +1
                                      Че там? Админку нормальную сделали? Все так-же тормозит как и 3 года назад? Или можно смотреть без боли?
                                        0
                                        А как оно в сравнении с инстансцмс?
                                          0
                                          Судя по количеству ошибок php7cc совместимости с php7 нет?
                                          Или как с первой версией, LS заработает только после сильной правки модуля базы данных?
                                            0
                                            юзаю на локалке php7, ls2 полёт нормальный
                                              0

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

                                                0
                                                из коробки, 7.0. щас проверю на 7.1
                                                  0
                                                  7.1, всё работает. локалка (win10, apache+nginx)
                                                0
                                                С MySQL 5.7, по-видимому, несовместимо.

                                              Only users with full accounts can post comments. Log in, please.