1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

[будущая CMS]Реализовал немножко идею из своей старой темы

Тема в разделе "Оффтопик", создана пользователем danilko, 27 мар 2014.

?

Интересно

  1. Продолжай, может, что-нибудь и выйдет

    3 голосов
    75,0%
  2. Забудь на совсем...

    1 голосов
    25,0%
  3. Не заинтересовало

    0 голосов
    0,0%
  1. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Ну вот, немножко так реализовал, те кто видел старую тему - поймут.

    Раз уж я собрался делать нестандартную CMS, то собственно и установка не такая как у многих.
    Ниже расскажу немного об установщике, его вы можете скачать в прикрепленном файле.
    В общем установка как у многих "десктопных" приложений, только не в плане интерфейса (AJAX нету), а в плане получения файлов, мне показалось, что качать свежие файлы(например, как FlashPlayer) намного лучше, чем использовать "предустановку" с "донастройкой" (та же Joomla). Прошу сильно не ругать за код установщика, класс updater буду использовать в CMS (собсно для обновления), а все остальное постараюсь переписать через некоторое время. Если много народу будет одновременно ставить себе CMS, то сервер с установочными файлами ляжет(хостингер же), по этой причине прошу часто не дергать updater.php.

    Ну сама CMS что на данный момент умеет.
    Вообще, только странички создавать, редактировать и удалять, но я добавил расширяемость и даже одно расширение - счетчик посетителей. Но это только пользовательская часть, а так довольно много сделал для основы, даже по причине нагрузки на БД (в прошлой теме @ykpon говорил об этом) реализовал кеширование (аж с шифрованием, самоделка, наверно, легко расшифровать, по этому ещё и .htaccess`ом прикрыл кеш:)).

    Ну значит как установить сие чудо :)
    1. Качаем updater.php на сайт, где будем держать копию системы
    2. Открываем в браузере этот файл
    3. Делаем, что там просит установщик (большую часть работы он сделает за вас)
    И на последок скажу, что стабильность работы не обещаю, т.к. установщик написал всего за 30 минут и особо не тестировал как он там выполняет свою работу. Ой, вспомнил что импорт таблиц в БД не сделал :) приложу ниже дампик (всего 4 малюсеньких таблицы)
    Опять длинновато вышло...
    Таблицы:
    Код:
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
    
    CREATE TABLE IF NOT EXISTS `new_extensions` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `mask` text COLLATE utf8_unicode_ci NOT NULL,
      `adm_show` int(1) NOT NULL,
      `global` int(1) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
    
    INSERT INTO `new_extensions` (`id`, `mask`, `adm_show`, `global`) VALUES
    (1, 'users', 0, 1);
    
    CREATE TABLE IF NOT EXISTS `new_pages` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `url` text COLLATE utf8_unicode_ci NOT NULL,
      `title` text COLLATE utf8_unicode_ci NOT NULL,
      `ext` text COLLATE utf8_unicode_ci NOT NULL,
      `desc` text COLLATE utf8_unicode_ci NOT NULL,
      `keys` text COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;
    
    INSERT INTO `new_pages` (`id`, `url`, `title`, `ext`, `desc`, `keys`) VALUES
    (1, '/index.php', 'Главная страница', 'id1', '', '');
    
    CREATE TABLE IF NOT EXISTS `new_registry` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `key` text COLLATE utf8_unicode_ci NOT NULL,
      `value` text COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ;
    
    INSERT INTO `new_registry` (`id`, `key`, `value`) VALUES
    (1, 'main.admin_pass', '123456'),
    (13, 'id1.record', '5'),
    (14, 'id1.recordDate', '23 03 2014');
    
    CREATE TABLE IF NOT EXISTS `new_sessions` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sessionid` text COLLATE utf8_unicode_ci NOT NULL,
      `date` int(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=22 ;
    
    INSERT INTO `new_sessions` (`id`, `sessionid`, `date`) VALUES
    (21, '1c8e6328b71ffa9b0bc464d67e7d591d', 1403271701);
    
    Ну вот, РБ не принимает php файлы... Тогда вот код:
    Код:
    <?php
    //ТУТ ОЧЕНЬ МНОГО ГОВНО-КОДА, знаю - сам его писал...
    
    ini_set('display_errors', 1);//показываем ошибки в окне браузера
    
    error_reporting(E_ALL);//репортим все: Error, Warning и Notice
    
    if(filter_input(INPUT_POST, 'poster') == null){
        $URI = str_replace(basename(__FILE__),"",str_replace(filter_input(INPUT_ENV,"HTTP_HOST"),"",filter_input(INPUT_SERVER,"PHP_SELF")));
       
        ?>
    <h3>Типа установка CMS "EasyWebSite"</h3>
    Пока то, что сейчас перед вашими глазами, представляет собой скрипт автоматической установки и настройки CMS.<br/>
    Сие чудо скачивает и ставит самую свежую сборку CMS (иногда, даже свежее, чем в репозитории на github).<br/>
    Во время установки скрипт делает следующее: определяет URL хранилища, с которого потом качает свежие файлы и некоторые из них патчит в соответствии с настройками, которые вы введете ниже.<br/>
    Я знаю, что иногда после установки в коде могут обноружиться ошибки, и это естественно, т.к. могут возкниуть ошибки во время передачи скриптов, либо я сам не не проверил то, что написал.<br/>
    Ну и самое главное, сильно в исходниках не копайтесь, т.к. там можно обнаружить "страшный" код, особенно в коде ПУ,т.к. CMS пишется just for fun, да и времени особо прибераться нету, зато есть комментарии к коду(иногда, даже, не мало).
    <form method="POST">
        <input type="hidden" name="poster" value="not_null"/>
     Мне лень было писать обработчик формы, так что вот.  :)
        <textarea style="width: 1000px; height: 350px;" name="config">
    <?php echo "<?php";//А я предупреждал, нече лазить :) ?>
    
    class config{//В ЭТОМ КЛАССЕ лучше НИЧЕГО НЕ ТРОГАТЬ :)
       
        public static $files_root = "<?php echo getcwd()."/"; ?>";//Автоматом определяется
        public static $URL_root = "<?php echo $URI; ?>";//Тоже автомат, но должно кончаться на "/", это "смещение" относительно домена.
        public static $user_mode = 1;//ну можете на 0 поменять, если вам нужно только то, что действительно реализовано посмотреть :)
        public static $language = "ru_RU";//Перевод, но он пока только один, и почти не существует.
       
    }
    
    class db_config{//А вот и настройки, которые нужно менять - БД
       
        public static $host = "localhost";//Адрес сервера БД
        public static $user = "root";//Пользователь на сервере БД
        public static $pass = "root";//Паролька от пользователя
        public static $base = "test";//Название БД
        public static $pref = "ews_";//Префикс таблиц, можно оставить если вам не понятно что это такое
       
    }
    
        </textarea>
     <input type="submit" value="_Установить_"/>
    </form>
    <?php
        exit;
    }
    
    //Скачивание всего-всего с сервака с тестами, сервер обновления пока говорит, что у вас самый свежий билд, т.к. я не автоматизировал определение даты последнего апдейта
    updater::downloadByTreeUrl("http://msc-testing.zz.mu/dev/updates/0/tree.php?s=1&m=1", "http://msc-testing.zz.mu/dev/updates/0/get.php?s=1&f=system/", null, "./system_files/");//Системные файлы
    //Перезапись конфига и "патчинг" loader`а
    file_put_contents("system_files/config.php", filter_input(INPUT_POST, 'config'));//Конфиг
    include "system_files/config.php";//Нам конфиг очень нужен здесь для костыля :)
    define("SYSTEM_FILES", config::$files_root."system_files/");//сам костыль
    
    $dir = opendir(SYSTEM_FILES."loader");//Собсно патчим лоадеры
            while (false !== ($entry = readdir($dir))) {
                if($entry != ".." && $entry != "." && is_file(SYSTEM_FILES."loader/".$entry)){
                    file_put_contents("system_files/loader/".$entry, str_replace("/home/u209268861/public_html/dev/system_files/",SYSTEM_FILES,file_get_contents("system_files/loader/".$entry)));//Для этого нужен костыль, ну и не только для этого, там ещё в "апдейтере" используется
                }
            }
    //Продолжаем качать, теперь админку ставим
    //Лучше код админки не смотреть - там Франкинштейны одни :) (т.к. compilation_mode = "admin", там "патчер" делает свое грязное дело :))
    updater::downloadByTreeUrl("http://msc-testing.zz.mu/dev/updates/0/tree.php?s=1&m=0", "http://msc-testing.zz.mu/dev/updates/0/get.php?s=1&f=admin/", "admin", "./admin/");//Админка
    file_put_contents("index.php", "<?php include 'system_files/loader/site_top.php'; ?> CMS поставилась, не изветсно как, но поставилась...<br/>(Должно нормально работать) <?php include 'system_files/bottom.php'; ?>");
    //unset(basename(__FILE__));//Самоубийство установщика.
    header("Location: ".config::$URL_root);//Тут тоже костыль частично используется, конец установки...
    class updater{
       
        private static $upd_srv = "http://msc-testing.zz.mu/dev/";
       
       
        public static function checkUpdates($id,$date_code,$url = null){
            //-main чекается только по хешам, никаких версий
            if($id != "main"){
                //Найти расположение каталога обновлений скрипта если не определено
                if($url == null){$url = self::getData(self::$upd_srv."updates/find_id.php?id=".$id);}
                //-запросить с сервера обновлений дата-код последнего обновления скрипта
                $date = self::getData($url."date.php");
                //-сравнить с местным дата-кодом обновлений и вернуть резальтат поиска обновлений
                return ($date > $date_code);
            }
               
        }
       
        public static function updateByTreeUrl($tree_URL,$get_URL,$hash_URL,$compilation_mode ,$in_dir){
            $tree = unserialize(self::getData($tree_URL));//Получаем структуру расположения файлов
            foreach($tree as $file){//Перебор массива с файлами
                if($file[1] && (!is_file($in_dir.$file[0] || !self::checkFileHash(file_get_contents($in_dir.$file[0]), $hash_URL.$file[0])))){//Если файла нет или хеши разные
                    $file_self = self::getData($get_URL.$file[0]);//Качаем файл
                    $compiled = self::pathFile($file_self, $compilation_mode);//"Компилируем" полученный файл
                    self::checkDir($in_dir.$file[0]);//Чекаем расположение файла
                    file_put_contents($in_dir.$file[0], $compiled);//Пишем готовый файл куда запрошено
                }elseif(!$file[1] && !is_dir($in_dir.$file[0])){ mkdir($in_dir.$file[0]); }//Если папка            
            }
        }
       
        public static function downloadByTreeUrl($tree_URL,$get_URL,$compilation_mode ,$in_dir){
            $tree = unserialize(self::getData($tree_URL));//Получаем структуру расположения файлов
            foreach($tree as $file){//Перебор массива с файлами
                $file_self = self::getData($get_URL.$file[0]);//Качаем файл
                $compiled = self::pathFile($file_self, $compilation_mode);//"Компилируем" полученный файл
                self::checkDir($in_dir.$file[0]);//Чекаем расположение файла
                if($file[1]){
                    file_put_contents($in_dir.$file[0], $compiled);//Пишем готовый файл куда запрошено
                }elseif(!is_dir($in_dir.$file[0])){ mkdir($in_dir.$file[0]); }                
            }
        }
       
        public static function pathFile($file,$mode){
            if($mode != null){
                return file_get_contents(SYSTEM_FILES."loader/".$mode."_top.php")
                        .$file
                        .file_get_contents(SYSTEM_FILES."loader/".$mode."_bottom.php");
            }else{ return $file; }
        }
       
        public static function checkFileHash($file,$hash){
            $dir = opendir(SYSTEM_FILES."loader");
            while (false !== ($entry = readdir($dir))) {
                if($entry != ".." && $entry != "." && is_file(SYSTEM_FILES."loader/".$entry)){
                    $file = str_replace(file_get_contents(SYSTEM_FILES."loader/".$entry), "", $file);
                }
            }
            return (md5($file) == $hash);
        }
       
        private static function checkDir($dir){
            $tmp = explode("/", $dir);$f = "";
            for($i = 0; $i < (count($tmp) - 1); $i++){
                $f .= $tmp[$i]."/";
                if(!is_dir($f)){ mkdir($f); }
            }
        }
       
        public static function getData($URL){
            $handle = fopen($URL, "rb");
            $contents = stream_get_contents($handle);
            fclose($handle);
            return $contents;
        }
    }
     
  2. KriBetko

    KriBetko Старожил Пользователь

    Баллы:
    153
    Skype:
    kribetko
    Переплюнешь WebMCR?
     
    GrimJoy нравится это.
  3. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Да кто его знает :)
    Если не заброшу, то может и переплюну, но с этими экзаменами все к тому и идет, по этому открыл репозиторий на github, может кто-то захочет помочь.
    А так, пока думаю продолжать, но не в сторону какой-то специализации движка, а в сторону максимального упрощения использования и понимания, а так же оптимизации кода.
     

Поделиться этой страницей