Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление
  2. Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Веб CMS Piccolo

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем danilko, 9 май 2015.

  1. Автор темы
    danilko

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

    Баллы:
    103
    logo.png
    Представляю вашему вниманию набор "сделай сам", состоящий из пакетов CMS Piccolo.
    На оф. сайте есть установщик, который поможет вам собрать сайт в автоматическом режиме: вам понадобится только выбрать что установить.
    Все официальные пакеты можно найти в специальном репозитории на GitHub.



    разделитель.png
    Полезные ссылки:
    Сайт | Группа vk | GitHub repo
    Адаптация шаблона под CMS Piccolo и создание простейшего сайта
    Мониторинг серверов minecraft

    P.s. большинство пакетов от CMS WebSiteEngine могут быть легко портированы под Piccolo.
     
    Последнее редактирование: 1 ноя 2015
  2. Хостинг MineCraft
    <
  3. Автор темы
    danilko

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

    Баллы:
    103
    Список обновлений:

    10.05.2015: Обновлен пакет core
    Третий билд
    Добавлена эмуляция CMS MSC: WebSiteEngine (WSE) для лучшей
    совместимости.
    Изменена система загрузки скриптов. Если скрипту нужна эмуляция WSE и
    она отключена, то скрипт не будет загружен; Список параметров загрузки
    скриптов перенесён в конфиг ядра.

    10.05.2015: Портирован пакет content

    Портирован пакет content c MSC: WebSite Engine
    Из*****ия минимальны - регистрация скрипта проводится не в scripts.ini,
    а в /piccolo/config/piccolo_core.json
    15.05.2015: Обновлен пакет core
    Версия 4
    Улучшена защита системы. Теперь в шаблонах и ajax-запросах можно
    использовать только разрешенные методы класса. (Настраивается в конфиге
    ядра)
    15.05.2015: Опубликован пакет page_data
    Первая версия пакета page_data
    Представляет собой более продвинутый аналог пакета WSE_content.
    Написан полностью с нуля.
    Отличия: загрузка конфига через ядро; динамические страницы определяются
    в конфиге (работает быстрее, чем регистрация на лету);использует шаблон
    страницы 404;есть возможность отключить автоматическую обработку
    тега;возможность получить данные без регистрации обработчика и
    автозагрузки (опять же возможность оптимизации скорости инициализации
    ядра)
    24.05.2015: Опубликован пакет piccolo_blog
    Первая версия пакета piccolo_blog
    Возможности самые минимальные - вывод последних новостей и ограничение
    по количеству на странице.
    Дальнейшие изменения можете посмотреть сами на gitHub (ссылка в первом сообщении), у меня начал провисать редактор, видимо, из-за объёма сообщения.
     
    Последнее редактирование: 31 май 2015
  4. blogger2

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

    Баллы:
    123
    Skype:
    ilja0176
    Имя в Minecraft:
    XuPoH
    Не получится без шаблонов проектирования сделать гибкую систему, когда же вы, "мигакодиры", это поймёте?
     
  5. Автор темы
    danilko

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

    Баллы:
    103
    Пока получается. Уже что только на основе этого ядра не делал на заказ и для себя, вот пытаюсь теперь для паблика сделать.[DOUBLEPOST=1431695414,1431355128][/DOUBLEPOST]UP. Опубликовал замену WSE_content, обновил ядро. Скоро до админки доберусь, а там и установщик не за горами.[DOUBLEPOST=1431765228][/DOUBLEPOST]Сделал скрипт автоматической установки пакета. Сегодня собираюсь приделать его на все доступные пакеты. Вся установка будет заключаться в закидывании файлов на сайт и переходе на специальный install.php
    Есть поддержка скриптов, вызываемых до и после установки пакета. Полная поддержка ядра Piccolo. Поддерживаются все основные типы файлов: шаблон, локаль, скрипт, конфиг.
    Чуть позже выложу сам скрипт и инструкцию по созданию "самоустанавливающегося" пакета.
    Маленькими шажками приближаюсь к релизу блогового движка. (Не хватает только админки, по этому сначала сделаю пакет piccolo_admin, а уже после доделаю piccolo_blog)

    Так же приблизился к переделке установщика CMS. Так что, возможно, к концу следующей недели уже будет демка движка и полноценный инсталлер с собственным репозиторием.

    Ничего за неделю не сделал...
    Тему открою, как будет функционал. Или не открою, если так и ничего не сделаю.[DOUBLEPOST=1432307611][/DOUBLEPOST]UPD: добавлен пакет piccolo_PDO, а так же @Vladlen_198 взялся за разработку скрипта для показа новостей. Шапку пока не обновляю.[DOUBLEPOST=1432474117][/DOUBLEPOST]Удобство разработки++
    Количество багов при установке--
    Сделал скрипт для удобной разработки пакетов. Его задача - автоматически переустанавливать CMS для тестов. (Как руки дойдут, напишу в чем суть)[DOUBLEPOST=1432478868][/DOUBLEPOST]Опубликовал пока основную часть блогового движка. Эта часть была написана давным давно, а вот административная ещё в процессе написания. Установка и ссылки в шапке. Кстати, данный пакет первым стал "самоустанавливаемым", т.е. для его установки не нужно самостоятельно редактировать какие-либо файлы.[DOUBLEPOST=1432667284][/DOUBLEPOST]Завтра будет много примитивных самоустанавливаемых пакетов и скрипт автоматизации для разработчиков.
    Пока-что планирую следующие: users_base, piccolo_permissions, piccolo_admin, min_auth. Два из них уже используются "на продакшене", так что это будет публикация ранее закрытого кода. Возможно, список изменится. Сразу предупреждаю, что возможности всех этих пакетов будут довольно скудными. (users_base - простой менеджер БД с учетками юзеров; piccolo_permissions - очень примитивный модуль распределения прав; piccolo_admin - очередная админка; min_auth - ) Все эти пакеты будут подходить под скрипт автоматизации, который я сейчас активно обкатываю. (перевожу на него все свои наработки и распространяю в качестве инсталлера обновлений\установщика пакетов; все-таки приватные разработки пока в приоритете)

    Суть скрипта автоматизации в том, что он на лету пересобирает весь сайт в зависимости от настроек, при этом пользовательские данные не теряются. Т.е. как бы два зайца сразу убивается: вам не нужно будет каждый раз самостоятельно собирать пакет с нуля, и за одно вы тестируете как он будет устанавливаться на сайт пользователя. (ну и свою наработку сразу же + можно его пока вместо инсталлера\обновлялки использовать) Более подробно распишу его завтра. (Кстати, возможно, на базе этого скрипта я сделаю ещё возможность установки пакетов и всей CMS из локального хранилища)[DOUBLEPOST=1432732497][/DOUBLEPOST]В общем в архиве сборка (или дистрибутив - как хотите называйте).
    В комплект входит скрипт автоматизации (index.php) и пакеты: admin_example, def_tmpl_blog,min_auth,page_data,piccolo_admin,piccolo_blog (не устанавливается по умолчанию), piccolo_permissions, users_base.

    Установка: закинуть на сайт, открыть сайт, а далее скрипт автоматизации все сделает сам.
    После установки, чтоб ускорить сайт и снизить нагрузку, нужно в файле packages/install.json стереть все и вписать []. (Или для продвинутых можно снести всю папку packages и в index.php отключить автопересборку, либо вообще заменить index.php на тот, что в репозитории лежит)

    На хостингере ЧПУ не работает.
    Админка будет по адресу site.ru/admin на сайтах с mod_rewrite и site.ru/index.php/admin на сайтах без него (в т.ч. хостингер)
    Учетка админа по умолчанию admin:admin, но нужно выставить права на посещение админки (там ничего, кроме примера скрипта с админкой нет)

    Как выставить права на просмотр админки: в файле /piccolo/config/users_base.json нужно сделать его примерно таким:
    Код:
    [{"login":"admin","password":"admin","permissions":{"admin.see":"1"}}]
    Новые пакеты пока не загружал в репозиторий. Самые обкатанные и проверенные скрипты - users_base и min_auth, так как используются на нескольких сайтах "в продакшене". Остальные ещё нуждаются в тестировании.

    Немного про скрипт автоматизации расскажу. Что-то вроде конфига он держит в нутри себя, список пакетов берёт из packages/install.json. Установка производится в том порядке, в каком находятся пакеты в install.json. Информацию о том, куда какой файл и как записать он берёт из package.json (внутри каждого пакета в сборке имеется). Имеется три режима записи файлов: replace, merge и new. new - копировать файл, если в месте назначения нет ничего. replace - перезаписать файл в любом случае. (Если включен бекап, то ещё делает бекап заменяемого файла) merge - распространяется только на конфиги и проводит слияние двух файлов. (те если в каком-нибудь json уже что-то было записано и его надо заменить, то данные из обоих файлов будут соеденены).

    Админку блога пока не приложил, ибо ещё не готова. Начал делать install.php для CMS.[DOUBLEPOST=1432738762][/DOUBLEPOST]Забыл приложить .htaccess (его нужно закинуть в корень сайта для работы ЧПУ, возможно по этому у меня при проверке не работал ЧПУ на хостингере)
    AddDefaultCharset UTF-8
    SetEnv TZ Europe/Moscow
    php_value display_errors 1
    php_value display_startup_errors 1
    php_value error_reporting E_ALL
    <IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php/$1 [L,QSA]

    </IfModule>
    [DOUBLEPOST=1432755677][/DOUBLEPOST]А тем временем на piccolo.tk заработали ссылки на новости...
    (Завтра ещё будут комментарии рабочие)[DOUBLEPOST=1432814010][/DOUBLEPOST]А тем временем появилась форма для комментирования на страницах новостей. Чуть позже выложу сам модуль, но сейчас расскажу о нем.
    Пакет piccolo_comments позволяет вставлять формы для комментирования на любую страницу, есть возможность вставки сразу нескольких форм на одну страницу и так же можно использовать разные стили для форм, в том числе несколько форм с разным оформлением на одной странице. Есть возможность отобразить одну и ту же форму, с одними и теми же комментариями на разных страницах. Форма очень легко встраивается как в динамическе, так и статические страницы. Сейчас это всё, но чуть позже будет ещё возможность выставлять права для комментирования на конкретных пользователей, удаление комментариев, а так же отключение анонимного комментирования.
     

    Вложения:

    • install.zip
      Размер файла:
      236,8 КБ
      Просмотров:
      3
    Последнее редактирование: 21 май 2015
  6. pyshcoder

    pyshcoder Активный участник

    Баллы:
    61
    Имя в Minecraft:
    GoshaMosunov
    Что, серьезно, логины и пароли в конфиге? Далеко пойдешь.
     
  7. Автор темы
    danilko

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

    Баллы:
    103
    Я его как бд использую, а что что-то не нравится ? Если хочешь - можешь свою авторизацию запилить. Либа для PDO уже есть.
     
  8. fastin

    fastin Активный участник Пользователь

    Баллы:
    78
    Skype:
    the.infastin
    Защита от CSRF-атак присутствует?
     
  9. Автор темы
    danilko

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

    Баллы:
    103
    Пока нет, да и страниц для защиты от такого рода запросов пока тоже нету.[DOUBLEPOST=1432875796,1432871740][/DOUBLEPOST]Небольшое обновление системы комментирования: если имя не указано, то отображается "гость" (можно изменить в локализации); корректно отображаются ссылки в комментариях (можно отключить в конфиге).
    Саму систему с русской локализацией прикладываю ниже. (ещё не готова, но потестить можно)
    Установка: поставить скрипт автоматизации, если ещё нет->закинуть папку packages в корень сайта->вставить тег комментариев в шаблон.
    Шаблон новости с piccolo.tk (piccolo/template/scripts/piccolo_blog/post_page.html):
    <h1>[title]</h1>

    <p class="lead">
    Автор: <a href="#">[author]</a>
    </p>

    <hr>

    [content]
    <hr>

    <content type="comments" pageID="news_[id]"/>
     

    Вложения:

    Последнее редактирование: 29 май 2015
  10. Автор темы
    danilko

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

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

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

    Баллы:
    103
    Скрипт автоматизации: фикс с установкой локализаций
    (index.php)
    <?php

    define('INSTALLER_WORKS', microtime(true));

    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    //Скрипт для разработчиков пакетов под CMS Piccolo
    //В него встроен простейший установщик пакетов и функции для сборки
    //Использование: есть два режима - постоянная пересборка и пересборка по запросу
    //в первом режиме cms постоянно пересобирается, во втором пересборка производится при get-параметре rebuild=1
    //В файле install.json указывайте пакеты в том порядке, в каком они должны быть установлены, так же не забывайте про зависимости
    //Требования: наличие в папке файла ядра piccolo.php

    define('AUTOREBUILD',true);//режим пересборки: true - пересобирать при каждом запросе, false - пересобирать только по спец. запросу (GET: rebuild=1)

    if(is_file('piccolo.php')){//Подключаем ядро
    include 'piccolo.php';
    }else{
    die('Не найден файл ядра');
    }

    $c = null;//Счетчик установленных пакетов
    if(AUTOREBUILD || filter_input(INPUT_GET, 'rebuild') == '1'){//Пересборка, если надо
    $c = 0;
    if(!is_file('packages'.DIRECTORY_SEPARATOR.'install.json')){die('Не найден файл install.json');}
    $i = json_decode(file_get_contents('packages'.DIRECTORY_SEPARATOR.'install.json'),true);
    $log = '';
    foreach($i as $pack){
    $log .= '\r\nУстановка пакета "'.$pack['path'].'"\r\n';
    $installer = new piccolo_package_installer(
    PICCOLO_CONFIGS_DIR,
    PICCOLO_TEMPLATES_DIR,
    PICCOLO_SCRIPTS_DIR,
    PICCOLO_TRANSLATIONS_DIR,
    'packages'.DIRECTORY_SEPARATOR.$pack['path'],
    $pack['info']
    );
    $installer->fullInstall();
    $log .= $installer->getLog();
    $c++;
    }
    }

    if(filter_input(INPUT_GET,'log') !== null){
    echo str_replace('\r\n','<br/>',str_replace('[info]','<font color="green">[info]</font>',str_replace('[error]','<font color="red">[error]</font>',$log)));
    }
    echo '<!-- Piccolo developer mainframe works: '.(round((microtime(true) - INSTALLER_WORKS) * 1000)) . 'ms; installed packages count: '.($c == null ? 'no packages' : $c).' -->';
    PICCOLO_ENGINE::start();//Запускаем ядро

    /*
    * Класс проводит "тупую" установку пакета.
    * Он не проверяет зависимости, совместимость и наличие уже установленной версии.
    * Идет простое копирование файлов в нужные папки и их модификация при необходимости
    */
    class piccolo_package_installer {

    /*
    * Конструктор класса.
    * Принимает параметры: папка с конфигами, папка с шаблонами, папка со скриптами, папка с локализациями, папка с пакетом, название файла с описанием репозитория
    */
    public function __construct($configs_dir,$templates_dir,$scripts_dir,$locales_dir,$package_dir,$info_name,$backup = false){
    $this->cfg = rtrim($configs_dir,DIRECTORY_SEPARATOR);
    $this->tmpl = rtrim($templates_dir,DIRECTORY_SEPARATOR);
    $this->scr = rtrim($scripts_dir,DIRECTORY_SEPARATOR);
    $this->lc = rtrim($locales_dir,DIRECTORY_SEPARATOR);
    $this->pckg = rtrim($package_dir,DIRECTORY_SEPARATOR);
    $this->backup = $backup;
    $this->info = json_decode(file_get_contents($this->pckg.DIRECTORY_SEPARATOR.$info_name),true);
    }

    //Параметры конструктора
    private $cfg,$tmpl,$scr,$lc,$pckg,$info,$backup;
    private $log = '';//Переменная для хранения лога установки

    /*
    * Проводит полную установку пакета
    */
    public function fullInstall(){
    $this->log('[info]Full install called');
    if(isset($this->info['before_install']) && is_file($this->pckg.DIRECTORY_SEPARATOR.$this->info['before_install'])){
    $this->log('[info]"before_install" found, calling...');
    include($this->pckg.DIRECTORY_SEPARATOR.$this->info['before_install']);
    $this->log('[info]"before_install" done!');
    }
    $this->log('[info]Calling configs installation...');
    $this->installConfigs();
    $this->log('[info]Configs installation call done!');
    $this->log('[info]Calling locales installation...');
    $this->installLocales();
    $this->log('[info]Locales installation call done!');
    $this->log('[info]Calling templates installation...');
    $this->installTemplates();
    $this->log('[info]Templates installation call done!');
    $this->log('[info]Calling scripts installation...');
    $this->installScripts();
    $this->log('[info]Scripts installation call done!');
    if(isset($this->info['after_install']) && is_file($this->pckg.DIRECTORY_SEPARATOR.$this->info['after_install'])){
    $this->log('[info]"after_install" found, calling...');
    include($this->pckg.DIRECTORY_SEPARATOR.$this->info['after_install']);
    $this->log('[info]"after_install" done!');
    }
    $this->log('[info]Full installation done!');
    }

    /*
    * Рекурсивно объеденяет два массива с сохранением исходных данных в первом массиве
    */
    public function merge_array($arr1,$arr2){
    foreach($arr2 as $key => $value){
    if(!isset($arr1[$key])){
    $arr1[$key] = $value;
    }elseif(is_array($arr1[$key]) && is_array($value)){
    $arr1[$key] = $this->merge_array($arr1[$key], $value);
    }else{
    $arr1[$key] = $value;
    }
    }
    return $arr1;
    }

    /*
    * Обновляет конфиги
    */
    public function installConfigs(){
    $this->log('[info]"installConfigs" called');
    if(!isset($this->info['configs']) || !is_array($this->info['configs'])){$this->log('[info]No configs found for installation.');return;}
    foreach($this->info['configs'] as $file){
    $this->log('Updating config: "'.$file['file_in'].'" => "'.$file['file_out'].'"');
    if(!is_file($this->pckg.DIRECTORY_SEPARATOR.$file['file_in'])){$this->log('[error]No file "'.DIRECTORY_SEPARATOR.$file['file_in'].'"');continue;}
    $in = json_decode(file_get_contents($this->pckg.DIRECTORY_SEPARATOR.$file['file_in']),true);
    $out = is_file($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'])
    ? json_decode(file_get_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out']),true)
    : array();

    $dir = dirname($this->cfg.DIRECTORY_SEPARATOR.$file['file_out']);
    if(!is_dir($dir)){mkdir($dir,0777,true);}
    if(!isset($file['mode'])){file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'], json_encode($this->merge_array($out, $in)));}
    elseif($file['mode'] == 'new' && !is_file($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'])){file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'], json_encode($in));}
    elseif($file['mode'] == 'merge'){file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'], json_encode($this->merge_array($out, $in)));}
    elseif($file['mode'] == 'replace' && is_file($this->cfg.DIRECTORY_SEPARATOR.$file['file_out']) && $this->backup){
    $this->log('[info]Backuping config "'.$this->cfg.DIRECTORY_SEPARATOR.$file['file_out'].'"');
    $out = file_get_contents(file_get_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out']));
    file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'].'_'.date('d-m-Y_G_i_s').'_bak', $out);
    file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'], json_encode($in));
    }elseif($file['mode'] == 'replace'){
    file_put_contents($this->cfg.DIRECTORY_SEPARATOR.$file['file_out'], json_encode($in));
    }
    }
    }

    /*
    * Обновляет локализации
    */
    public function installLocales(){
    $this->log('[info]"installLocales" called');
    if(!isset($this->info['locales']) || !is_array($this->info['locales'])){$this->log('[info]No locales found for installation.');return;}
    foreach($this->info['locales'] as $file){
    $this->log('[info]Installing locale file: "'.$file['file_in'].'" => "'.$file['file_out'].'"');
    if(!is_file($this->pckg.DIRECTORY_SEPARATOR.$file['file_in'])){$this->log('[error]No file "'.DIRECTORY_SEPARATOR.$file['file_in'].'"');continue;}
    $in = parse_ini_file($this->pckg.DIRECTORY_SEPARATOR.$file['file_in'],true);
    $out = is_file($this->lc.DIRECTORY_SEPARATOR.$file['file_out'])
    ? parse_ini_file($this->lc.DIRECTORY_SEPARATOR.$file['file_out'],true)
    : array();

    $dir = dirname($this->lc.DIRECTORY_SEPARATOR.$file['file_out']);
    if(!is_dir($dir)){mkdir($dir,0777,true);}
    file_put_contents($this->lc.DIRECTORY_SEPARATOR.$file['file_out'], $this->arrToINI($this->merge_array($out, $in)));
    }
    }

    /*
    * Обновляет файлы скриптов
    */
    public function installScripts(){
    $this->log('[info]"installScripts" called');
    if(!isset($this->info['scripts']) || !is_array($this->info['scripts'])){$this->log('[info]No scripts found for installation.');return;}
    foreach($this->info['scripts'] as $file){
    $this->log('[info]Installing script file: "'.$file['file_in'].'" => "'.$file['file_out'].'"');
    if(!is_file($this->pckg.DIRECTORY_SEPARATOR.$file['file_in'])){$this->log('[error]No file "'.DIRECTORY_SEPARATOR.$file['file_in'].'"');continue;}
    $in = file_get_contents($this->pckg.DIRECTORY_SEPARATOR.$file['file_in']);

    $dir = dirname($this->scr.DIRECTORY_SEPARATOR.$file['file_out']);
    if(!is_dir(dirname($this->scr.DIRECTORY_SEPARATOR.$file['file_out']))){mkdir($dir,0777,true);}

    file_put_contents($this->scr.DIRECTORY_SEPARATOR.$file['file_out'], $in);
    }
    }

    /*
    * Обновляет файлы шаблонов, с бекапами
    */
    public function installTemplates(){
    $this->log('[info]"installTemplates" called');
    if(!isset($this->info['templates']) || !is_array($this->info['templates'])){$this->log('[info]No templates found for installation.');return;}
    foreach($this->info['templates'] as $file){
    $this->log('[info]Installing template file: "'.$file['file_in'].'" => "'.$file['file_out'].'"');
    if(!is_file($this->pckg.DIRECTORY_SEPARATOR.$file['file_in'])){$this->log('[error]No file "'.DIRECTORY_SEPARATOR.$file['file_in'].'"');continue;}

    $in = file_get_contents($this->pckg.DIRECTORY_SEPARATOR.$file['file_in']);

    $dir = dirname($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out']);
    if(!is_dir($dir)){mkdir($dir,0777,true);}

    if(!isset($file['mode']) && !is_file($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'])){file_put_contents($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'], $in);}
    elseif(isset($file['mode']) && $file['mode'] == 'new' && !is_file($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'])){file_put_contents($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'], $in);}
    elseif(isset($file['mode']) && $file['mode'] == 'replace' && is_file($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out']) && $this->backup){
    $this->log('[info]Backuping template "'.$this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'].'"');
    $out = file_get_contents(file_get_contents($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out']));
    file_put_contents($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'].'_'.date('d-m-Y_G_i_s').'_bak', $out);
    }elseif(isset($file['mode']) && $file['mode'] == 'replace'){
    file_put_contents($this->tmpl.DIRECTORY_SEPARATOR.$file['file_out'], $in);
    }
    }
    }

    /*
    * Преобразует массив в строку в формате ini
    */
    public function arrToINI($arr){
    $ini = "";
    foreach($arr as $section => $ar){
    $ini .= '['.$section.']'."\r\n";
    foreach($ar as $key=>$val){
    $ini .= $key.'=\''.addslashes($val).'\''."\r\n";
    }
    }
    return $ini;
    }

    private function log($message){
    $this->log .= $message.'\r\n';
    }

    public function getLog(){
    return $this->log;
    }

    }
    [DOUBLEPOST=1432903100,1432881377][/DOUBLEPOST]Вот и к installer.php подобрался.
    https://www.dropbox.com/s/3q7uvtfqrdws7cr/installer.php?dl=1
    Есть ещё некоторые недоработки, но мне пока некогда их править.[DOUBLEPOST=1433078160][/DOUBLEPOST]Доработанная версия прикреплена к сообщению.(файл upload.zip;ставит всё, кроме ядра; все нужные файлы уже есть в архиве)
    Есть некоторые проблемы с синхронизацией (AJAX), но если не спешить тыкать на все кнопочки, то работает отлично.
    Как установить CMS: закидываем на хостинг содержимое архива => открываем сайт => следуем инструкциям на странице.

    Для нормального отображения страниц нужен шаблон, по этому ставить пакет def_tmpl_blog обязательно, а всё остальное по вкусу. (Зависимости при установке автоматически доустанавливаются, так что вам не нужно думать об этом)
    Если что-то пойдёт не так и вам нужно будет перезапустить установку, то просто перезапустите браузер. (либо к адресу прибавить "?ajax=reset" без кавычек) И ещё возможны проблемы на хостингере, так как он, похоже, игнорирует снятие ограничения по времени работы скрипта. Но мне все-таки удалось установить систему с блогом, комментариями, шаблоном и админкой. (Правда, не с первого раза - установка останавливалась на скачивании шаблона) По этому рекомендую держать сайт на нормальном платном хостинге.

    Помимо этого обновлён пакет административной панели, теперь при первом её посещении задаётся логин супер-администратора, который может открывать админку без прав на это.
    По умолчанию зарегистрирован всего один пользователь с логином admin и паролем admin. (думаю, лучше эту страницу переделать в регистрацию первого администратора)

    Автоматизация доведена почти до максимума, так что пользователь скоро действительно сможет собирать сайт как из конструктора, расставляя галочки и настраивая компоненты.

    Нормальных скриптов для админки пока всё ещё нет.[DOUBLEPOST=1433136017][/DOUBLEPOST]Написал простенький скрипт "хлебных крошек" через пару часов залью в репозиторий для установщика и на github уже всё есть в репозитории для установки\обновления. (Демо есть на piccolo.tk)
    Кроме этого обновил пакет админки - теперь при первом её запуске идёт регистрация главного администратора. Ещё обновил пакет piccolo_blog - теперь он поддерживает breadcrumbs. (Его обновления так же есть на github). Сейчас собираюсь наконец-таки доделать редактор страниц и админку для блога.[DOUBLEPOST=1433155720][/DOUBLEPOST]А тем временем появился новый пакет piccolo_registration и обновился piccolo_blog. Первый пакет - регистрация на сайт. Обновление же блога - добавилось отображение количества просмотров на новости. (Считается каждый переход по ссылке на новость)[DOUBLEPOST=1433496416][/DOUBLEPOST]UP! На сайте появились новые обновления и раздел "установить", в котором кратко описывается автоматическая установка.[DOUBLEPOST=1433496805][/DOUBLEPOST]
    Piccolo - маленький, небольшой (перевод с итальянского). А вообще, да, есть флейта пикколо, которая так называется из-за своего небольшого размера.[DOUBLEPOST=1433501430][/DOUBLEPOST]Исправлен пакет piccolo_comments, спасибо неизвестному человеку. Теперь нельзя отправлять пустые сообщения. (Без текста или состоящие из одних пробелов)
     

    Вложения:

    • upload.zip
      Размер файла:
      20,9 КБ
      Просмотров:
      3
    Последнее редактирование: 1 июн 2015
  12. HyperCOGENT

    HyperCOGENT Активный участник Пользователь

    Баллы:
    88
    А у меня есть идея, это реализовать поддержку MySQL и PostgreSQL.
     
  13. Автор темы
    danilko

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

    Баллы:
    103
    Да, как ответили выше, уже есть модуль для работы с PDO, только я его почему-то не выложил. (прикрепил)
    Установка: до выполнения install.php поместить содержимое архива в папку piccolo. (Пока так, к вечеру закину на GitHub и в репозиторий установщика)[DOUBLEPOST=1433738117,1433737493][/DOUBLEPOST]А нет, вообще-то на GitHub он был и есть.[DOUBLEPOST=1434299386][/DOUBLEPOST]UP! Теперь у нас есть редактор статических страниц. Пакет уже в репозитории установщика. (Пакет тестовый, по этому часть не локализирована)[DOUBLEPOST=1434300574][/DOUBLEPOST]Немножко скринов.
    Создание страницы:
    [​IMG]
    Специально для @fastin сделал небольшую защиту от CSRF: даже если администратор залогинен, без ввода пароля страницу нельзя создать, изменить и удалить. Некоторые браузеры автоматически подставляют пароль в поле, тут есть только один выход - не сохранять пароль в браузере. (Хотя, например, в IE этого не наблюдается)
    Сбоку есть набросок скрипта для профилей пользователей, который тоже через какое-то время я так-же выложу. (Его можно будет легко модифицировать под мини-лк с выводом всей информации о пользователе)

    Пока не стал встраивать ни какие визуальные редакторы HTML-кода. Под полем с содержимым есть чекбокс для активации режима динамического контента. В этом режиме все теги <content /> обрабатываются. Если галочки на чекбоксе нет, то эти теги могут попасть в браузер.

    Редактирования страницы выглядит похожим образом. При удалении запрашивается только пароль:
    [​IMG]
    Главная страница редактора:
    [​IMG]
    Сбоку расположены иконки для управления страницами. Если не понятно что они делают - наводим на них курсор и видим tooltip с описанием кнопки. Это зависит от шаблона, но в стандартном блоговом это будет выглядеть так.
     

    Вложения:

    • piccolo_pdo.zip
      Размер файла:
      1,5 КБ
      Просмотров:
      0
  14. fastin

    fastin Активный участник Пользователь

    Баллы:
    78
    Skype:
    the.infastin
    Ну почему не токенами защиту делать?
     
  15. Автор темы
    danilko

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

    Баллы:
    103
    Вся эта защита токенами ломается через скрытый iframe. Хотя я, может быть, не знаю тру-варианта защиты токенами.
     
  16. fastin

    fastin Активный участник Пользователь

    Баллы:
    78
    Skype:
    the.infastin
    Хотябы md5(rand());[DOUBLEPOST=1434387759,1434387666][/DOUBLEPOST]Забиваешь это в сессию. А потом если токен пользователя совпадает с токеном, который в сессии, то пропускать пользователя.
     
  17. Автор темы
    danilko

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

    Баллы:
    103
    Ну дк я про это же и говорю примерно. Хоть в куках храни, хоть с формой передавай этот токен. Берёшь iframe и выцепляешь либо форму с токеном, либо сам токен из кук и делаешь всё что захочется. А пароль он только юзеру и серверу известен. Да и комп не сдаст его так просто. Ну только если админ не дурак и не будет на все сайты один пароль ставить. А что трудного ввести пароль ? Не каждый же день создавать и редактировать страницы.
     
  18. fastin

    fastin Активный участник Пользователь

    Баллы:
    78
    Skype:
    the.infastin
    Можно к примеру чекать ip, сайт там.[DOUBLEPOST=1434449470,1434449430][/DOUBLEPOST]Рандомное число.
     
  19. Автор темы
    danilko

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

    Баллы:
    103
    Ладно, как будет время, попробую написать защиту на токенах, но мне все-равно кажется, что её легко обойти.
     
  20. Автор темы
    danilko

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

    Баллы:
    103
    Ещё с рефом и генерация на каждой странице.
     
  21. Автор темы
    danilko

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

    Баллы:
    103
    А да, про ограничение по времени забыл )[DOUBLEPOST=1434483436,1434461149][/DOUBLEPOST]Сервак упал вместе с сайтом. (Отключение электричества) Подниму только завтра, ибо погода опасная... Лампочка рванула...
     

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