При написании статей на Хабре я заметил, что многим не по душе умерший Kohana framework, и слышал много критики в адрес проекта по этой причине и задумался над вопросом: « Как быть и что делать с Kohana?», ведь фреймворк совершенно не способствует развитию CMS на протяжении года.
Первые мысли были о продолжении развития Kohana собственными силами. Первым делом в систему был интегрирован Composer, модули и плагины мигрировали в пакеты в репозиторий https://packagist.org/packages/kodicms/ и в инсталлятор composer добавлены типы пакетов https://github.com/composer/installers. После этого потратив немного времени на поиск наткнулся на проект Kohana54 (https://github.com/kohana54/core), разработчик которого решил привести все классы в соответствие стандарта PSR-4 но видимо оставил до лучших времен. По началу меня это не сильно тревожило, можно было попробовать закончить и за него, но через несколько дней я понял, что помимо самого ядра придется также переписывать и остальные стандартные модули фреймворка, а также и все модули CMS, что равносильно использованию другого, более современного фреймворка и решил окончательно завязать с Kohana.
Встал вопрос: «Какой фреймворк выбрать?»
- Laravel
- FuelPHP
- Symfony
- Yii2
- Zend Framework 2
- CakePHP
Сравнение фреймворков может потянуть на целую статью, поэтому ограничусь только своим выбором, Laravel framework, который меня заинтриговал:
- своей простотой и более менее логичной структурой приложения,
- отличной архитектурой, которую можно было бы доработать под свои нужды,
- наличием кучи возможностей из коробки, которые могли бы помочь в реализации части переносимого функционала,
- удобная консоль,
- удобные инструменты работы с БД (миграция, сидирование),
- активное, живое сообщество,
- ну и самое главное фреймворк активно развивается, что, как я заметил по своему проекту, очень важно.
Для многих людей 1 апреля — ассоциируется с днем смеха, а для меня — день рождения нового проекта — KodiCMS на фреймворке laravel. Именно в этот день был создан новый репозиторий https://github.com/KodiCMS/kodicms-laravel и добавлен первый коммит в него.
Немного расскажу про структуру новой CMS. Многим известно что Laravel из коробки не имеет модульной структуры, а пакеты это не тоже самое, что и модули, поэтому первым делом был написан ModuleLoader, который помог с организацией модульной структуры и динамическим подключением модулей, просто указывая его имя в конфиге.
В итоге структура модуля имеет следующий вид
- config — конфиги приложения, могут быть перезаписаны из папки
/config/
- permissions.php — Служит для указания списка прав
- sitemap.php — Служит для указания страниц для меню админ панели
- behaviors.php
- Console
- Commands — расположение файлов консольных компанды
- database
- migrations — файлы миграции, будут запущены по команде
cms:modules:migrate
- seeds
- DatabaseSeeder.php — если существует, то будет запущен по команде
cms:modules:seed
- DatabaseSeeder.php — если существует, то будет запущен по команде
- migrations — файлы миграции, будут запущены по команде
- Helpers — вспомогательные классы модуля
- Http
- Controllers — контроллеры модуля
- Middleware
- routes.php — роуты текущего модуля, оборачиваются в namespace
KodiCMS\{module}
- Observers — Наблюдатели для моделей Eloquent
- Providers
- ModuleServiceProvider.php — Сервис провайдер (наследуемый от
KodiCMS\CMS\Providers\ServiceProvider
), если есть, будет запущен в момент инициализации приложения
- ModuleServiceProvider.php — Сервис провайдер (наследуемый от
- resources
- js — JavaScript файлы, в этой папке происходит поиск js файлов по виртуальным путям
/backend/cms/js/{script.js}
- lang — Файлы переводов для модуля, доступны по ключу названия модуля приведенного в нижний регистр
trans('{module}::file.key')
- views — Шаблоны модуля, доступны по ключу названия модуля приведенного в нижний регистр
view('{module}::template')
- packages.php — В данном файле можно подключать свои Assets (Media) пакеты
- js — JavaScript файлы, в этой папке происходит поиск js файлов по виртуальным путям
- Services — Сервисные контейнеры
- ModuleContainer.php — Если данный файл существует, то он будет подключен как системный файл модуля, в котором указаны относительные пути и действия в момент инициализации. Необходимо наследовать от
KodiCMS\CMS\Loader\ModuleContainer
Подробнее про модульность можно прочитать здесь
По аналогии с модулями планируется подключение плагинов сторонних разработчиков с единственным отличием, что активироваться они будут через административный интерфейс с возможностью их загрузки из репозитория.
Как говорится глаза боятся, а руки делают. После реализации модульной структуры началась процедура переноса стандартных модулей системы и реализация основных возможностей. И на данный момент по моим оценкам перенесено чуть более 60% функционала:
Добавление в Laravel модульной структурыПеренос ядра системыПеренос модуля «API»Перенос модуля «elFinder»Перенос модуля «Pages»Перенос модуля «Layouts»Перенос модуля «Snippets»Перенос модуля «Email»Перенос модуля «Cron jobs»Перенос модуля «Widgets»Перенос модуля «Dashboard»Перенос модуля «Users, Roles»- Перенос модуля ACL
- Перенос модуля «Datasource»
- Перенос плагина «Hyrid» и интеграция его в систему с расширенным функционалом
- Реализация инсталлятора системы
- Реализация подключения плагинов, со структурой аналогичной модулям
Изначально планировалось перенести весь функционал не менее чем за 6 месяцев, но что-то пошло не так и процесс пошел быстрее… Системой заинтересовались разработчики из группы в ВК http://vk.com/laravel_rus и на канале LaravelRUS, после чего энтузиасты стали предлагать помощь в разработке проекта одной из самых крутых OpenSource CMS на одном из самых крутых фреймворков.
Зачем нужна еще одна CMS?!
При использовании различных CMS я часто сталкивался с тем, что многие из них предлагают один и тот же функционал но с небольшими отличиями. Т.е. по сути многие CMS загоняют пользователя в определенные рамки, будь то структура URL или размещение контента на страницах сайта. Многие из них имеют самописное ядро, которое либо сложно расширять, либо приходится долго изучать документацию, чтобы начать разрабатывать.
При написании своей CMS мне хотелось собрать из них все самое лучшее и соединить в одну. Для начала я решил использовать один из популярных фреймворков и по минимуму вносить изменения в ядро, чтобы любой разработчик мог за кратчайшее время войти в процесс разработки. К тому же я не хочу CMS как у всех, только со своим именем, моя цель сделать некий конструктор, в котором можно конструировать собственные разделы (блог, новости и т.д.) посредством добавления в них полей нужных типов через админ панель, которые не жестко вшиты в код системы, а добавлялись бы с помощью плагинов сторонними разработчиками. Тоже самое и с выводом контента на страницы сайта. Чтобы каждый пользователь без особых знаний в программировании и ковыряния шаблонов сайта мог вывести необходимые данные, будь то список документов или меню сайта или обычный HTML.Дать возможность контент менеджеру использовать свой любимый текстовый редактор, который можно встроить в систему посредством API и полноценно использовать в админ панели.
Идей по системе море и все они реализуемые и большинство из них уже реализованы. Некоторые из них возможно нуждаются в доработке. Но все как обычно упирается в разработчиков. Поэтому приглашаем всех желающих присоединиться к разработке, тем более это поможет повысить свой опыт в работе с фреймворком Laravel, а также использовать свой опыт в дальнейшем.
Как обычно вы всегда можете посмотреть результат работы:
Сайт: http://laravel.kodicms.ru/backend
- username: admin@site.com
- password: password
- username: test@test.com
- password: password
Благодарности
Благодаря KodiCMS я открыл для себя мир добрых сервисов и людей, готовых предоставить свою помощь:
- Хабрахабр — за помощь стартапам
- Jetbrains — за предоставление OpenSource ключа для PHPStorm
- Группу http://vk.com/laravel_rus, а именно xelam — за помощь в развитии системы
- sleeping-owl, который является по совместительству автором пакета для Laravel для создания admin панели https://github.com/sleeping-owl/admin
- greabock
P.s. В ближайшее время состоится первая online встреча по обсуждению проекта, на которой будет рассказано более подробно про систему, ее историю и о текущем состоянии https://vk.com/kodicms?w=wall-48395169_287%2Fall
Upd. На данный момент система еще имеет статус Alpha версии и могут возникать ошибки в работе или недочеты, которые будут в последствии устранены. Баг репорты приветствуются.
Комментарии (31)
Invision70
27.05.2015 11:41+1Доступ к файловому менеджеру открыт для всех, исправьте.
laravel.kodicms.ru/api.filemanager?cmd=open&target=l1_Lw&init=1&tree=1&_=1432715839023ButscH Автор
27.05.2015 11:46Спасибо. Модуль API также в будущем будет использовать API ключи которые будут генерироваться в админ панели и будут требоваться в том случае если пользователь не авторизован или для доступа сторонним ресурсам.
Nord001
27.05.2015 11:56Добрый день!
Если что, я там поиграл утром, добавил счётчик:
metrika.yandex.ru/stat/dashboard/?counter_id=30572062
Я без злого умысла — просто поиграться…
Кстати, очень внешне понравилась админка, успехов вам!ButscH Автор
27.05.2015 12:00Спасибо за счетчик, я совсем про него забыл. Добавил код также на внутренние страницы админ панели
denver
27.05.2015 12:13+3отличной архитектурой, которую можно было бы доработать под свои нужды,
Ларавел хорош, удобно пользоваться, всё ок пока не придет нужда залезть в их исходники чтобы понять как расширить/переопределить что-то под свои нужды. Да и повсеместные __call() и, как следствие, невозможность «серфить» по коду в IDE не добавляют ощущения отличной архитектуры. Порой хочется грустно посмотреть в глаза таким архитекторам. Правда не так часто нужно лазить под капот.
justmara
27.05.2015 12:13...Hello Kodi XSS?
спасибо тому, кто порадовал с утра 8)Invision70
27.05.2015 12:13+3Не благодари :)
Виджеты > Меню > Редактирование виджета > Header menu
В «Название» пишем Header menu]-->тут_script
Проверил, другие поля XSS не пропускают.
Invision70
27.05.2015 12:53+2«Теория разбитых окон» в действии, коммент теряет свой opacity )
Если сливаете, то разъясните по какой причине. Разработчики дали публичный доступ, решил протестировать.
Инициатива наказуема (ButscH Автор
27.05.2015 13:01-3Ну собственно я не против твоего баловства, но это можно показать на внутренней странице и показать в чем проблема. На данный момент ты не единственный, кто может тестировать или хочет посмотреть систему, а если ее кто-то ломает, то для других появляется проблема доступа и всякие неудобства. Сломать всегда проще, чем сделать, но при этом всегда необходимо помнить о других. Мне вообще интересна проблема, которую ты показал, т.к. это явная недоработка, но хотелось бы видеть обратную связь немного по другому.
justmara
27.05.2015 13:56+1довольно глупо выкладывать в паблик со словами "вот, посмотрите, какой я молодец" и надеяться, что все будут только смотреть, не трогать и хвалить "какой ты молодец". Особенно с таким абмициозно-детским посылом:
При написании своей CMS мне хотелось собрать из них все самое лучшее и соединить в одну.
ButscH Автор
27.05.2015 14:05Моя ошибка, я не уточнил, что на данный момент alpha версия, и в данный момент активно ведется перенос модулей со старой версии. По ссылке можно посмотреть результат переноса на данный момент времени, но это не окончательный вариант. Об этом также говорит лейбл alpha в логотипе админ панели.
P.s. я с большим уважением отношусь к баг репортам и по возможности стараюсь проблемы исправлять в кратчайшие сроки.
resurection
27.05.2015 23:54Имея доступ в админку любой может сломать сайт. Например, удалив все разделы. Даже взламывать ничего не надо. Какой в этом смысл?
Invision70
28.05.2015 13:08Речь идет не о поломке сайта, а о безопасности ваших пользователей. Приведу небольшой пример.
У тебя есть доступ в административную часть с ограниченными правами, например корректировать и публиковать статьи на сайте. Злоумышленник получает доступ к твоей учетной записи, внедряет xss, ловит сессию администратора сайта и получает полный доступ в админпанель. Остается залить шелл и выгрузить дамп БД.resurection
28.05.2015 14:02А зачем вы даёте доступ к админке злоумышленникам?
Не возможно защититься от всех. Приведу другой пример: работник ДатаЦентра вынимает hdd из вашего сервера, вставляет в свой комп и выгружает БД. Просто не давайте доступ к админке злоумышленникам.justmara
28.05.2015 14:36А можно, я попробую пояснить, что имел ввиду тов. Invision70?
Так вот, он пытается донести мысль, что обычно CMS пользуются не только админы. Зачастую доступ даётся всяким контент-менеджерам, которые по уровню компьютерной грамотности и элементарных навыков сетевой безопасности находятся где-то в пределах погрешности от абсолютного ноля. Они используют простые пароли, они оставляют залогиненные сессии в паблик местах, они не лочат комп на рабочем месте и тд. и тп.
Так вот речь о том, что получив доступ к аккаунту такого нерадивого товарища можно через xss получить доступ и к админскому аккаунту.
Evgeny42
27.05.2015 14:37А почему phalcon не рассматривали? :)
PaulMaly
27.05.2015 15:33+1Возможно потому что CMS должна вставать на 99,9% хостингов, включая shared, простым переписыванием файлов. Phalcon прекрасен, но не для таких «коробок».
Evgeny42
27.05.2015 15:36Не знаю как Laravel 5, но 4 версия, по моему, вставала на shared хостинги с большим трудом и не желанием. Как сейчас с этим обстоит?
PaulMaly
27.05.2015 17:52Без понятия. Но как минимум Laravel использует не столь специфические расширения PHP, как Phalcon, который им собственно и является. Поэтому уверен что Phalcon стоит на кол-ве хостингов стремящемся к 0, а то что нужно для того же Laravel можно найти много где.
asmaster
27.05.2015 15:45Я в PHP не очень разбираюсь, просто интересно: зачем вообще сейчас нужны shared хостинги, когда есть, например, Digital Ocean за $5 в месяц.
Claud
27.05.2015 16:31Так не всякий сможет справится с администрированием, хотя конечно есть vds с панелями, но там тоже проблемы могут нарисоваться.
PaulMaly
27.05.2015 18:22Собственно мы так и делаем и спокойно используем Phalcon и получаем все преимущества от этого. Но как правильно заметил предыдущий отвечающий, администрировать не все умеют.
Как минимум человек, который использует CMS, скорее всего не готов ставить дополнительные расширения PHP и т.п. Для таких CMS коробок инструкция сложнее чем «возьмите эти файлы и перепишите сюда», думаю равносильна забвению.
Claud
27.05.2015 16:29Лучше сделайте разовые демки для страждущих. Для каждого генерируйте на подомене отдельная установка (копируйте копию системы, да накатываете базу с префиксом например) и там пусть молодые таланты изливают свои мысли уровня «Здесь был Вася Пупкин все идите на три буквы!!!!!!!....».
Ashot
laravel.kodicms.ru/backend у вас тут эксепшн вылетает, к сожалению.
ButscH Автор
Спасибо, исправил. К сожалению такое имеет место быть, т.к. еще alpha версия, но система периодически переустанавливается по крону.
resurection
Извините меня. Это я сломал вашу админку переключив в настройках параметр сессия=apc.
Я, однако, не понимаю, зачем это делать в админке, ведь это относиться к серверным настройкам. Я бы своим клиентам не стал бы давать админку с такими настройками, ведь большинство из них дураки. Они даже не знают где поменять тайтл для главной страницы. А уж переключение драйверов хранения сессии точно должно быть в системном конфиге который редактируется только программистом.
ButscH Автор
Данные настройки планируется защищать через ACL модуль и давать права на их изменение только администраторам или еще каким либо ролям, ну а так да, я согласен, возможно стоит убрать. Именно этим и хороша обратная связь. Спасибо.
resurection
Администратор=программист? Мне кажется к этим настройкам никто не должен иметь доступа, кроме программиста.
И ещё, они не должны быть в админке только потому что можно всё сломать, а восстановить обратно уже не получится. Как сейчас и произошло.