Вход / Регистрация
Вход
Документация Creative-FW
+ Cache
Методы кеширования блоков
Методы кеширования переменных
Установка драйвера
Основы работы с Cache в FW
+ Event
Введение в события
Работа с событиями
Примеры использования событий
+ Mail
Отправка сообщений
+ SESSION
Сессии в MySQL
Сессии в Memcached
Redis
Сессии в Memcache
Вступление в сессии
+ Timer
Работа с таймером
+ Trace
Trace для мониторинга
+ User
Регистрация
Авторизация
+ Ядро
Настройка config/config.php
Настройка SiteMap
Функции
Обычная документация для учеников, ничего необычного :)
Ежедневно идёт разработка специального движка для учеников 2 уровня. В данном случае можно заглянуть в процесс разработки скачав рабочую версию проекта. Всё это будет во втором уровне, и не только это... Скачать v0.8beta.
Чтобы проверить всю её мощь установите php 5.5, лучший способ для этого Open Server (альтернатива Denwer, но более мощная).
Чтобы проверить всю её мощь установите php 5.5, лучший способ для этого Open Server (альтернатива Denwer, но более мощная).
{"15":{"id":"15","category":"Документация Creative-FW","section":"Cache","topic":"Методы кеширования блоков","date":"1970-01-01 00:00:00","date_modify":"2014-08-24 06:01:29","text":"\u003Ch2\u003EВступление\u003C\/h2\u003E\r\nКэширование переменных не всегда удобно, так как мы можем отправить в кэш небольшую часть загружаемой страницы. Альтернативой есть кэширования участка кода, то есть мы указываем промежуток (начало и конец), который кэшируется, что позволяет не трогая работающий ускорить.\r\n\r\n\u003Ch2\u003EПример кода\u003C\/h2\u003E\r\nКэшируем HTML-блок:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-preprocessor\u0022\u003E\u0026lt;?php\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E(Cache::beginCache(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027new_mess\u0027\u003C\/span\u003E)) { \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E?\u0026gt;\u003C\/span\u003E\r\n \u0026lt;div\u0026gt;Закэшированный HTML\u0026lt;\/div\u0026gt;\r\n\u003Cspan class=\u0022hljs-preprocessor\u0022\u003E\u0026lt;?php\u003C\/span\u003E Cache::endCache(); } \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E?\u0026gt;\u003C\/span\u003E\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\nБывает так, что среди страницы есть переменные или блок, которые не надо кешировать (в зависимости от пользователя или ситуации разные), то можно использовать 2 разных кэша (до некэшируемых данных и после), а можно вставить участок, который не будет кэшироваться:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-preprocessor\u0022\u003E\u0026lt;?php\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E(Cache::beginCache(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027new_mess\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027safe\u0027\u003C\/span\u003E=\u0026gt;\u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027compress\u0027\u003C\/span\u003E=\u0026gt;\u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E))) { \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E?\u0026gt;\u003C\/span\u003E\r\n \u0026lt;div\u0026gt;Закэшированный HTML\u0026lt;\/div\u0026gt;\r\n Здравствуйте, \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E\u0026lt;?php\u003C\/span\u003E Cache::noCache(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0026lt;?php echo $_SESSION[\u0022user\u0022][\u0022login\u0022]; ?\u0026gt;\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E?\u0026gt;\u003C\/span\u003E\r\n \u0026lt;div\u0026gt;Закэшированный HTML\u0026lt;\/div\u0026gt;\r\n\u003Cspan class=\u0022hljs-preprocessor\u0022\u003E\u0026lt;?php\u003C\/span\u003E Cache::endCache(); } \u003Cspan class=\u0022hljs-preprocessor\u0022\u003E?\u0026gt;\u003C\/span\u003E\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\nКак вы видите, в noCache помещается чистый PHP код, это может быть вызов функции, метода класса, вывод переменных, а так же несколько операций одновременно. Важным моментом будет то, что участок кода в случае использования некэшируемых блоков (с выключенным \u0027fast\u0027 режимом) будет обработан при помощи eval, так что тщательно следите за подобным кодом и используйте параметр \u0027safe\u0027.\u003Cbr\u003E\r\nСтоит заметить, что код внутри кэшируемого блока (за пределами noCache) не будет исполняться в случае кэширования. Отсюда необходимо внимательно отнестись к возможности noCache, так как этих данных может и не существовать. Ошибкой будет:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E(Cache::beginCache(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027new_mess\u0027\u003C\/span\u003E)) {\r\n \u003Cspan class=\u0022hljs-variable\u0022\u003E$var\u003C\/span\u003E = \u003Cspan class=\u0022hljs-number\u0022\u003E10\u003C\/span\u003E;\r\n Cache::noCache(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0026lt;?php echo $var; ?\u0026gt;\u0027\u003C\/span\u003E);\r\nCache::endCache(); }\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\u003Ch2\u003EМетод:\u003C\/h2\u003E\r\n\u003Ch3\u003Estatic beginCache(string $key [,(array) $options])\u003C\/h3\u003E\r\nКэш блоков работает по аналогии с кэшированием переменных, то есть исполняющий класс для действий \u0022поместить в кэш\u0022 и \u0022достать из кэша\u0022 общий. Таким образом метод connect позволит выбрать драйвер хранения кэша для блоков.\u003Cbr\u003E\r\n$key - уникальное имя кэша для каждого блока. Автоматически будет приписан префикс \u0027block_\u0027.\u003Cbr\u003E\r\n$options - набор опций для управления кэшем:\u003Cbr\u003E\r\n\u0027expire\u0027=\u003E(int)36000 - срок жизни кеша в секундах начиная с нынешней даты. Исчисляется по формуле time() + $expire.\u003Cbr\u003E\r\n\u0027fast\u0027=\u003E (boolean)false - Включает быстрый режим работы с кэшем. Отключает eval обработку кэша, делая недоступным метод noCache.\u003Cbr\u003E\r\n\u0027safe\u0027=\u003E (boolean)false - Включает безопасный режим. Весь сформированный кэш будет защищен от инъекций PHP за исключением блока noCache. Обязательное использование в случае, если быстрый режим отключен.\u003Cbr\u003E\r\n\u0027compress\u0027=\u003E (boolean)false - Кэш проходит дополнительную обработку с целью уменьшения веса. Дополнительная нагрузка на период формирования кэша.\u003Cbr\u003E\r\n\r\n\u003Ch3\u003Estatic endCache()\u003C\/h3\u003E\r\nЗавершает кэшируемый блок.\r\n\r\n\u003Ch3\u003Estatic noCache($str)\u003C\/h3\u003E\r\nПринимает строку PHP-кода и упаковывает как исполняемую в закэшированный блок (только эти строки не будут кэшироваться).","num":"0"},"14":{"id":"14","category":"Документация Creative-FW","section":"Cache","topic":"Методы кеширования переменных","date":"1970-01-01 00:00:00","date_modify":"2014-08-24 04:38:22","text":"\u003Ch2\u003Estatic set($key,$value,$expire = 0)\u003C\/h2\u003E\n$key - ключ переменной\u003Cbr\u003E\n$value - значение переменной. Стоит заметить, что можно хранить все типы за исключением resource.\u003Cbr\u003E\n$expire - необязательный параметр. Если его не передать, то будет использоваться значение по умолчанию для данного класса\u003Cbr\u003E\nПример:\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003ECache::set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key1\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027value1\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ аналог $key1 = \u0027value1\u0027;\u003C\/span\u003E\nCache::set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key2\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ups\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027yo\u0027\u003C\/span\u003E),\u003Cspan class=\u0022hljs-number\u0022\u003E10000\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ $key2 = array(\u0027ups\u0027,\u0027yo\u0027) с временем жизни 10000 секунд; \u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\nМетод вернёт true в случае успешного выполнения и false в случае ошибки (так же будет сгенерирована ошибка).\n\n\u003Ch2\u003Estatic get($key)\u003C\/h2\u003E\n$key - ключ переменной для доступа\u003Cbr\u003E\nМетод вернёт значение переменной в случае успеха, или false, если такая переменная отсутствует. Если надо убедиться, что она существует, то используйте следующий код:\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E((\u003Cspan class=\u0022hljs-variable\u0022\u003E$key3\u003C\/span\u003E = Cache::get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key3\u0027\u003C\/span\u003E)) === \u003Cspan class=\u0022hljs-keyword\u0022\u003Efalse\u003C\/span\u003E) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Переменная равна false или отсутствует!\u0027\u003C\/span\u003E;\n} \u003Cspan class=\u0022hljs-keyword\u0022\u003Eelse\u003C\/span\u003E {\n var_dump(\u003Cspan class=\u0022hljs-variable\u0022\u003E$key3\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Выведем переменную\u003C\/span\u003E\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\n\u003Ch2\u003Estatic delete($key)\u003C\/h2\u003E\n$key - удаляет переменную по ключу.\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003ECache::delete(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key3\u0027\u003C\/span\u003E);\u003C\/code\u003E\u003C\/pre\u003E\n\n\u003Ch2\u003Estatic delete_all()\u003C\/h2\u003E\nМетод полностью очищает кэш хранилище (удаляет все переменные).","num":"0"},"13":{"id":"13","category":"Документация Creative-FW","section":"Cache","topic":"Установка драйвера","date":"1970-01-01 00:00:00","date_modify":"2014-08-24 04:38:06","text":"\u003Ch2\u003EВозможности класса Cache\u003C\/h2\u003E\r\nКласс Cache умеет хранить переменные в драйверах: Mysql (`cache_data` table), File (`.\/cache\/file\/` folder), и Memcache.\r\n\r\n\u003Ch2\u003EМетод Cache::connect([(string)$driver][,(array)$options]);\u003C\/h2\u003E\r\nИнициализация класса для нестандартных настроек. В случае использования по умолчанию метод connect можно не вызывать\u003Cbr\u003E\r\n$driver - принимает одно из значений: (default)\u0027Mysql\u0027, \u0027File\u0027, \u0027Memcache\u0027.\u003Cbr\u003E\r\n$options - массив, принимает следующие значения:\u003Cbr\u003E\r\n$options для Mysql:\u003Cbr\u003E\r\n\u0027expire\u0027=\u003E(int)$expire - срок жизни кеша в секундах начиная с нынешней даты. Исчисляется по формуле NOW() + INTERVAL $expire SECOND. По умолчанию: (int)2678400 \/\/(1 год)\u003Cbr\u003E\r\n\u0027delstep\u0027=\u003E(int)$delstep - количество записей удаляемых методов delete_all одним запросом в цикле (для снижения нагрузки). По умолчанию: (int)10000\u003Cbr\u003E\r\n\u0027table\u0027=\u003E(string)$table - Имя таблицы для хранения кэша. По умолчанию: (string)\u0027cache_data\u0027\u003Cbr\u003E\u003Cbr\u003E\r\n\r\n$options для File:\u003Cbr\u003E\r\n\u0027expire\u0027=\u003E(int)$expire - срок жизни кеша в секундах начиная с нынешней даты. Исчисляется по формуле time() + $expire. По умолчанию: (int)2678400 \/\/(1 год)\u003Cbr\u003E\u003Cbr\u003E\r\n\r\n$options для Memcache:\u003Cbr\u003E\r\n\u0027expire\u0027=\u003E(int)$expire - срок жизни кеша в секундах начиная с нынешней даты. Исчисляется по формуле time() + $expire. По умолчанию: (int)0 \/\/(бесконечно. На данный момент Memcache хранит максимально 30 дней)\u003Cbr\u003E\r\n\u0027host\u0027=\u003E(string)$host - хост Memcache сервера. По умолчанию: \u0027localhost\u0027\u003Cbr\u003E\r\n\u0027port\u0027=\u003E(string)$port = (int)$port - порт Memcache сервера. По умолчанию: 11211\u003Cbr\u003E\u003Cbr\u003E\r\n\r\nСтоит отметить следующую особенность, если передать параметр в другом типе, то параметр будет проигнорирован, то есть $expire = \u0027100\u0027; - будет воспринят как тип String и проигнорирован. Значение по умолчанию останется старым.\u003Cbr\u003E\r\n\r\n\u003Ch2\u003EПримеры:\u003C\/h2\u003E\r\nИнициализация по умолчанию. Данные хранятся в Mysql.\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003ECache::connect();\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\nИнициализация в файловой системе, время жизни кэша - 60 секунд:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003ECache::connect(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027File\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027expire\u0027\u003C\/span\u003E=\u0026gt;\u003Cspan class=\u0022hljs-number\u0022\u003E60\u003C\/span\u003E));\r\n\u003C\/code\u003E\u003C\/pre\u003E","num":"0"},"12":{"id":"12","category":"Документация Creative-FW","section":"Cache","topic":"Основы работы с Cache в FW","date":"1970-01-01 00:00:00","date_modify":"2014-08-23 03:33:54","text":"\u003Ch2\u003EОписание\u003C\/h2\u003E\r\nИдея кеша заключается в хранении данных в прямом доступе, которые тяжелы в их создании (обработке). Благодаря использованию кеша сокращается нагрузка на сервер.","num":"0"},"7":{"id":"7","category":"Документация Creative-FW","section":"Event","topic":"Введение в события","date":"1970-01-01 00:00:00","date_modify":"2014-08-18 05:36:18","text":"\u003Ch2\u003EСобытия (Events)\u003C\/h2\u003E\r\nПод событиями подразумевают некий функционал (функции, классы, методы классов), который выполняется в случае достижения заведомо обозначенного события. Функционал событий максимально разграничивают логику между приложением и событием. Таким образом в приложении мы лишь говорим о том, что произошло: Event::trigger(\u0027User_Regist\u0027); - был зарегистрирован пользователь и всё. Сам обработчик существует отдельно, в котором будет заложена вся логика. Мы можем создать уведомление администратора по почте о новом клиенте, занести логи о браузере и т.д., при этом само приложение где было вызвано событие будет отдельно. Более подробно читайте в примерах. События в ПХП частично реализованы в ядре, к примеру в момент ошибки в коде происходит вызов события, который обрабатывает информацию об ошибке. Событие-обработчик логирует обнаруженные ошибки, и в случае критической ошибки завершает приложение, а в случае незначительной - продолжает работу. Заметьте, что когда вы пишите свой код, то приложение не \u0022контактирует\u0022 с событием, то есть между ними отсутствует жесткая зависимость.","num":"0"},"8":{"id":"8","category":"Документация Creative-FW","section":"Event","topic":"Работа с событиями","date":"1970-01-01 00:00:00","date_modify":"2014-08-18 06:03:57","text":"\u003Ch2\u003EВызов событий\u003C\/h2\u003E\r\nВ любом участке кода для вызова события пишем:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003EEvent::trigger(\u003Cspan class=\u0022hljs-variable\u0022\u003E$name\u003C\/span\u003E,\u003Cspan class=\u0022hljs-variable\u0022\u003E$args\u003C\/span\u003E);\u003C\/code\u003E\u003C\/pre\u003E\r\n$name - имя вызываемого события.\u003Cbr\u003E\r\n$args - аргументы, передаваемые в событие.\u003Cbr\u003E\r\nТеперь событие было вызвано и зарегистрированная функция или метод класса его обработают. Если вызвано было не зарезервированное событие и событие не было добавлено, то произойдет ошибка скрипта.\r\n\r\n\u003Ch2\u003EРегистрация событий в готовом классе Event\u003C\/h2\u003E\r\nВ случае, если такое событие уже зарегистрировано, то оно будет перезаписано на новое.\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003EEvent::add(\u003Cspan class=\u0022hljs-variable\u0022\u003E$name\u003C\/span\u003E,\u003Cspan class=\u0022hljs-variable\u0022\u003E$function\u003C\/span\u003E);\u003C\/code\u003E\u003C\/pre\u003E\r\n$name - имя события.\u003Cbr\u003E\r\n$function - имя функции, которая обработает событие. Имя пишется без скобок: например \u0027strlen\u0027.\u003Cbr\u003E\r\nЕсли необходимо вызвать метод класса, то $function запишите в виде массива (класс, метод):\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003EEvent::add(\u003Cspan class=\u0022hljs-variable\u0022\u003E$name\u003C\/span\u003E,\u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\u003Cspan class=\u0022hljs-variable\u0022\u003E$class\u003C\/span\u003E,\u003Cspan class=\u0022hljs-variable\u0022\u003E$method\u003C\/span\u003E));\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\u003Ch2\u003EУдаление событий\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003EEvent::remove(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027SmallEvent\u0027\u003C\/span\u003E);\u003C\/code\u003E\u003C\/pre\u003E\r\nП.С. Я ещё не придумал необходимость удалять события. :)\r\n\r\n\u003Ch2\u003EСвой класс-обработчик событий:\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EMyEvents\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \\\u003Cspan class=\u0022hljs-title\u0022\u003EEvent\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEventsHandler\u003C\/span\u003E \u003C\/span\u003E{\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EShutDownSystem\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027My ShutDownSystem Regist\u0027\u003C\/span\u003E;\r\n }\r\n}\r\nEvent::setEventHandler(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027MyEvents\u0027\u003C\/span\u003E);\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\nКласс обязан унаследовать родителя, так как в нём заложены все системные события Creative-FW.\u003Cbr\u003E\r\nEvent::setEventHandler - регистрирует новый класс вместо старого. Теперь все события будут вызываться в новом классе MyEvents.\u003Cbr\u003E\r\nКак вы видите из примера, мы заменили системное событие `ShutDownSystem` ядра Creative-FW на собственное. Теперь при завершении PHP скрипта будет выводиться надпись \u0022My ShutDownSystem Regist\u0022. Хочу заметить, что класс \\Event\\EventsHandler содержит пустые методы (без обработки), поэтому можно смело переопределять их для своих нужд!\r\n\r\n\u003Ch2\u003EКонфликт класса-событий с единичными событиями\u003C\/h2\u003E\r\nЕсли Вы указали и класс событий, а так же зарегистрировали единичное событие через Event::add, то в приоритете будет единичное событие. Таким образом можно создать общие правила для всего сайта через класс, а внутри исключительных модулей или страниц использовать особое правило поведения.","num":"0"},"9":{"id":"9","category":"Документация Creative-FW","section":"Event","topic":"Примеры использования событий","date":"1970-01-01 00:00:00","date_modify":"2014-08-20 19:35:39","text":"\u003Ch2\u003EПосчитать количество запросов к MySQL:\u003C\/h2\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022 hljs php\u0022\u003E\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EMyEvents\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \\\u003Cspan class=\u0022hljs-title\u0022\u003EEvent\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEventsHandler\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E = \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAfterQuery\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n ++\u003Cspan class=\u0022hljs-keyword\u0022\u003Eself\u003C\/span\u003E::\u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E;\n }\n}\nEvent::setEventHandler(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027MyEvents\u0027\u003C\/span\u003E);\nq(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022SELECT NOW()\u0022\u003C\/span\u003E);\nq(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022SELECT NOW()\u0022\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E MyEvents::\u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Выведет число запросов (в данном случае: 2)\u003C\/span\u003E\u003C\/code\u003E\u003C\/pre\u003E\n\nСоздайте свой обработчик в _allmodules, а дальше в нужном месте в конце скрипта выведите число запросов.\n\n\u003Ch2\u003EИзмеряем время запросов и время загрузки страницы\u003C\/h2\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022 hljs php\u0022\u003E\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EMyEvents\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \\\u003Cspan class=\u0022hljs-title\u0022\u003EEvent\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEventsHandler\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E = \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EBeforeQuery\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n Timer::start(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eself\u003C\/span\u003E::\u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E);\n }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAfterQuery\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n Timer::step(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eself\u003C\/span\u003E::\u003Cspan class=\u0022hljs-variable\u0022\u003E$key\u003C\/span\u003E++);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E(Timer::\u003Cspan class=\u0022hljs-variable\u0022\u003E$last\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027different\u0027\u003C\/span\u003E] \u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E) {\n \u003Cspan class=\u0022hljs-variable\u0022\u003E$debug_backtrace\u003C\/span\u003E = debug_backtrace();\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eforeach\u003C\/span\u003E(\u003Cspan class=\u0022hljs-variable\u0022\u003E$debug_backtrace\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$k\u003C\/span\u003E=\u0026gt;\u003Cspan class=\u0022hljs-variable\u0022\u003E$v\u003C\/span\u003E) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E(\u003Cspan class=\u0022hljs-variable\u0022\u003E$v\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027function\u0027\u003C\/span\u003E] == \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027q\u0027\u003C\/span\u003E) {\n \u003Cspan class=\u0022hljs-variable\u0022\u003E$error\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022QUERY: \u0022\u003C\/span\u003E.\u003Cspan class=\u0022hljs-variable\u0022\u003E$v\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E][\u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E].\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\\n\u0022\u003C\/span\u003E.\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022file: \u0022\u003C\/span\u003E.\u003Cspan class=\u0022hljs-variable\u0022\u003E$v\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027file\u0027\u003C\/span\u003E].\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\\n\u0022\u003C\/span\u003E.\t\t\t\t \n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022line: \u0022\u003C\/span\u003E.\u003Cspan class=\u0022hljs-variable\u0022\u003E$v\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027line\u0027\u003C\/span\u003E].\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\\n\u0022\u003C\/span\u003E.\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022date: \u0022\u003C\/span\u003E.date(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022Y-m-d H:i:s\u0022\u003C\/span\u003E).\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\\n\u0022\u003C\/span\u003E.\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022===================================\u0022\u003C\/span\u003E;\t\t\n \n file_put_contents(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027.\/logs\/slowquery.log\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-variable\u0022\u003E$error\u003C\/span\u003E.\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\\r\\n\u0022\u003C\/span\u003E,FILE_APPEND);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ebreak\u003C\/span\u003E;\n }\n }\n }\n }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EShutDownSystem\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E microtime(\u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E) - \u003Cspan class=\u0022hljs-variable\u0022\u003E$_SERVER\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022REQUEST_TIME_FLOAT\u0022\u003C\/span\u003E];\n }\n}\nEvent::setEventHandler(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027MyEvents\u0027\u003C\/span\u003E);\nq(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022SELECT * FROM `table` ORDER BY RAND()\u0022\u003C\/span\u003E);\nq(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022SELECT NOW()\u0022\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E Timer::result();\n\u003C\/code\u003E\u003C\/pre\u003E\nНемного пояснений. Переопределив ShutDownSystem мы можем вывести на экран время работы скрипта в микросекундах времени Unix.\u003Cbr\u003E\nBeforeQuery - мы создали таймер с именем \u0022номер запроса\u0022, таким образом мы можем посмотреть каждый запрос по номеру. Если хотите получить строку запроса, линию и файл вызова, то посмотрите пример AfterQuery, в котором перебирается debug_backtrace.\u003Cbr\u003E\nAfterQuery - устанавлияет второй интервал таймера и считает прошедшее время запроса. Если запрос выполнялся более секунды, то он логируется в файле slowquery.log. Очень удобная вещь в случаях, когда надо определить долгие запросы на сервере, но доступа к slowquerys в MySQL нет (ограничен администрацией хостинга).\u003Cbr\u003E\nTimer::result(); - мы получаем табличный вид всех таймеров. Мы могли бы использовать Timer::$step для получения всех вариантов. Пример полученной таблицы:\u003Cbr\u003E\n\u003Cimg src=\u0022\/img\/documentation\/event_example.jpg\u0022\u003E\n","num":"0"},"11":{"id":"11","category":"Документация Creative-FW","section":"Mail","topic":"Отправка сообщений","date":"1970-01-01 00:00:00","date_modify":"2014-08-22 02:58:38","text":"\u003Ch2\u003EОписание\u003C\/h2\u003E\r\nКласс Mail позволяет отправлять простые HTML-письма, а так же письма с вложениями. В самом классе предусмотрена возможность массовой рассылки и отписки от рассылок.\u003Cbr\u003E\r\nСвойства класса хранятся в \u0027.\/liblary\/Mail\/Config\/Config.php\u0027 в виде трейта. Настраиваются значения по умолчанию в этом файле.\r\n\r\n\u003Ch2\u003EСвойства класса\u003C\/h2\u003E\r\nstatic $subject - устанавливаем заголовок письма\u003Cbr\u003E\r\nstatic $to - получатель письма (адресат)\u003Cbr\u003E\r\nstatic $from - email сайта. Желательно формат делать noreply@domain.ru или admin@domain.ru , email адреса должны быть настоящие, а домен - домен сайта, с которого отправляются письма. Нарушая эти правила письмо будет отправляться в спам.\u003Cbr\u003E\r\nstatic $from_name - имя отправителя. Замена отправителя на другую строку.\u003Cbr\u003E\r\nstatic $html - содержание письма в формате HTML.\u003Cbr\u003E\r\nstatic $error - строка ошибки в случае, если класс генерирует ошибку. \r\n\r\n\u003Ch2\u003EМетоды класса\u003C\/h2\u003E\r\nstatic htmlBody() - принимает html-разметку страницы, находящуюся внутри тега \u003Cbody\u003E. Возвращает эту же разметку с остальными тегами HTML-разметки (html,head,title,meta).\u003Cbr\u003E\r\nstatic htmlGet($file) - загружает html-макет в тело письма. Альтернатива htmlBody. $file должен быть файлом верстки без постороннего кода \u0027*.html\u0027.\u003Cbr\u003E\r\nstatic attachFile($path,$name) - прикрепляет к письму файл. $path - путь к файлу, $name - имя файла (допустимо переименовать на своё имя).\r\nstatic send_mail() - Отправка письмо. Возвращает true в случае успеха.\u003Cbr\u003E\r\n\r\n\r\n\u003Ch2\u003EОтправка HTML-письма\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Etry\u003C\/span\u003E {\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$subject\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Новое письмо\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$to\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027inpostdpua@gmail.com\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$from\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027noreply@school-php.com\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$from_name\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027School PHP\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$html\u003C\/span\u003E = Mail::htmlBody(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Приветствую вас на моём сайте\u0026lt;br\u0026gt;\r\n Я рад, что Вы посетили меня. \u0026lt;img src=\u0022http:\/\/school-php.com\/courses.jpg\u0022 alt=\u0022School PHP\u0022\u0026gt;\u0026lt;br\u0026gt;\r\n Заходите ко мне на сайт: \u0026lt;a href=\u0022http:\/\/school-php.com\u0022\u0026gt;http:\/\/school-php.com\u0026lt;\/a\u0026gt;\u0026lt;br\u0026gt;\r\n \u0026lt;div style=\u0022font-size:16px; font-weight:bold; color:#990000;\u0022\u0026gt;С уважением, Станислав\u0026lt;\/div\u0026gt;\u0027\u003C\/span\u003E);\r\n Mail::send_mail();\r\n} \u003Cspan class=\u0022hljs-keyword\u0022\u003Ecatch\u003C\/span\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003EException\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$e\u003C\/span\u003E) {\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Ошибка отправления : \u0027\u003C\/span\u003E;\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$error\u003C\/span\u003E;\r\n}\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\u003Ch2\u003EОтправка письма с вложениями из шаблона\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Etry\u003C\/span\u003E {\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$subject\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Новое письмо\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$to\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027mymail@gmail.com\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$from\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027noreply@school-php.com\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$from_name\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027School PHP\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$html\u003C\/span\u003E = Mail::htmlGet(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027.\/template.html\u0027\u003C\/span\u003E);\r\n Mail::attachFile(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027logs.txt\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027my_logs\u0027\u003C\/span\u003E);\r\n Mail::attachFile(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027robots.txt\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027robots.txt\u0027\u003C\/span\u003E);\r\n Mail::send_mail();\r\n} \u003Cspan class=\u0022hljs-keyword\u0022\u003Ecatch\u003C\/span\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003EException\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$e\u003C\/span\u003E) {\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Ошибка отправления :\u0026lt;br\u0026gt;\u0027\u003C\/span\u003E;\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$error\u003C\/span\u003E;\r\n}\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\u003Ch2\u003EМассовая рассылка по подписчикам\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Etry\u003C\/span\u003E {\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$subject\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Новое на сайте\u0027\u003C\/span\u003E;\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$html\u003C\/span\u003E = Mail::htmlGet(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027.\/spam_template.html\u0027\u003C\/span\u003E);\r\n \u003Cspan class=\u0022hljs-variable\u0022\u003E$res\u003C\/span\u003E = q(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\r\n SELECT `email`\r\n FROM `users`\r\n WHERE `subscribe` = 1\r\n \u0022\u003C\/span\u003E);\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ewhile\u003C\/span\u003E(\u003Cspan class=\u0022hljs-variable\u0022\u003E$row\u003C\/span\u003E = \u003Cspan class=\u0022hljs-variable\u0022\u003E$res\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;fetch_assoc\u003C\/span\u003E()) {\r\n Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$to\u003C\/span\u003E = \u003Cspan class=\u0022hljs-variable\u0022\u003E$row\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E];\r\n Mail::send_mail();\r\n }\r\n} \u003Cspan class=\u0022hljs-keyword\u0022\u003Ecatch\u003C\/span\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003EException\u003C\/span\u003E \u003Cspan class=\u0022hljs-variable\u0022\u003E$e\u003C\/span\u003E) {\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Ошибка отправления :\u0026lt;br\u0026gt;\u0027\u003C\/span\u003E;\r\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E Mail::\u003Cspan class=\u0022hljs-variable\u0022\u003E$error\u003C\/span\u003E;\r\n}\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n","num":"0"},"2":{"id":"2","category":"Документация Creative-FW","section":"SESSION","topic":"Сессии в MySQL","date":"1970-01-01 00:00:00","date_modify":"2014-08-17 07:38:57","text":"\u003Ch2\u003EПримеры переноса сессий в MySQL\u003C\/h2\u003E\r\nЧтобы переопределить стандартное поведение на собственное необходимо подключить готовый обработчик сессий, для этого внесите изменения в \u0027.\/modules\/_allmodules.php\u0027:\r\n\r\n\u003Ch3\u003EПервый запуск сессии в MySQL (необходимо для создания таблицы в MySQL):\u003C\/h3\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003Esession_set_save_handler(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E SessionMysqlHandler(\u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E), \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E);\r\nsession_start();\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\u003Ch3\u003EКогда таблица создана, правим строчку, чтобы в дальнейшем скрипт при каждом запуске не проверял наличие таблицы (для быстродействия):\u003C\/h3\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003Esession_set_save_handler(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E SessionMysqlHandler(), \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E);\r\nsession_start();\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\nБлагодаря гибкости обработчика можно настроить некоторые параметры:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E SessionMysqlHandler();\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;table\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027sessions\u0027\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ имя таблицы для хранения сессий в MySQL\u003C\/span\u003E\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;expires\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u002724 MINUTE\u0027\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Время жизни сессии, используется в контексте NOW() + INTERVAL 24 MINUTE\u003C\/span\u003E\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;engine\u003C\/span\u003E = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027InnoDB\u0027\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Движок таблицы. Стандартные варианты: InnoDB, MEMORY, MyISAM\u003C\/span\u003E\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;control\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ip\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ (boolean) Сверять сессию с IP пользователем при каждом открытии страницы\u003C\/span\u003E\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;control\u003C\/span\u003E[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027useragent\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ (boolean) Сверять сессию с браузером пользователем при каждом открытии страницы\u003C\/span\u003E\r\nsession_set_save_handler(\u003Cspan class=\u0022hljs-variable\u0022\u003E$mySessionHandler\u003C\/span\u003E, \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E);\r\nsession_start();\u003C\/code\u003E\u003C\/pre\u003E\r\n\r\n\r\n","num":"0"},"6":{"id":"6","category":"Документация Creative-FW","section":"SESSION","topic":"Сессии в Memcached","date":"1970-01-01 00:00:00","date_modify":"2014-08-18 02:46:25","text":"\u003Ch2\u003EПримеры переноса сессий в Memcached\u003C\/h2\u003E\nЧтобы переопределить стандартное поведение на собственное необходимо подключить готовый обработчик сессий, для этого внесите изменения в \u0027.\/modules\/_allmodules.php\u0027:\n\n\u003Ch2\u003EСессии в memcached server с memcached module:\u003C\/h2\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003Eini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_handler\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027memcached\u0027\u003C\/span\u003E);\nini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_path\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027127.0.0.1:11211\u0027\u003C\/span\u003E);\nsession_start();\n\u003C\/code\u003E\u003C\/pre\u003E\n\nПодключайтесь к 127.0.0.1 , или localhost","num":"0"},"5":{"id":"5","category":"Документация Creative-FW","section":"SESSION","topic":"Redis","date":"1970-01-01 00:00:00","date_modify":"2014-08-18 02:37:06","text":"\u003Ch2\u003EПримеры переноса сессий в Redis\u003C\/h2\u003E\r\nЧтобы переопределить стандартное поведение на собственное необходимо подключить готовый обработчик сессий, для этого внесите изменения в \u0027.\/modules\/_allmodules.php\u0027:\r\n\r\n\u003Ch2\u003ESession в redis server:\u003C\/h2\u003E\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003Eini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_handler\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027redis\u0027\u003C\/span\u003E);\r\nini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_path\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027tcp:\/\/127.0.0.1:6379\u0027\u003C\/span\u003E);\r\nsession_start();\r\n\u003C\/code\u003E\u003C\/pre\u003E","num":"0"},"3":{"id":"3","category":"Документация Creative-FW","section":"SESSION","topic":"Сессии в Memcache","date":"1970-01-01 00:00:00","date_modify":"2014-08-18 02:46:17","text":"\u003Ch2\u003EПримеры переноса сессий в Memcache\u003C\/h2\u003E\nЧтобы переопределить стандартное поведение на собственное необходимо подключить готовый обработчик сессий, для этого внесите изменения в \u0027.\/modules\/_allmodules.php\u0027:\n\n\u003Ch2\u003EСессии в memcached server с memcache module:\u003C\/h2\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003Eini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_handler\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027memcache\u0027\u003C\/span\u003E);\nini_set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027session.save_path\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027tcp:\/\/127.0.0.1:11211\u0027\u003C\/span\u003E);\nsession_start();\n\u003C\/code\u003E\u003C\/pre\u003E","num":"0"},"1":{"id":"1","category":"Документация Creative-FW","section":"SESSION","topic":"Вступление в сессии","date":"1970-01-01 00:00:00","date_modify":"2014-08-17 07:37:47","text":"\u003Ch2\u003EВступление в хранение сессий\u003C\/h2\u003E\nPHP по умолчанию хранит сессию в файлах во временной директории. Вы можете изменить место хранения сессий на Таблицу в MySQL (по умолчанию `sessions`), либо в памяти при помощи memcache на сервере Memcached.\nПеренос хранения в MySQL бывает полезным тогда, когда нужен контроль за сессией (мониторинг) или прямой доступ для работы скриптов. Очень удобная реализация в случае, если надо определить \u0027количество он-лайн пользователей\u0027, где сессия = посетитель за последние 24 минуты.\nХранение в MySQL в таблице MEMORY сделает ненадёжным сессию, но ускорит работу с сессией в несколько раз, а значит и сайт будет работать быстрее. MEMORY можно считать альтернативой Memcache в случаях, когда нет возможности установить на сервере Memcached сервер (провайдеры дешевых хостингов не предоставляют возможности).\nMemcache - это ускорение работы сайта в целом, ведь не только сессии можно хранить там. Согласно официальным данным крупная социальная сеть FaceBook хранит часть информации в Memcache, это касается сессий, пользовательских данных и сессий. Минусом может послужить ненадёжность данных в памяти.","num":"0"},"10":{"id":"10","category":"Документация Creative-FW","section":"Timer","topic":"Работа с таймером","date":"1970-01-01 00:00:00","date_modify":"2014-08-20 20:15:36","text":"\u003Ch2\u003EОписание PHP Timer\u003C\/h2\u003E\r\nTimer - позволяет делать замеры времени в формате Unix microtime используя функцию microtime(true). Удобный способ отмерять скорость работы нескольких отрезков на странице.\r\n\r\n\u003Ch2\u003EСвойства и методы:\u003C\/h2\u003E\r\n\u003Ch3\u003EСвойства\u003C\/h3\u003E\r\nstatic $start - содержит временные метки начала каждого из отрезков.\u003Cbr\u003E\r\nstatic $step - содержит все отрезки.\u003Cbr\u003E\r\nstatic $last - информацию последнего участка отрезка в виде массива (Имя участка отрезка, временная метка микровремени Unix, разница времи между началом отрезка и последним участком).\r\n\r\n\u003Ch3\u003EМетоды:\u003C\/h3\u003E\r\nstatic start($key = 0,$title = \u0027\u0027)\u003Cbr\u003E\r\nНачинает отрезок времени, где $key - имя отрезка времени, $title - имя первой точки (первого участка) отрезка $key.\u003Cbr\u003E\r\nstatic step($key = 0,$title = \u0027\u0027) - Добавляет точку (участок) времени в отрезок времени $key. $title - имя точки времени.\r\nstatic result() - выводит self::$step в виде таблицы:\u003Cbr\u003E\r\n\u003Cimg src=\u0022\/img\/documentation\/timer_example.jpg\u0022 alt=\u0022PHP Timer example\u0022\u003E\u003Cbr\u003E\r\nДанная таблица сформировалась путём вызова следующего кода:\r\n\u003Cpre\u003E\u003Ccode class=\u0022 hljs lasso\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Первый интервал\u003C\/span\u003E\r\nTimer\u003Cspan class=\u0022hljs-tag\u0022\u003E::start\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Получаем данные о пользователе\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027До запроса\u0027\u003C\/span\u003E);\r\ngetUserData();\r\nTimer\u003Cspan class=\u0022hljs-tag\u0022\u003E::step\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Окончание запроса\u0027\u003C\/span\u003E);\r\n\r\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Второй интервал\u003C\/span\u003E\r\nTimer\u003Cspan class=\u0022hljs-tag\u0022\u003E::start\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Сортируем список товаров\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027До запроса\u0027\u003C\/span\u003E);\r\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$goods\u003C\/span\u003E \u003Cspan class=\u0022hljs-subst\u0022\u003E=\u003C\/span\u003E selectGoods();\r\nTimer\u003Cspan class=\u0022hljs-tag\u0022\u003E::step\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Выбрали товары из MySQL\u0027\u003C\/span\u003E);\r\norderGoods(\u003Cspan class=\u0022hljs-variable\u0022\u003E$goods\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E);\r\nTimer\u003Cspan class=\u0022hljs-tag\u0022\u003E::step\u003C\/span\u003E(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Отсортировали товары\u0027\u003C\/span\u003E);\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\n","num":"0"},"4":{"id":"4","category":"Документация Creative-FW","section":"Trace","topic":"Trace для мониторинга","date":"1970-01-01 00:00:00","date_modify":"2014-08-20 20:16:12","text":"\u003Ch2\u003EОписание класса Trace:\u003C\/h2\u003E\nTrace - упрощенная реализация мониторинга за данными. Когда мы локально разрабатываем сайт, то можем без труда воспользоваться тикетами или xDebug для проверки важных частей сайта. Но у данного подхода есть огромные проблемы:\u003Cbr\u003E\n1) большие нагрузки на реальный сервер.\u003Cbr\u003E\n2) невозможно следить за состоянием у удалённого пользователя\u003Cbr\u003E\nДля решения обоих проблем был разработан класс Trace.\n\n\u003Ch2\u003EМетоды и свойства Trace:\u003C\/h2\u003E\n\u003Ch3\u003ETrace::set([$args]);\u003C\/h3\u003E\nЗаписывает переданные параметры в статичном свойстве (array)Trace::$data. Если параметры не будут переданы, то запишет пустую строку типа string. Принимает int,float,string,array. Так же будут записаны: время вызова, строка вызова и файл вызова метода.\n\n\u003Ch3\u003ETrace::get();\u003C\/h3\u003E\nВозвращает (string) все записанные данные через Trace::set в виде отформатированной таблицы. Так же в таблице будет представлено поле Delay, в котором обозначается задержка с момента первой записи в Trace. Чтобы получить неотформатированный массив обращайтесь напрямую к свойству Trace::$data;\n\n\u003Ch3\u003ETrace::$dateformat;\u003C\/h3\u003E\nСвойство вывода даты в таблице метода Trace::get(). Принимает параметры: пустую строку \u0027\u0027 для вывода в виде Unix Timestamp, и Формат Даты для функции date(Trace::$dateforman).\n\n\u003Ch2\u003EПримеры:\u003C\/h2\u003E\nВозьмем к примеру замер выполнения участка кода между двумя точками: перед тяжелым запросом к БД и после. Сохраним результат запроса и проанализируем скорость выполнения кода:\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003ETrace::set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Before INSERT\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efor\u003C\/span\u003E(\u003Cspan class=\u0022hljs-variable\u0022\u003E$i\u003C\/span\u003E=\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E; \u003Cspan class=\u0022hljs-variable\u0022\u003E$i\u003C\/span\u003E \u0026lt; \u003Cspan class=\u0022hljs-number\u0022\u003E100000\u003C\/span\u003E; ++\u003Cspan class=\u0022hljs-variable\u0022\u003E$i\u003C\/span\u003E) {\n q(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\n INSERT INTO `table` SET\n `cell` = \u0027afk\u0022\u003C\/span\u003E.rand(\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E,\u003Cspan class=\u0022hljs-number\u0022\u003E10000\u003C\/span\u003E).\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022fafafafafdwa\u0027\n \u0022\u003C\/span\u003E);\n q(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\n INSERT INTO `table` SET\n `cell` = \u0027pro\u0022\u003C\/span\u003E.rand(\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E,\u003Cspan class=\u0022hljs-number\u0022\u003E10000\u003C\/span\u003E).\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022ffaw affafa faw\u0027\n \u0022\u003C\/span\u003E);\n}\n\nTrace::set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027After INSERT, Before SELECT\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$res\u003C\/span\u003E = q(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022\n SELECT *\n FROM `table`\n WHERE `cell` LIKE \u0027%pro%\u0027\n ORDER BY RAND()\n LIMIT 5\n\u0022\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-variable\u0022\u003E$row\u003C\/span\u003E = \u003Cspan class=\u0022hljs-variable\u0022\u003E$res\u003C\/span\u003E\u003Cspan class=\u0022hljs-variable\u0022\u003E-\u0026gt;fetch_assoc\u003C\/span\u003E();\nTrace::set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027After function q();\u0027\u003C\/span\u003E,\u003Cspan class=\u0022hljs-variable\u0022\u003E$row\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eecho\u003C\/span\u003E Trace::get();\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eexit\u003C\/span\u003E;\u003C\/code\u003E\u003C\/pre\u003E\n\nРезультат:\u003Cbr\u003E\n\u003Cimg src=\u0022\/img\/documentation\/trace_example.jpg\u0022 alt=\u0022Trace Example\u0022 style=\u0022width:974px !important; max-width: 974px !important;\u0022\u003E","num":"0"},"19":{"id":"19","category":"Документация Creative-FW","section":"User","topic":"Регистрация","date":"1970-01-01 00:00:00","date_modify":"2014-08-29 23:16:06","text":"","num":"0"},"20":{"id":"20","category":"Документация Creative-FW","section":"User","topic":"Авторизация","date":"1970-01-01 00:00:00","date_modify":"2014-08-29 23:34:12","text":"\u003Ch2\u003EПереадресация после авторизации\u003C\/h2\u003E\r\nВ случае, если человек попадает на страницу, для которой необходимо быть авторизированным, но при этом он не авторизирован, то его переадресуют на страницу авторизации. Чтобы после авторизации человек вернутся на первоначальную страницу, то передавайте нужную ссылку вторым параметром в ссылке: redirect(\u0027\/login\/\u0027.urlencoder(\u0027\/cab\u0027)); . В данном случае после авторизации человек вернётся обратно на страницу \u0027\/cab\u0027. Важно, что в адресной строке \/ является разделителем параметров, поэтому для указания верной ссылки надо закодировать слеш, но при этом обычный штатный urlencode не подойдет, так как \u0027%F2\u0027 запрещен в интересах безопасности Апачем, соответственно, у некоторых хостеров работать не будет. Именно поэтому адресную строку мы кодируем функцией urlencoder без второго аргумента. Если надо ссылку преобразовать в обычный вид, то urlencoder($link,\u0027decoder\u0027);\u003Cbr\u003E\r\n\r\n\u003Ch2\u003EIP Defender\u003C\/h2\u003E\r\nВнутри авторизации встроен метод защиты от подбора по словарю. То есть в случае, если более 10 раз не удаётся человеку авторизироваться (не подошел логин или пароль, или человек забанен), то авторизация блокируется на ближайшие 15 минут.\r\n\r\n\u003Ch2\u003EAuthorization-\u003EauthByLoginPass($login,$password,$rememberme = false)\u003C\/h2\u003E\r\nАвторизирует человека по login + password. Если передан $rememberme с аргументом true, то скрипт запомнит человека для постоянной автоматической авторизации.\r\n\r\n\r\n\u003Ch2\u003EAuthorization-\u003Elogout()\u003C\/h2\u003E\r\nВыход пользователя из авторизации. Так же удаляется и куки для автоавторизации.\r\n\r\n\u003Ch2\u003EAuthorization-\u003EgetErrorMess()\u003C\/h2\u003E\r\nВозвращает строку с ошибок согласно выбранному языку.\r\n\r\n\u003Ch2\u003EПример работы\u003C\/h2\u003E\r\nДля примера лучше всего посмотреть уже готовый модуль авторизации \u0027login\u0027.","num":"0"},"16":{"id":"16","category":"Документация Creative-FW","section":"Ядро","topic":"Настройка config\/config.php","date":"1970-01-01 00:00:00","date_modify":"2014-08-25 04:47:08","text":"\u003Ch2\u003EОсновы настройки сайта\u003C\/h2\u003E\r\nconfig\/config.php содержит общую настройку и правила сайта. Все глобальные настройки устанавливаются тут, исключением есть конфиги дополнительных классов и конфиги модулей.\r\n\r\n\u003Ch2\u003EСвойства конфига ядра\u003C\/h2\u003E\r\n$CREATED - (int) год создания ядра. Используется для генерации копирайтов в формате: \u0022год создания - нынешний год\u0022\u003Cbr\u003E\r\n$CONT - (string) главный контроллер модулей. Указывает папку, в которой находятся модули. Для админки дописывается \/admin к указанной папки\u003Cbr\u003E\r\n$SKIN - (string) папка шаблона верстки. Благодаря изменениям $SKIN можно назначить несколько дизайнов страниц\u003Cbr\u003E\r\n$DB_NAME - (string) имя \u0022Базы данных\u0022 MySQL\u003Cbr\u003E\r\n$DB_LOGIN - (string) логин пользователя для доступа к MySQL\u003Cbr\u003E\r\n$DB_PASS - (string) пароль пользователя для доступа к MySQL\u003Cbr\u003E\r\n$DB_LOCAL - (string) Расположение MySQL. Указывается localhost или 127.0.0.1 в случае локального расположения, или IP адреса для внешнего (удалённого). Чтобы подключиться к удалённому необходимо открыть доступ подключения из-вне внутри MySQL\u003Cbr\u003E\r\n$DB_TIME_ZONE - (string) Устанавливает часовой пояс (временную зону) для MySQL. Переназначает дефолтное MySQL, если значение введено! Формат: \u0027+03:00\u0027.\u003Cbr\u003E\r\n$PHP_TIME_ZONE - (string) Устанавливает часовой пояс (временную зону) для PHP. Переназначает дефолтное время, которое берётся из операционной системы.\u003Cbr\u003E\r\n\r\n$DOMAIN - (string) Полный адрес (домен) сайта. Формат: \u0027http:\/\/school-php.com\u0027\u003Cbr\u003E\r\n$ADMIN - (string) e-mail адрес админа. Используется для контактов и писем. Адрес должен быть настоящим.\u003Cbr\u003E\r\n$NOREPLY - (string) e-mail адрес серверных рассылок. noreply как бы намекает, что на него не надо отвечать. Не смотря на это email должен быть создан на домене. Для эффективного использования настройте перенаправление входящей почты на ваш основной email на почтовом сервисе (у хостинга, а не на сайте!). Noreply обязан содержать адрес домена по примеру: \u0027noreply@school-php.com\u0027\u003Cbr\u003E\r\n$EVENTS - (boolean) Включает стандартные события на сайте (BeforeQuery, AfterQuery, ShutDownSystem, ShutDownSystemError)\u003Cbr\u003E\r\n\r\n$META - (array) { - Устанавливаем мета-данные. Служит как контейнер для внутреннего переопределения, так как устанавливается дефолтное, переназначается из модулей\/страниц. Для каждой СТРАНИЦЫ должно быть уникальным\u003Cbr\u003E\r\n \u0027title\u0027 - (string) Уникальный заголовок страницы.\u003Cbr\u003E\r\n \u0027description\u0027 - (string) Уникальное описание страницы.\u003Cbr\u003E\r\n \u0027keywords\u0027 - (string) Уникальные ключевые слова страницы.\u003Cbr\u003E\r\n}\u003Cbr\u003E\r\n\r\n$LANGUAGE - (array) { - \u003Cbr\u003E\r\n \u0027status\u0027 - (boolean) Включаем мультиязычность. С включенной мультиязычностью будут подключаться тексты языка\u003Cbr\u003E\r\n \u0027lang\u0027 - (string) Язык страниц по умолчанию. Сайт без указания языка будет использовать дефолтный язык\u003Cbr\u003E\r\n \u0027allow\u0027 - (array) Массив допустимых языков. Пример: array(\u0027ru\u0027,\u0027en\u0027)\u003Cbr\u003E\r\n}\u003Cbr\u003E\r\n\r\n$BOOTSTRAP - (boolean) Подключить bootstrap css \u0026 js\u003Cbr\u003E\r\n\r\n$STUBROUTINE - (array) { - Ставит заглушку на сайт на момент тех\/поддержки или разработки. Открывает частичный доступ по IP. Подключает .\/skins\/Core::$SKIN\/stubroutine.tpl как шаблон заглушки\u003Cbr\u003E\r\n \u0027status\u0027 - (boolean) Включаем заглушку на сайте\u003Cbr\u003E\r\n \u0027ip_access\u0027 - (array) Открывает доступ к общему сайту для определённых IP. Позволяет указать как определённые IP, так и подмаски сетей. Оставьте массивы \u0027ip\u0027 и \u0027ip_mask\u0027 для закрытия доступа всем.\u003Cbr\u003E\r\n}\u003Cbr\u003E\r\n\r\n$ERRORS - (array) { - \u003Cbr\u003E\r\n \u0027file\u0027 - (boolean) Логирует php ошибки в файл \u0027.\/logs\/php.log\u0027\u003Cbr\u003E\r\n \u0027mysql\u0027 - (boolean) Логирует php ошибки в MySQL табилцу `php_logs`\u003Cbr\u003E\r\n \u0027email\u0027 - (boolean) Отправляет лог ошибки админу Core::$ADMIN\u003Cbr\u003E\r\n \u0027show\u0027 - (boolean) Пишет ошибки на странице (аналог display_errors \u0026 error_reporting). Включайте при разработке и отключайте на готовом сайте выложенном в сети. Хакеры не должны видеть ваши ошибки, это ОЧЕНЬ ВАЖНО.\u003Cbr\u003E\r\n \u0027redirect\u0027 - (boolean) Включает переадресацию на 404 в случае ошибки. Включайте на готовом сайте\u003Cbr\u003E\r\n \u0027stop\u0027 - (boolean) Останавливает работу скрипта в случае ошибки. При отключенном будет действовать стандартный порядок php.\u003Cbr\u003E\r\n \u0027errlvl\u0027 - (boolean) в разработке \u003Cbr\u003E\r\n}\u003Cbr\u003E\r\n\r\n\r\n$SITEMAP - (array) {} - Полная карта сайта публичной части (без админки). О настройке карты читайте в следующей статье.\u003Cbr\u003E\r\n\r\n$JS - (array) Пустой массив, позволяет из модулей (и страниц) подключать дополнительный js-файлы для данного модуля (и страницы)\u003Cbr\u003E\r\n$CSS - (array) Пустой массив, позволяет из модулей (и страниц) подключать дополнительный css-файлы для данного модуля (и страницы)\u003Cbr\u003E\r\n","num":"0"},"17":{"id":"17","category":"Документация Creative-FW","section":"Ядро","topic":"Настройка SiteMap","date":"1970-01-01 00:00:00","date_modify":"2014-08-25 05:53:04","text":"\u003Ch2\u003ESiteMap предназначение\u003C\/h2\u003E\r\nГлавная часть сайта - правильная карта сайта. Благодаря настройке данного массива вы закроете доступ по \u0022левым\u0022 ссылкам, а так же создадите специальные фильтры для переданных параметров.\r\n\r\n\u003Ch2\u003EСтруктура SiteMap\u003C\/h2\u003E\r\n1) Первый уровень вложенности указывает на существующие модули. Main считается модулем по умолчанию, техническими будут: 404, errors, static. За исключением технических остальные можно настраивать по собственному желанию. Перечислите существующие модули на сайте в виде ключей, значением будет их свойства(!).\u003Cbr\u003E\r\n2) Второй уровень вложенности есть свойства модуля (array \u0027\/OPTIONS\u0027) и его страницы. Страницы перечисляются все, если их не указать (в модуле), то по умолчанию будет подгружаться страница main модуля. Если в адресной строке указать только модуль без страницы \u0027http:\/\/school-php.com\/video\u0027, то страница по умолчанию будет main в случае отсутствия перечисленных страниц в SiteMap, или в случае перечисления - первая стоящая страница(!). Это значит, что в массиве:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027video\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027view\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(),\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027watch\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(),\r\n)\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\nПри открытии страницы: \u0027http:\/\/site.ru\/video\u0027 будет подгружена страница \u0027view\u0027, а не \u0027main\u0027(!).\u003Cbr\u003E\r\n3) \u0027\/OPTIONS\u0027 - (array) свойства модуля. Допустима настройка:\u003Cbr\u003E\r\n\u0027config\u0027 - (boolean), по умолчанию false: подключает конфигурационный файл модуля: .\/modules\/модуль\/config\/config.php\u003Cbr\u003E \r\n\u0027before\u0027 - (boolean), по умолчанию false: подключает дополнительный ВИД перед основным: .\/modules\/модуль\/skins\/default\/before.tpl\u003Cbr\u003E\r\n\u0027after\u0027 - (boolean), по умолчанию false: подключает дополнительный ВИД после основного: .\/modules\/модуль\/skins\/default\/after.tpl\u003Cbr\u003E\r\nПримечание: Используя before+after можно вывести подменю сайта (меню модуля). Формирования меню отвечает allpages данного модуля\u003Cbr\u003E\r\n\u0027controller\u0027 - (boolean), по умолчанию false: переопределяет контроллер модуля по умолчанию на: .\/modules\/модуль\/controller\/controller.php\u003Cbr\u003E\r\nПримечание: встроенный контроллер по умолчанию подключает: allpages.php, \u0027$page\u0027.php, before.tpl, \u0027$page\u0027.tpl, after.tpl, где \u0027$page\u0027 - страница данного модуля. Замечу, что allpages, Before и After справится с контролем доступа, мониторингом, подменю и фильты, так можно будет подключить другие модули через компонентное подключение. Особые эстеты могут переопределить контроллер в своих целях, но задач, с которыми справится встроенный модуль я не встречал. Но не забывайте, нет предела совершенству!\u003Cbr\u003E\r\n4) Третий уровень вложенности от страницы - массив \u0027GET\u0027, внутри которого содержатся дополнительные $_GET параметры страницы в формате ЧПУ с правилами.\r\n5) Четвертый уровень вложенности от \u0027GET\u0027 содержит дополнительные $_GET параметры. Взгляните на пример:\r\n\u003Cpre\u003E\u003Ccode class=\u0022php hljs \u0022\u003E\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027news\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027view\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GET\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027category\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027rules\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027[a-zа-яё0-9_-]+\u0027\u003C\/span\u003E,\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027all\u0027\u003C\/span\u003E,\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027string\u0027\u003C\/span\u003E,\r\n ),\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027page\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027rules\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027[0-9]+\u0027\u003C\/span\u003E,\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E,\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027int\u0027\u003C\/span\u003E,\r\n ),\r\n ),\r\n ),\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027read\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GET\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Earray\u003C\/span\u003E(\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027req\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E,\r\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027rules\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027[0-9]+\u0027\u003C\/span\u003E,\r\n ),\r\n ),\r\n ),\r\n),\r\n\u003C\/code\u003E\u003C\/pre\u003E\r\nТеперь отчётливо видно, что у модуля \u0027news\u0027 у страницы \u0027view\u0027 есть 2 дополнительных параметра \u0027category\u0027 и \u0027page\u0027. Полный вид с переданными параметрами: site.ru\/news\/view\/all\/4 ($_GET[\u0027category\u0027] == \u0027all\u0027, $_GET[\u0027page\u0027] == 4). \u003Cbr\u003E\r\nСтоит отдельно выделить следующее правило комфорта: для страницы вида \u0027site.ru\/news\/view\/all\/4\u0027, где страница \u0027view\u0027 является так же страницей по умолчанию (находится первым в списке) допустим короткий вид: site.ru\/news\/all\/4 (без указания страницы).\u003Cbr\u003E \r\n6) Пятым уровнем вложенности от дополнительного параметра будут его свойства:\u003Cbr\u003E\r\n\u0027req\u0027 - (boolean) обязательный параметр. Если указать \u0027category\u0027 обязательным, но открыть страницу site.ru\/news (без указания категории), то будет переадресация на 404 страницу(!). Так же важно указывать сначала обязательные, а после необязательные параметры в \u0022дополнительных параметрах\u0022\u003Cbr\u003E\r\n\u0027rules\u0027 - (string) Правила формата регулярного выражения. Будет подставлено в: preg_match(\u0027#^\u0027.$rules.\u0027$#iusU\u0027). Если переданный параметр не удовлетворяет установленному правилу, то будет переадресация на 404 страницу\u003Cbr\u003E\r\n\u0027default\u0027 - (string) Устанавливает значение по умолчанию. В случае, если \u0027req\u0027 не установлен и параметр не был передан, то можно установить стандартный по умолчанию указав его в \u0027default\u0027.\u003Cbr\u003E\r\n\u0027type\u0027 - (string) Указывается тип переменной, к которой будет приведена данная переменная. По умолчанию: $var = (string)$var, Допустимы параметры: string, int, array, boolean\u003Cbr\u003E\r\nВажно так же понимать, что эти параметры имеют верх над параметрами, переданными после знака ? . Таким образом указав параметр page в дополнительных параметрах и продублировав после знака вопроса: site.ru\/news\/view\/all\/4?page=3, будет принят именно \u0022дополнительный параметр\u0022, итого $_GET[\u0027page\u0027] == 4.\u003Cbr\u003E","num":"0"},"18":{"id":"18","category":"Документация Creative-FW","section":"Ядро","topic":"Функции","date":"1970-01-01 00:00:00","date_modify":"2014-08-29 02:56:43","text":"\u003Ch2\u003Efunction redirect($url = \u0027\u0027, $clearget = false)\u003C\/h2\u003E\r\nПреобразует url функцией createUrl($url,$clearget). Переадресация будет функцией header() в случае, если заголовки ещё не были отправлены, или через meta + javascript в случае, если заголовки были отправлены.\r\n\r\n\u003Ch2\u003EcreateUrl($url = \u0027\u0027,$clearget = false)\u003C\/h2\u003E\r\nРекомендуется в случае мультиязычности на сайте использовать createUrl, кроме этого в случаях, если мультиязычность не используется, то всегда можно будет перейти в режим мультиязычности без переписывания функционала сайта.\u003Cbr\u003E\r\nЕсли на сайте включена мультиязычность и выбран язык не по умолчанию (Core::$LANGUAGE[\u0027default\u0027]), то к ссылке будет подставлен язык.\u003Cbr\u003E\r\nЕсли параметры не были переданы, то будет сформирована ссылка на корень сайта \u0027\/\u0027.\u003Cbr\u003E\r\nЕсли передан $url с типом string, то сформируется ссылка вида $url.\u003Cbr\u003E\r\nЕсли передавать array $url, то массив будет сверяться с нынешней страницей и картой сайта для построения ссылки. При этом если передать $clearget с параметром true, то будет убран из ссылки параметр \u0027PAGE\u0027, что очень удобно для коротких ссылок. Давайте взглянем на примеры:\u003Cbr\u003E\r\ncreateUrl() - \u0027\/\u0027\u003Cbr\u003E\r\ncreateUrl(\u0027\/module\/page\u0027) - \u0027\/module\/page\u0027\u003Cbr\u003E\r\ncreateUrl(array(\u0027module\u0027=\u003E\u0027news\u0027),true) - \u0027\/news\u0027\u003Cbr\u003E\r\ncreateUrl(array(\u0027module\u0027=\u003E\u0027news\u0027,\u0027page\u0027=\u003E\u0027read\u0027)) - \u0027\/news\/read\/1\u0027, а данном примере подставилась цифра 1, так как установлен параметр для данной страницы: req=true, default=\u00271\u0027.","num":"0"}}