Как я писал CMS

7 Сен
2011

Хотелось бы поделиться опытом по созданию CMS. Думаю многим разработчиками приходиться Сталкиваться с проблемой однообразного написания одинаковых панелек для почти одинаковых сайтов. Вот так и родился достаточно удобный, по моему мнению и мнению заказчиков (начальнику как всегда что-то не нравиться) проект — psy admin.

Введение:


Начнем (краткость — сестра таланта)

Начальная стадия:


В начале нужно было выбрать все необходимые библиотеки.
в процессе были использованы библиотеки
  • Smarty (куда уж без MVC)
  • Adodb (на мой взгляд самая удобная библиотека для работы с базой)
  • FCKeditor (было необходимо в некоторых местах создание html страниц пользователями)
  • PHPmailer (пока не знаю зачем — рассылку писем еще не реализовал, ибо без надобности)

Вот так и родился небольшой движок, со всеми необходимыми функциями (хотя о чем это я… 13 Mb уж точно не небольшой)
Затем мне нужно было определиться как будут определяться необходимые для редактирования поля, их количество, и разные дополнительные плюшки к ним.
Решено было сделать по классу на каждую категорию редактируемых объектов с 2-мерным массивом для всех полей, и парой дополнительных полей, для удобного отображения всего.
В тот момент я работал над сайтом для какой-то лабуды Агентства по обмене недвижимости, поэтому названия полей и всего всего будут специфичны для данной области деятельности.
class  extends psy{
    function __construct(){
        $this->name="Обмен комнат";
        $this->level=99;
        $this->field[]=array("field"=>"Количество комнат","name"=>"komnat","type"=>"text");
        $this->entry=array("komnat");
    }
}

Соответсвенно
  • $name — общее название всего раздела
  • $level — уровень доступа к этому разделу
  • $field — тот самый двумерный массив, в котором все это храниться
  • $entry — массив, для отображения полей в списке

Перейдем к их родителю. Он достаточно простенький с объявлением всех переменных, а также нескольких функций которые в последствии понадобятся.
В нем на начальной стадии были реализованы функции транслита,
генерации селектика
function select_html($name_select,$base,$selected=0,$disabled=0,$id='id',$name='name'){
        $select="<select name='$name_select'>";
        if($disabled)$select.="<option value='0' selected>$disabled</option>";
        foreach($db->getall("select * from `$base`") as $r)if($r[$id])$select.="<option".($r[$id]==$selected?" selected":"")." value='".$r[$id]."'>".$r[$name]."</option>";
        return $select."</select>";
    }

И создания папок (/first/second/third/…/…/…/)
function create_dir($dir){
    $dir=explode("/",$dir);
    foreach($dir as $r=>$t){
        $direct="";
        for($i=0;$i<=$r;$i++)$direct.=$dir[$i]."/";
        if(!is_dir($direct))mkdir($direct);
    }
}

Ну чтож. С этим разобрались. Теперь приступим к main.php (думаю сразу понятно — что это)
Авторизацию я решил реализовать по простому — basic. (не думаю что стоит объяснять как ее делать, а если кто не знает то есть куча примеров)
Чтобы не гемороиться каждый раз с шаблонами и css с js я решил убить 2х зайцев
$css=scandir('template/css/');$js=scandir('template/js/');
foreach($css as $c)if($c!='.'&&$c!='..')$css_styles[]="/>";
foreach($js as $c)if($c!='.'&&$c!='..')$css_styles[]="";
$smarty->assign('css_styles',$css_styles);

Теперь необходимо было выделить все классы, которые наследуются от psy (написанные нами для работы админки)
Более лучшего решения я не нашел поэтому вот что получилось
$p_class=get_declared_classes();
require_once('config/psy.inc');
$classes=array_diff(get_declared_classes(), $p_class);

Перво наперво создаем объекты всех наших классов и генерируем симлинки (для виндовских сервов приходилось копировать ручками)
foreach($classes as $r){
    $$r=new $r();
    if(!file_exists($r.'.php'))symlink('index.php',$r.'.php');
}

Завершение:


Вот и готова небольшая основа под нашу панельку. Описание и разбор файла который кушает все то что мы ему скидывает я опишу в следующей статье, потому что там будет слишком много описаний и различных примеров.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх