Dmarck
Новичок
Как вам такая реализация структуры кмски/фреймворка?
Привет всем, хочу посоветоваться с вами, как лучше и в правильном ли я направление двигаюсь. Так как не хочется наступать на одни и теже грабли много раз.
Собственно это у меня не первая кмска, где-то так 5, если не ошибаюсь. Во всех прошлых не устраивала структура (сложно было разворачивать кмску для новых сайтов) поэтому и советуюсь с вами, как вам такая структура кмски. Я уверен что в этой должно быть проще! (хочу узнать ваше мнение).Так же можно считать этот пост маленьким анонсом кмски.
Кмс = цмс = Система управления контетом.
В общем у меня даже не кмска, а небольшой фреймворк получается.
Сейчас немного опишу что есть в кмске, а ниже подробней о каждом пункте.
- мультисайтовость
- мультиязычность
- страницы (шаблоны)
- Виды
- модули (MVC)
- контроллеры
- модели
- & Страницы -> Виды
- библиотеки*
- хелперы*
- логи (дебаггер)
- аякс
- библиотека Котерова “DbSimple” для работы с БД.
- чпу
* - 100% точно такие же по реализации, как у CodeIgniter (Но свои)
Пожалуй это всё.
Теперь подробней обо всём
Мультисайтовость.
Мне надоело таскать и следить за каждым сайтом чтобы в каждом присутствовали мои любимые библиотеки и наконец то собрать все их вместе и больше не мучаться с их присутствием. Дальше о мультисайтовости пойдёт разговор в модулях. Пока лишь можно сказать что сайт определяется по домену, все нужные домены определены в общем конфиге системы и если есть совпадение то по умолчанию ставится директория с нужным сайтом, если совпадений нет то по умолчанию ставится директория с дефолтным сайтом.
Мультиязычность.
Так как в скором времени предстоит работа с сайтами, которые должны быть на разных языках. Разумно включить и мультиязычность. Тут нет ничего сложно просто в папке с сайтом есть директория languages ну а в нём папки с языками. В директории с языком может быть как один файл со всеми фразами так и директории (вообщем кому как удобней тот так и разбивает), главное что нужный язык можно подключить из любого места в шаблонах (так и етсь), написав $this->lang->load('адрес файл'), а вызывать нужные фразы можно через $this->lang->имя_файла->item('фраза'); Таким способ можно подключать хоть все языки сразу.
Страницы.
Я решил их назвать так. А вообще они очень похожи на шаблоны (как у нормальных людей, или типы страниц)
Какую страницу показывать будет решать система, в зависимости от текущего юрл.
У каждого сайта есть несколько типов страниц. Вот в директории со страницами и лежат эти типы. Например (Главная страница, Новости, Статя/Статьи, Обратная связь, ...)
Страницы представляют из себя обычный html, в котором выполняется пхп код.
Чтобы страницы не были просто страницами в них можно подключать (модули, виды, языки, (на счёт моделей не уверен, но у меня нет никаких ограничений нет, поэтому думаю можно будет)). И так чтобы подключить что-то нужно написать.
- $this->lang->load('язык'); // язык
- $this->modules->load('имя_модуля'); // Модуль
- $this->view('адрес файла с видом'); // Дополнительные шаблоны.
- $this->db // Обращенее к бд.
- $this->libraries...
- $this->helpers...
- закономерность я думаю понятна.
Вот вроде и всё что мне нужно от страниц.
Виды
Виды предоставляют теже возможности что и страницы. Только обращения к ним происходит либот от страниц либо от модулей ну или либо от самих видов.
Если обращение к виду происходит от страницы, то сначала ищем вид в директории со страницей, а потом в общей др. Если обращение происходит от модуля. То сначала смотрим в директории с модулем, потом в директории со страницей, а потом уже в общей др. Виды сделаны для того чтобы исключить один и тот же html код в шаблонах страниц. Например header, footer, ну и т.д. Чтобы подключить вид необходимо напистаь
- $this->view('адрес файла'); так же есть доп. параметры в которых можно указать, чтобы система возвращала результат работы вида в виде строки или передать в вид какие-то переменные.
Модули
Модули у меня с MVC
Поэтому в модуле есть контроллеры, модели и виды.
По умолчанию если мы подключаем модуль
- $this->modules->load('имя_модуля');
управление переходит на главный контроллер модуля (он должен иметь тоже имя что и имя модуля). Ну а в контроллере уже можно подключать другие суб-контроллеры, при этом всё управление передается подключаемому новому контроллеру.
- $this->controllers->load('имя_контроллера');
Так же подключать можно модели и виды.
Библиотеки
Библиотеки это теже классы, созданные в помощь разработчику.
Хелперы
Это уже не библиотеки и не классы, это просто отдельные функции. Опять же для помощи в разработке.
Логи
Логи собираются в определенной директории выбранного сайта с именами (датой d.m.Y H:i); ну и отчётами внутри. Логируются как ошибки так и сообщения для отладки. Что-то залогировать можно след. Образом
- log_message('debug', 'текст');
ошибки логируются автоматически.
В конфиге каждого сайта можно настроить разынй уровень логирования либо в обще его отключить.
аякс
Работать с аяком можно из любого места для этого лишь нужно написать
die('содержимое, которое нужно вернуть'); кроме этого ничего лишнего отданно не будет так как используется буфферизация.
Для работы с БД я включил в набор библиотеку Котерова.
Подробней о ней можно почитать на сайте dklab.ru
Ну и кужа же без чпу. В настройках сайта нужного сайта всё это можно настроить, например можно включить опцию, чтобы добавлялся суффикс к адресу, например ('.html'); Работать с юрл можно
написав $this->uri->segment('номер нужного нам сегменты');
Вообще с классом uri много тонкостей, чтобы не сбиваться я дам ссылку на похожее описание, собственно на то что я опирался, когда писал этот класс, там есть моменты похожие http://code-igniter.ru/user_guide/libraries/uri.html
Концовка.
Забыл написать про админку, Так как систему мульсайтовая то и админка может быть как для группы сайтов так и для каждого сайта персональная. Поэтому в настройках сайта можно указать директорию нужной админкой. Ну а там уже админка разберёться что и как показывать. Админка строится только так же как и сайт, тоесть из страниц, модулей, видов и т.д. Теперь о моём решение чтобы не таскать кучу библиотек за собой на каждый сайт. Если мы делаем много сайтов на этой кмски, то вопрос слежения за библиотеками решается сам по себе. Если мы видим что библиотека нужна для нескльких сайтов то кладём её в папку с библиотеками в системныю директорию. А если только для одного сайт, то в папку в директорию сайта. Тоже самое с хелперами.
Теперь зачем я всё это написал, так как я уже много раз наступал на грабли (заходил в тупик), хотел бы услышать комментарии людей хорошо понимающих в этой области. И предусмотреть в системе сразу несколько разных вариантов. А не открывать их для себя при создании сайта. Что очень часто выбивает из сроков отведённых на разработку сайта.
А ещё в видах можно использовать следущее. Его не нужно воспринимать в серьёз, но да, такое в системе тоже есть.
Обращение к страницам из страниц или из видов.
$this->pages->load('имя страницы'); таким способ мы можем подключить какую-то нужную нам страницу. Например у меня была такая необходимость для одного сайта. На главной странице мне необходимо было вывести статью, которая привязана к внутренней странице. Поэтому я использовал след. конструкцию
$this->pages->load('articles', FALSE);
$this->pages->articles->modules->load('articles');
echo $this->pages->articles->modules->articles->getArticle();
На производительности это не как не сказалось, так как загрузился только каркас страницы и модуль статей. Сам шаблон страницы статей не выполнялся (false).
Фух, вроде всё объяснил, жду критики и советов.
Спасибо за внимание.
Привет всем, хочу посоветоваться с вами, как лучше и в правильном ли я направление двигаюсь. Так как не хочется наступать на одни и теже грабли много раз.
Собственно это у меня не первая кмска, где-то так 5, если не ошибаюсь. Во всех прошлых не устраивала структура (сложно было разворачивать кмску для новых сайтов) поэтому и советуюсь с вами, как вам такая структура кмски. Я уверен что в этой должно быть проще! (хочу узнать ваше мнение).Так же можно считать этот пост маленьким анонсом кмски.
Кмс = цмс = Система управления контетом.
В общем у меня даже не кмска, а небольшой фреймворк получается.
Сейчас немного опишу что есть в кмске, а ниже подробней о каждом пункте.
- мультисайтовость
- мультиязычность
- страницы (шаблоны)
- Виды
- модули (MVC)
- контроллеры
- модели
- & Страницы -> Виды
- библиотеки*
- хелперы*
- логи (дебаггер)
- аякс
- библиотека Котерова “DbSimple” для работы с БД.
- чпу
* - 100% точно такие же по реализации, как у CodeIgniter (Но свои)
Пожалуй это всё.
Теперь подробней обо всём

