Релиз LiveStreet 2.0



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

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

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

    Скачать можно здесь
    Документация по новой структуре фронта + в дистрибутиве идет плагин docs с доками по каждому компоненту.
    Демка
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 49
    • +5
      Поздравляю с релизом.

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



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


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

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

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

              • –8
                Тут нужно всё выкидывать и переписывать с нуля. На питоне.))
                • НЛО прилетело и опубликовало эту надпись здесь
                  • НЛО прилетело и опубликовало эту надпись здесь
                  • 0

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

                    • 0

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

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

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

                          • +4
                            Если приглядеться, можно заметить на скриншотах личку и 2014 год)
                    • 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-ый не быстро продвигается.

                          • НЛО прилетело и опубликовало эту надпись здесь
                            • +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 заработает только после сильной правки модуля базы данных?

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.