Вышел новый релиз блого-социального движка LiveStreet 2.0.
Новые возможности:
- Новая структура файлов движка. Фреймворк полностью отделен от приложения.
- Переработанный фронт на базе компонентов
- Механизм универсальных категорий. Возможность привязки категорий к разным объектам.
- Механизм дополнительных полей (EAV) для различных объектов
- Универсальный механизм управления медиа-файлами
- Управление типами топиков и их кастомизация
- Встроенная поддержка превью-изображений для топиков
- Возможность вставлять в топик несколько опросов
- Система управления правами пользователей
- Центральный крон
- Новый удобный механизм загрузки фото и аватара пользователя
- Поддержка жалоб на пользователей
- Новый поиск пользователей
- Упрощения системы рейтинга
- Поиск по сайту «из коробки» (без sphinx)
- Новый поиск блогов
- Категории для блогов
- Возможность публиковать топики в несколько блогов
- Опционально каптча при авторизации
- Новый инсталлятор
- Возможность запустить процесс обновления LS из консоли (для крупных проектов)
- Упрощена навигация по топикам
- Официальная админ-панель (отдельный плагин в комплекте)
- Редактирование комментариев
- Поддержка мульти-авторизаций для пользователей (можно одновременно логиниться с разных браузеров)
- Поддержка работы через https, в том числе принудительное использование для страниц регистрации/авторизации
- Возможность расширения эвентов отдельными классами
- Существенная доработка ORM
- Возможность не только переопределять файлы шаблона, но и наследовать их
- Для плагинов теперь не обязательно дублировать tpl файлы для всех шаблонов. Можно их все держать в шаблоне default, а в конкретный шаблон копировать только измененные
- Поддержка разных конфигов для разных окружений
- Конфиги плагинов теперь можно переопределять в каталоге с главным конфигом (/application/config/plugins/[plugin_name]/config.php)
- Удобный механизм интеграции плагинов в админ-панель — управление конфигом и собственный функционал
- Новый модуль кеширования и логирования
- Новый модуль для работы с изображениями
- Поддержка миграций для плагинов
- Весь код отформатирован под PSR-2
- Большое число мелких фиксов и улучшений ядра
> Скачать можно здесь
> Документация по новой структуре фронта + в дистрибутиве идет плагин docs с доками по каждому компоненту.
> Демка
Комментарии (49)
andreymal
31.01.2017 13:51+12Я просто оставлю это здесь в качестве демонстрации уровня ответственности топикстартера и поддержки предыдущих версий
(плюс ещё две потенциальных sql-инъекции, но эксплуатировать их извне без сторонних плагинов нельзя, поэтому меня послали)SamDark
31.01.2017 15:34+1Код на github, уже бы pull request-ов неделали...
andreymal
31.01.2017 15:34-8Тут нужно всё выкидывать и переписывать с нуля. На питоне.))
sleeply4cat
31.01.2017 15:36+1Почему сразу не на Java? :D
sleeply4cat
31.01.2017 16:58кхм… Неловко вышло.
если в двух словах,табун — не мой сайт и не сайт andreymal (вроде), и вообще там всё плохо с администрацией.
От глюков и лютой тормознутости лайва страдают все (после ~3000 комментариев страница просто перестаёт загружаться, например), так что существуют несколько вяло шевелящихся проектов альтернативных движков, по какой-то причине пишущихся на питоне.А я упоротый джавист, каждый раз спрашивающий, почему именно питон.SamDark
31.01.2017 15:38Ну вы же уже запатчили себе именно этот код. Осталось совсем чуть чтобы сделать pull request и помочь продукту, который сами и используете. Да и профит будет — обновляться проще.
andreymal
31.01.2017 15:39+1Не я, и я его к счастью не использую)
А почему те, кто запатчили, не делали пулл-реквестов — этого уже знать не могуSamDark
31.01.2017 15:42Наплюсил в карму за факт репорта. Но вообще на тему безопасности принято сообщать сначала не в публичном месте, а потом уж, если не реагируют совсем, можно и публично.
udalovs70
31.01.2017 13:58+1Осталась очередь за авторами плагинов и шаблонов перевести на новую версию движка…
ilyaplot
31.01.2017 14:54+7А почему бы не вынести framework за пределы public директории в 2017 году?
А почему бы не использоватьнеймспейсыPSR-4 в 2017 году?
А почему бы не использоватьнормальное оформление кодаPSR-2 в 2017 году?
А почему бы не использовать prepeared statements в ORM в 2017 году?
Дальше смотреть не хочется…ilyaplot
31.01.2017 14:57+1Для тех, кто скажет, что PSR-2 заявлен во второй версии просто процитирую перевод стандарта.
Имена методов ДОЛЖНЫ быть объявлены с использованием т.н. «camelCase» (первое слово пишется в нижнем регистре, далее каждое слово начинается с большой буквы, а между словами нет разделителей).
В коде все методы начинаются с заглавной.
sleeply4cat
31.01.2017 15:32+2неужели SQL руками экранируется? 0__о
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; } }
andreymal
31.01.2017 15:46+1Справедливости ради, в 2.0 это, если верить грепу, единственное такое место, в 1.0.3 такого было побольше
ort
31.01.2017 15:49+1Это называется старый код, ORM есть во фреймворке и используется только в части проекта.
Весь код мы не переписывали, иначе бы и этого бы не было.
Код проекта ни на что не претендует, модных штук (фреймворки, контейнеры и прочее) не использует. Как-то так.SamDark
31.01.2017 15:51+1Конкретно это место, конечно, стоило бы переписать. С виду вроде всё проэкранировано, но уверенности всё равно нет.
ort
31.01.2017 16:01Как уже выше заметили, это такое одно (надеюсь) сильно запущенное место по части sql. Перевод на ORM потянет за собой кучу entity с переписываем большого пласта кода. Не рискнули.
andreymal
31.01.2017 15:57-2Можно было бы хотя бы для приличия
// TODO: переписать этот говнокод
воткнуть.)
А тот ORM, которыйEntityORM
, страшненький, неудивительно что не хочется его юзать. (Вообще, по моим грубым оценкам, CMS такого уровня можно накатать с нуля месяца за три, если не стесняться пользоваться сторонними батарейками.)SamDark
31.01.2017 15:59+1Оптимистичные прикидки — они всегда такие ;)
andreymal
31.01.2017 16:01Они основаны на реальном времени разработки двух лайвстритоподобных сайтов, в связи с чем чуть ближе к реальности чем обычно)
ort
31.01.2017 16:03+3Ну одно дело сделать «лайвстритоподобный» сайт, другое дело кастомизируемый open source, где уже твой говнокод будут видеть и другие
Fed_Mikron
31.01.2017 16:26Увидел новость — обрадовался. Движок нравится, версию 2 уж и не ждал, а тут такой сюрприз.
Но после каментов озадачился, что-то сильно ругаете его…
Таки имеет смысл переходить на 2.0 (для новых сайтов) или лучше проверенную 1.0.3 использовать?
Ugputu
31.01.2017 17:04+1Че там? Админку нормальную сделали? Все так-же тормозит как и 3 года назад? Или можно смотреть без боли?
spions
31.01.2017 22:52Судя по количеству ошибок php7cc совместимости с php7 нет?
Или как с первой версией, LS заработает только после сильной правки модуля базы данных?Shushlyaev
31.01.2017 23:22юзаю на локалке php7, ls2 полёт нормальный
KaMaToZzz
Поздравляю с релизом.
Хотелось бы поинтересоваться о будущем проекта.
Какие планы на развитие? Промежуток между последнем релизом 4 года. На сколько актуальная версия 2 по нынешним стандартам?
Как вы планируете дальнейшее развитие?
Что сладкого готовите на ближайшее будущее?