Мультисайтовость.
Мне надоело таскать и следить за каждым сайтом чтобы в каждом присутствовали мои любимые библиотеки и наконец то собрать все их вместе и больше не мучаться с их присутствием. Дальше о мультисайтовости пойдёт разговор в модулях. Пока лишь можно сказать что сайт определяется по домену, все нужные домены определены в общем конфиге системы и если есть совпадение то по умолчанию ставится директория с нужным сайтом, если совпадений нет то по умолчанию ставится директория с дефолтным сайтом.
Мультиязычность.
Так как в скором времени предстоит работа с сайтами, которые должны быть на разных языках. Разумно включить и мультиязычность. Тут нет ничего сложно просто в папке с сайтом есть директория languages ну а в нём папки с языками. В директории с языком может быть как один файл со всеми фразами так и директории (вообщем кому как удобней тот так и разбивает), главное что нужный язык можно подключить из любого места в шаблонах (так и етсь), написав $this->lang->load('адрес файл'), а вызывать нужные фразы можно через $this->lang->имя_файла->item('фраза'); Таким способ можно подключать хоть все языки сразу.

Страницы.
Я решил их назвать так. А вообще они очень похожи на шаблоны (как у нормальных людей, или типы страниц)
Какую страницу показывать будет решать система, в зависимости от текущего юрл.
У каждого сайта есть несколько типов страниц. Вот в директории со страницами и лежат эти типы. Например (Главная страница, Новости, Статя/Статьи, Обратная связь, ...)
Страницы представляют из себя обычный html, в котором выполняется пхп код.
Чтобы страницы не были просто страницами в них можно подключать (модули, виды, языки, (на счёт моделей не уверен, но у меня нет никаких ограничений нет, поэтому думаю можно будет)). И так чтобы подключить что-то нужно написать.
- $this->lang->load('язык'); // язык
- $this->modules->load('имя_модуля'); // Модуль
- $this->view('адрес файла с видом'); // Дополнительные шаблоны.
- $this->db // Обращенее к бд.
- $this->libraries...
- $this->helpers...
- закономерность я думаю понятна.
Вот вроде и всё что мне нужно от страниц.
Виды
Виды предоставляют теже возможности что и страницы. Только обращения к ним происходит либот от страниц либо от модулей ну или либо от самих видов.
Если обращение к виду происходит от страницы, то сначала ищем вид в директории со страницей, а потом в общей др. Если обращение происходит от модуля. То сначала смотрим в директории с модулем, потом в директории со страницей, а потом уже в общей др. Виды сделаны для того чтобы исключить один и тот же html код в шаблонах страниц. Например header, footer, ну и т.д. Чтобы подключить вид необходимо напистаь
- $this->view('адрес файла'); так же есть доп. параметры в которых можно указать, чтобы система возвращала результат работы вида в виде строки или передать в вид какие-то переменные.
Модули
Модули у меня с MVC
Поэтому в модуле есть контроллеры, модели и виды.
По умолчанию если мы подключаем модуль
- $this->modules->load('имя_модуля');
управление переходит на главный контроллер модуля (он должен иметь тоже имя что и имя модуля). Ну а в контроллере уже можно подключать другие суб-контроллеры, при этом всё управление передается подключаемому новому контроллеру.
- $this->controllers->load('имя_контроллера');
Так же подключать можно модели и виды.
Библиотеки
Библиотеки это теже классы, созданные в помощь разработчику.
Хелперы
Это уже не библиотеки и не классы, это просто отдельные функции. Опять же для помощи в разработке.
Логи
Логи собираются в определенной директории выбранного сайта с именами (датой d.m.Y H:i); ну и отчётами внутри. Логируются как ошибки так и сообщения для отладки. Что-то залогировать можно след. Образом
- log_message('debug', 'текст');
ошибки логируются автоматически.
В конфиге каждого сайта можно настроить разынй уровень логирования либо в обще его отключить.
аякс
Работать с аяком можно из любого места для этого лишь нужно написать
die('содержимое, которое нужно вернуть'); кроме этого ничего лишнего отданно не будет так как используется буфферизация.
Для работы с БД я включил в набор библиотеку Котерова.
Подробней о ней можно почитать на сайте dklab.ru
Ну и кужа же без чпу. В настройках сайта нужного сайта всё это можно настроить, например можно включить опцию, чтобы добавлялся суффикс к адресу, например ('.html'); Работать с юрл можно
написав $this->uri->segment('номер нужного нам сегменты');
Вообще с классом uri много тонкостей, чтобы не сбиваться я дам ссылку на похожее описание, собственно на то что я опирался, когда писал этот класс, там есть моменты похожие http://code-igniter.ru/user_guide/libraries/uri.html
Концовка.
Забыл написать про админку, Так как систему мульсайтовая то и админка может быть как для группы сайтов так и для каждого сайта персональная. Поэтому в настройках сайта можно указать директорию нужной админкой. Ну а там уже админка разберёться что и как показывать. Админка строится только так же как и сайт, тоесть из страниц, модулей, видов и т.д. Теперь о моём решение чтобы не таскать кучу библиотек за собой на каждый сайт. Если мы делаем много сайтов на этой кмски, то вопрос слежения за библиотеками решается сам по себе. Если мы видим что библиотека нужна для нескльких сайтов то кладём её в папку с библиотеками в системныю директорию. А если только для одного сайт, то в папку в директорию сайта. Тоже самое с хелперами.
Теперь зачем я всё это написал, так как я уже много раз наступал на грабли (заходил в тупик), хотел бы услышать комментарии людей хорошо понимающих в этой области. И предусмотреть в системе сразу несколько разных вариантов. А не открывать их для себя при создании сайта. Что очень часто выбивает из сроков отведённых на разработку сайта.
А ещё в видах можно использовать следущее. Его не нужно воспринимать в серьёз, но да, такое в системе тоже есть.
Обращение к страницам из страниц или из видов.
$this->pages->load('имя страницы'); таким способ мы можем подключить какую-то нужную нам страницу. Например у меня была такая необходимость для одного сайта. На главной странице мне необходимо было вывести статью, которая привязана к внутренней странице. Поэтому я использовал след. конструкцию
$this->pages->load('articles', FALSE);
$this->pages->articles->modules->load('articles');
echo $this->pages->articles->modules->articles->getArticle();
На производительности это не как не сказалось, так как загрузился только каркас страницы и модуль статей. Сам шаблон страницы статей не выполнялся (false).
Фух, вроде всё объяснил, жду критики и советов.

Спасибо за внимание.
