Класс xtables\base\AppService
обеспечивает сохранение сервисных данных в
базе данных в зашифрованном виде.
К подобным сервисным данным относятся логин-пароль от Яндекс.диска,
почтового ящика, используемого для передачи писем по SMTP, и любых других аналогичных данных.
Могут быть использованы следующие прокси интерфейсы.
Для добавления сервисных данных в базу данных в зашифрованном виде (данные шифруются служебным ключом, который автоматически присваивается каждому пользователю и автоматически извлекается после авторизации):
$name
- обязательно название для типа
сервисных данных;\xtables\components\upload\model\Yandex::APP_SERVICE_NAME
- для Яндекс.диска;\xtables\base\SendMail::APP_SERVICE_NAME
- для почты по SMTP
$data
- обязательно строка или
массив с данными, которые должны быть зашифрованы, например:
['login' => 'some_login', 'pass' => 'some_pass']
AppService::save('some_name', [
'login' => 'some_login',
'pass' => 'some_pass'
]);
Для получения сервисных данных в расшифрованном виде.
$name
- обязательно наименование типа сервисных данных.
AppService::getData('some_name');
Для проверки существуют ли данные данного типа.
AppService::exists('some_name');
AppService::getKey();
получение служебного ключа для самостоятельно шифрования чего-либо.
Состояние ключа по умолчанию показывается в кабинете пользователя. Если ключ пользователя активен, то он
сможет воспользоваться сервисами, данные к которым зашифрованы служебным ключом.
/config/config.php
.AppService::setDbc(string $dbc)
.
Не предусмотрены.
Класс xtables\base\Autocomplete
используется для организации функции автокомплита при вводе с клиента данных в поля input | textarea.
Функциональность обеспечивается JS функцией-оберткой xtables.autocomplete()
и
плагином для jquery: Ajax Autocomplete for jQuery Tomas Kirda
https://github.com/devbridge/jQuery-Autocomplete
Для использования автокомплита необходимо в настройках для компонентов
cardNew, cardView, tableView
добавить параметр autocomplete
:
table
- название sql таблицы, в которой должен осуществляться поиск;
по умолчанию, если данный параметр не определен, то будет взято название таблицы из имени ячейки,
которое должно состоять из имени sql таблицы + колонки через точку;
column
- колонка sql таблицы, в которой должен осуществляться поиск;
по умолчанию, если данный параметр не определен, то будет взято название колонки из имени ячейки,
которое должно состоять из имени sql таблицы + колонки через точку;
min_chars
- минимальное количество символов, после ввода которых
будет начинаться поиск для осуществления автокомплита; значение по умолчанию равняется 4
;
time
- время в милисекундах, по прошествии которого будет производится поиск;
по умолчанию равняется 300
;
dbc
- название подключения к базе данных, по умолчанию будет использоваться первое подключение
в настройках подключения к базе данных в файле /config/config.php
;
top
- если необходимо осуществлять поиск только с начала строки, то необходимо определить данный
параметр со значением true
.
true
; будут подставлены значения параметров по умолчанию.
'autocomplete' => true
'autocomplete' => [
'table' => 'some_table',
'column' => 'some_column',
'min_chars' => 4,
'time' => 300,
'dbc' => 'some_conn',
//'top' => true // from begining only
]
В компонентах cardView, tableView
параметры автокомплита добавляются к конкретной ячейке
в группе параметров edit
.
'edit' => [
'items' => [
'some_table.some_column' => [
'type' => 'input',
'max_len' => 50,
'autocomplete' => [
'table' => 'some_table',
'column' => 'some_column',
'min_chars' => 4,
'time' => 300,
'dbc' => 'some_conn'
]
],
]
]
Для настройки внешнего вида автокомплита измените классы в файле /css/style.css (или переопределите их):
.autocomplete-suggestions
.autocomplete-suggestion
.autocomplete-selected
.autocomplete-suggestions strong
.autocomplete-group
.autocomplete-group strong
Класс xtables\base\CellAction
обеспечивает создание ссылки, следуя параметрам.
Использование осуществляется в компонентах CardView
и TableView
.
Для настройки в компонентах CardView
и TableView
нужно создать массив
с полным именем (sql табилица + колнка через точку) колонки в качестве ключа и параметрами:
'path'
- путь ссылки (атрибут href
);
'params'
- параметр или параметры, которые должны быть подставлены к ссылке в следующем виде:
/
;
'css_classes'
- строка с названиями классов, которые должны быть добавлены к ссылке;
'css_id'
- идентификатор, которым должна быть помечена ссылка;
'target'
- атрибут target
ссылки, в качестве значения нужно
использовать любой действительный атрибут, например, _blank
; если открытие ссылки
в другом окне (вкладке) не нужно, то не нужно определять данный параметр;
'data_attr'
- массив для добавления к ссылке дата атрибутов, префикс data-
будет добавлен автоматически, указываеть его в настройках не нужно; можно подставить либо статическое значение
либо определить sql таблицу и колонку через точку, в этом случае значение подставится автоматически
из выборки из базы данных;
'data_attr' => [
'some' => 'val', // not use 'data-some'
'some2' => 'val2',
'some3' => 'some_table.id' // get from db
]
// will be <a data-some="val" data-some2="val2"></a>
'cell_link' => [
// link will be /outgoing/card?id=someid
'outgoing_docs.number' => [
'path' => 'outgoing/card',
'params' => [
'id' => 'outgoing_docs.id'
],
'css_classes' => 'ajax'
'css_id' => 'some_id',
'target' => '_blank',
'data_attr' => [
'some' => 'someval',
'else' => 'elseval'
]
],
//link will be /outgoing/card/someid
'outgoing_docs2.number' => [
'path' => 'outgoing/card',
'params' => 'outgoing_docs.repeated_id'
]
]
Класс xtables\base\CreateDir
обеспечивает проверку на наличие директории на сервере по запрашиваемому пути.
Может быть использован один из статических методов:
В случае отсутствия всех или части директорий они будут созданы внутри веб каталога в том количестве, которое соответствует запрашиваемому пути. В каждой диктории будет добавлен пустой файл-заглушка index.html.
Для использования необходимо передать относительный путь.
Проверяет и создает папки относительно веб корня ROOT_PATH
.
Класс вернет true
при удачном завершении либо выбросит исключение.
В качестве параметра может быть передана как строка с названием директории, так и массив директорий.
use xtables\base\CreateDir;
CreateDir::inWebRoot('/somepath/to/dir');
CreateDir::inWebRoot([
'/somepath/to/dir',
'/somepath/to/dir2',
'/some/dir'
]);
В случае отсутствия всех или части директорий они будут созданы внутри защищенного базового каталога в том количестве, которое соответствует запрашиваемому пути. В каждой диктории будет добавлен пустой файл-заглушка index.html.
Для использования необходимо передать относительный путь.
Проверяет и создает папки относительно защищенной базовой директории XTABLES_BASE
.
Класс вернет true
при удачном завершении либо выбросит исключение.
В качестве параметра может быть передана как строка с названием директории, так и массив директорий.
use xtables\base\CreateDir;
CreateDir::inProtected('/somepath/to/dir');
CreateDir::inProtected([
'/somepath/to/dir',
'/somepath/to/dir2',
'/some/dir'
]);
Метод создает директории по абсолютному пути без каких-либо заглушек. Возвращает true
или выбрасывает исключение.
use xtables\base\CreateDir;
CreateDir::direct(XTABLES_BASE . '/somepath/to/dir');
CreateDir::direct([
XTABLES_BASE . '/somepath/to/dir',
XTABLES_BASE . '/somepath/to/dir2',
XTABLES_BASE . '/some/dir'
]);
Не предусмотрены.
Класс xtables\base\HeadConnector
служит для подключения css, js файлов и meta тегов в head
страницы.
В связи со спецификой приложения, предусматривающей его многократное использование на одном и том же клиенте, механизм
подключения файлов в конце body
не рассматривался, так как подключаемые файлы кешируются и не замедляют
последующую загрузку и эксплуатацию приложения.
Также имеется возможность подключить какой-то файл в любом месте шаблоне макета страницы (layout). В этом случае данный файл будет подключаться к каждой странице, где используется шаблон.
Однако если имеется необходимость включать разные файлы или использовать разные meta теги на разных страницах, определяемых роутами, то нужно использовать HeadConnector.
По умолчанию HeadConnector
объединит все css файлы в один и поместит его в веб каталог /tmp
.
Будут объединены лишь те JS файлы, которые будут указаны в настройках в параметре combine_js
.
Какая-либо минификация файлов не производится, при необходимости нужно подключать минифицированные версии файлов,
которые будут объединены.
head
страницы кешируется.head
и созданные в папке /tmp
комбинированные файлы, то можно воспользоваться роутом для очистики
всего кеша /xtables-settings/clear-all-cache
.
Для использования нужно создать экземпляр класса и передать в него массив с данными мета тегов.
use xtables\base\HeadConnector;
$head = new HeadConnector([
'title' => 'some title'
'description' => 'some description',
'keywords' => 'some keywords'
], [
'bootstrap' => 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'
], [
'bootstrap' => 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'
]);
Ни одни из указанных данных не являются обязательными к передаче. Массивы с данными может вообще не передаваться.
Если данные не будут переданы, то будут использованы данные из конфигурационного файла /config/congig.php
:
'app'
- 'name'
, 'meta_description'
, 'keywords'
.
Второй массив служит для переопределения js, третий - css обозначений из конфигурационного файла
/config/js-css-meta.php
.
Для подключения файлов и мета тегов нужно вызвать метод get
, куда
передать массив с названиями подключаемых файлов. Набор этих данных кешируется.
$head->get([
'meta' => ['', ''],
'css' => [ '', ''],
'js' => [ '', '']
]);
HeadConnector
напрямую,
В файле /config/js-css-meta.php находится массив со всеми файлами и мета тегами,
которые могут быть подключены через HeadConnector
.
Массив состоит из:
'meta'
- наименования мета тегов; всегда подключаются мета теги
favicon
, apple_icon
, noscript
;
'meta' => [
'favicon' => '<link href="/images/favicon.png" rel="shortcut icon" type="image/x-icon" />', // always connected
'apple_icon' => '<link rel="apple-touch-icon" href="/images/favicon.png">', // always connected
'noscript' => '<noscript><meta http-equiv="refresh" content="0; url=/xtables-info/show/eyJjb250ZW50IjoxMH0="></noscript>', // always connected
'device' => '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">',
'fragment' => '<meta name="fragment" content="!">'
],
'css'
- css файлы; всегда подключаются:
bootstrap
- основной файл css фреймворка bootstrap, нужно указать расположение файла;
style
- расположение файла стилей, который подключается в конце и
служит для переопределения любых других стилей bootstrap, xtables...;
font_awesome
- расположение до файлы для подключения шрифтовых иконок font awesome;
'css' => [
'style' => '/css/style.css', // always connected
'bootstrap' => '/css/bootstrap.min.css', // always connected
'font_awesome' => '/css/font-awesome.min.css', // always connected
'date_picker' => '/css/jquery.datetimepicker.css',
'offcanvas' => '/css/offcanvas.min.css',
'rainbow' => '/css/rainbow/github.css'
]
'js'
- js файлы; должен быть указан путь к файлу от веб корня;
может быть указан как один путь, так и массив путей;jquery
- расположение к файлу фреймворка jquery;
bootstrap
- расположение к файлу фреймворка bootstrap;
xtables
- расположение основного js файла xtables;
user
- файл для личного кабинета;
'js' => [
'jquery' => [
'/js/jquery-3.0.0.min.js',
'/js/jquery-migrate-3.0.0.js'
], // always connected
'bootstrap' => '/js/bootstrap.js', // always connected
'xtables' => '/js/xtables.js', // always connected
'user' => '/js/user.js'
]
combine_css
- массив из обозначений css файлов, которые могут быть объединены в один
комбинированный файл;
'combine_css' => [
'bootstrap' => true,
'style' => true,
'font_awesome' => true,
'date_picker' => true,
'offcanvas' => true
]
combine_js
- массив из обозначений js файлов, которые могут быть объединены в один
комбинированный файл;
'combine_js' => [
'jquery' => true,
'bootstrap' => true,
'xtables' => true
]
xtables_js_settings
- массив с настройками, которые могут быть использованы
в js функциях; формируется файл /tmp/xtables.settings.json
с настройками, который подгружается при загрузке страницы и настройки
становятся доступны в объекте xtables.settings
'xtables_js_settings' => [
'someSet' => 'someval'
]
// in js functions can be used
xtables.settings.someSet;
Класс Home
обеспечивает:
- отображение главной страницы при обращении к корневой веб директории, соответствующей
относительному url /
;
- возможности обращения к actions без создания роутов.
Для использования необходимо отредактировать класс cofig\Home
путем редактирования метода index
и создания дополнительных необходимых
методов, если нужно.
Метод index
соответствует простому обращению по имени домена без каких-либо
параметров. Он может принимать только POST параметры.
Другие методы соответствуют отсутствующим роутам. Они могут принимать все типы параметров.
class Home extends Controller
{
public function accessLevels()
{
return Access::FREE;
}
/**
* special method for root home page
* only domain or domain/
* without any other data
*/
public function index()
{
// domain or domain/
}
public function about()
{
// domain/about
}
public function test()
{
// domain/test
}
Класс xtables\base\Request
производит фильтрацию всех входных параметров типов _GET, _POST, _FILES.
В ходе фильтрации происходит рекурсивный обход массива, таким образом степень вложенности массива не является ограничением.
Фильтр является грубым. При фильтрации используются фильтры PHP filter_var
и черный список слов.
Класс осуществляет разбор и фильтрацию параметров роута.
В ходе фильтрации удаляются параметры, имеющие в качестве своих названий зарезервированные слова:
add_log
edit
pre_condition
pre_order
search
select
structure
table
table_add
В каждом контроллере, который наследует класс \xtables\base\Controller
доступны экземпляры классов \xtables\base\Request
в свойстве
$this->request
, \xtables\base\Response
в свойстве
$this->response
.
Проверка на наличие route_param
(Request::ROUTE_PARAM
).
Получение значения route_param
(Request::ROUTE_PARAM
),
если отсутствует, то возвращает пустую строку.
Также может быть получен из массива параметров $this->request->params[Request::ROUTE_PARAM]
.
proxy()
.
Request::isPost(); // static proxy interface
Request::proxy()->isPost();
Могут быть использованы следующие методы статического прокси интерфейса:
Проверка того, что данные переданы методом POST. Для авторизованного пользователя будет также проводиться проверка
csrf-токена. Будет возвращено true
в случае успеха.
if ($this->request->isPost()) {
// some code
}
if (Request::isPost()) {
// some code
}
Для авторизованного пользователя будет добавлять в форму скрытый input с csrf-токеном.
xtables.ajax()
,jQuery.ajax()
и автоматически добавляет csrf-токен.
Проверка того, что данные переданы, используя ajax запрос.
if ($this->request->isAjax()) {
// some code
}
if (Request::isAjax()) {
// some code
}
Проверка того, что данные переданы методом POST и с использованием аякс диспетчера.
Может использоваться для установления состояний на action (адресе урл):
- если есть запрос через аякс диспетчер, то отдается только часть страницы;
- если нет аякс диспетчера, страница загружается полностью, включая лейаут.
if ($this->request->isAjDi()) {
}
if (Request::isAjDi()) {
$this->response->json();
} else {
$this->response->write();
}
Для рекурсивного обхода массива параметров нужно вызвать метод xtables\base\Request::primary()
, в который
передать массив с данными.
$this->request->primary([
'some' => 'value'
]);
$handled = Request::primary([
'some_param' => 'value',
'else_param' => 'else_value'
]);
Для очистки единичного значения можно использовать метод xtables\base\Request::recast()
, в который
передать значение в виде строки.
$handled = $this->request->recast('some_value');
$handled = Request::recast('some_value');
Для получения очищенного значения cookie можно использовать данный метод Request::getCookie()
, в который
в качестве параметра нужно передать имя cookie.
$value = $this->request->getCookie('some_name');
$value = Request::getCookie('some_name');
При сохранении в куки имени файла для его получения можно использовать данный метод, который
проводит дополнительную очистку. В имени не следует использовать расширение и символ .
(точки).
$value = $this->request->getFilenameFromCookie('some_name');
$value = Request::getFilenameFromCookie('some_name');
Для проверки существования cookie можно использовать данный метод Request::isCookie()
, который вернет
true
в случае наличия соответствующего cookie.
if ($this->request->isCookie('some_name')) {
// ***************
}
if (Request::isCookie('some_name')) {
// ***************
}
Удаление куки с определенным именем.
Request::clearCookie('some_name');
$this->request
->clearCookie('some_name1')
->clearCookie('some_name2')
->clearCookie('some_name3');
Для валидации входящего параметра нужно использовать данный метод, передав в него имя параметра.
После этого будут доступны методы валидации данных.
\xtables\base\Validate
Простая проверка на существование во входящих параметрах параметра с определенным именем.
Проверка на то, что входящий параметр с определенным именем существует и не является пустой строкой.
Проверяет, что входящий параметр с определенным именем является валидным адресом электронной почты.
Проверяет, что входящий параметр с определенным именем является валидной датой в соответствии с форматом,
заданным в /config/config.php
в параметре date_format
.
По умолчанию используется формат d.m.Y
.
Проверяет, что входящий параметр с определенным именем является валидным логином.
Проверяет, что входящий параметр с определенным именем является валидным паролем.
if ($this->request->param('some_name')->exists()) {
// some code
}
if ($this->request->param('some_name')->notEmpty()) {
// some code
}
if ($this->request->param('some_date')->isValidDate()) {
// some code
}
Не предусмотрены.
Класс xtables\base\News
обеспечивает показ системных новостей и оповещений всем пользователям.
После показа новость приобретает статус показанной и более данному пользователю не отображается.
С данным классом взаимодействует компонент авторизации. Для добавления, редактирования и запуска новостей (оповещений) нужно воспользоваться расширением News.
Не предусмотрены
Класс xtables\base\Notices
обеспечивает показ внутренних системных уведомлений тому, пользователю, которому
оно предназначено. Уведомление пропадает из списка после того, как пользователь нажмет на соответствующий пункт для
его активации.
Данный класс взаимодействует с классом xtables\base\Layout
и входит в состав инфоблока лейаута
(см. Layout).
Загрузка и обновление происходят с использованием Ajax dispatcher.
xtables-notices
.
Могут быть использованы статические прокси интерфейсы:
Для ручного (без использования инфоблока лейаута) получения js кода, который будет загружать
уведомления в css идентификатор xtables-notices
. В качестве аргумента в метод
может быть передано время обновления в секундах, по умолчанию составляет 180 сек.
Notices::get();
Notices::get(60);
Добавления уведомления с список.
В качестве аргументов должен быть передан массив массивов с настройками:
url
- ссылка для перехода при активации уведомления;
user_id
- идентификатор пользователя, которому предназначено уведомление;
from_user_id
- необязательно идентификатор
пользователя, от которого поступило уведомление;
notice
- сам текст уведомления.
$notices = [];
$notices[] = [
'url' => '/some/url',
'user_id' => 15,
'from_id' => 3, // or without this param
'notice' => 'some notice text'
];
$notices[] = [
'url' => '/some/url',
'user_id' => 16,
'from_id' => 3, // or without this param
'notice' => 'some notice text'
];
Notices::add($notices);
Не предусмотрены
Класс xtables\base\Crypt
обеспечивает:
jsencrypt.js
;
подобным образом могут передавать данные авторизационных форм (пароли, логины и пр.), что
обеспечивает защиту от прослушивания трафика, если не используется SSL или как дополнительная мера
защиты к SSL;
xtables\components\Auth
добавлен модуль, автоматизирующий работу с электронной подписью
для всех пользователей приложения от создания сертификата и генерации уведомления до блока подписания
файла-документа. В большинстве случаев возможностей этого модуля достаточно для организации работы
пользователей с электронной подписью. См. подробнее в компоненте Auth.
Для передачи шифрованных данных с клиента на сервер можно воспользоваться аякс формой,
добавив к форме класс .ajax-form
. К полям, которые должны быть зашифрованы,
необходимо добавить класс .crypt
.
Максимальная длина шифруемых в одном поле данных должна быть не более 465 символов.
Поля будут зашифрованы, затем расшированы и подвергнуты очистке на сервере автоматически, позволяя работать с передаваемыми значениями как обычно.
Ключи для шифрования данных подобным образом сохраняются в кеше сервера.
Период устаревания ключей составляет 86400 сек (24 ч). Данное значение можно изменить в настройках в файле
/config/config.php
в параметре form_rsa_keys_valid
.
'form_rsa_keys_valid' => 3600 // by default 86400
Работа с электронной подписью может осуществляться через возможности компонента xtable\components\Auth
,
который использует методы класса xtables\base\Crypt
:
setDn()
- установить значения DN сертификата (имя, компания, период действия ...) в публичной переменной $this->dn
,
значения берутся из файла настроек /config/config.php
;
setConfig()
- установить параметры шифрования,
значения берутся из файла настроек /config/config.php
;
generateNewCert()
- создает:
pem
в папку /accessory/ds/private/
и публичную переменную этого класса $this->privkey
, путь к этому файлу от папки,
соответствующей константе XTABLES_BASE
, -
в $this->filePrKey
;
cer
в папку /accessory/ds/cert/
, путь к этому файлу от папки,
соответствующей константе XTABLES_BASE
, -
в $this->fileCert
;
setPrivate($filePrKey, $err = true)
- получает закрытый ключ электронной подписи из файла и
возвращает его; при установке параметра $err
как false
не выбрасывается исключение
в случае ошибки получения ключа;
setPublic($certPath, $err = true)
- получает открытый ключ проверки электронной подписи из
файла сертификата и возвращает его; при установке параметра $err
как false
не выбрасывается исключение
в случае ошибки получения ключа;
sign($data)
- подписывает переданные данные алгоритмом SHA512 и возвращает подпись;
verify($data, $signature)
- проверяет по алгоритму SHA512 подпись переданные данных и
возвращает результат: 1
(true
) - подпись правильна;
0
(false
) - подпись не правильна; генерирует исключение в случае ошибки.
Осуществляются путем установки параметров в файле настроек /config/config.php
и сеттерах класса.
/**
* settings for digital signatures
*/
'digital_sign' => [
'dn' => [
'countryName' => 'RU', // 2 symb code
'stateOrProvinceName' => 'Moscow',
'localityName' => 'Moscow',
'organizationName' => 'some firm',
'organizationalUnitName' => 'some',
'commonName' => 'name', // uses if no specific info got
'emailAddress' => 'email' // uses if no specific info got
],
'config' => [
'encrypt_key' => true,
'digest_alg' => 'sha512',
'x509_extensions' => 'v3_ca',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA
],
'valid' => 730, // period in days
],
Класс xtables\base\Queue
обеспечивает выполнение задач (функций) в очереди (в фоне).
Это может быть удобно для отправки почты.
Работа очереди обеспечивается классом Sheduler
, в расписании которого содержится задание на
запуск очереди. Очередь начинает работать сразу же, как только будет включена работа
Sheduler.
Для добавления задачи в очередь нужно использовать статический метод
Queue::push()
, в который
нужно передать в качестве параметров:
$task
- callable функция, нужно указать ее имя с учетом namespace;
$params
- если необходимо, то в массиве можно указать параметры, которые
будут переданы в callable функцию;
$maxAttempts
- количество попыток на запуск задачи; по умолчанию (если не определено),
то составляет 5;
$delay
- если необходима задержка на выполнение, то нужно указать количество секунд,
на которое должно быть отложено выполнение задачи; по умолчанию (если не определено), то задержка
выполнения отсутствует.
use xtables\base\Queue;
Queue::push('some\name\to\SomeClass::someFunc');
Queue::push('some\name\to\SomeClass::someFunc', ['param', 'key' => 'val'], 2, 3600);
Результаты запуска заданий отражаются в файле /accessory/queue-report.json
, произошедшие при запуске ошибки -
в общем файле логов /accessory/log.md
.
/accessory/log.md
.
Класс xtables\base\ReplaceCell
обеспечивает автозамену значений, полученых в результате выборки
из базы данных, на другие, следуя определенным условиям.
Для использования необходимо создать массив 'replace'
в настройках для компонентов
CardView
и TableView
.
В настройках нужно создать массив 'replace'
с массивом полных имен (sql таблица + колонка через точку),
каждый из которых может иметь следующие параметры (указаны в порядке убывания их приоритета):
1 => 'Да'
, если из базы данных получена 1
, то показано будет Да
.
'function'
- масиив для применения к значению callable функции:
'name'
- строка с именем callable функции, например: '\app\SomeClass::someFunction'
;
'params'
- массив с параметрами, которые будут переданы в функцию;
если имя параметра совпадет с полным именем (sql столбец + колонка через точку),
соответствующим одному из значений выборки, то вместо этого
имени будет подставлено значение из выборки базы данных;
'numpad'
- будет произведено дополнение цифрового значения, полученного из базы данных цифрой
0
, в качестве значения должна быть указана длина для автодополнения, например:
6
- любое число с количеством знаков меньше шести будет дополено нолями (000001, 000362, ...);'cut'
- нужно включить данный параметр, если необходимо обрезать строку до заданной в качестве значения
этого параметра длины;
'make_array'
- будет произведено преобразование значения в массив, который будет обработан
и преобразован в строку согласно параметрам:
'explode_by'
- разделитель, который будет использоваться при преобразовании строки
в массив (в случае, если параметр не определен, то по умолчанию используется знак ','
);
'delimiter'
- разделитель для элементов полученного в ходе обработки строки массива
(в случае, если параметр не определен, то по умолчанию используется тег <br />
'swap'
- массив, ключами в котором должны быть значения из строки, которая преобразуется
в массив; значения этого массива 'swap'
, соответствующие искомым, будут потом
преобразованы в строку через 'delimiter'
и возвращены;
'empty'
- если полученное из базы данных значение для данной ячейки является пустым, то
будет применена замена, указанная в качестве значения данного параметра;
'any_int'
- если полученное из базы данных значение будет числом, то будет применена замена,
указанная в качестве значения данного параметра;
'any_string'
- если полученное из базы данных значение будет любой строкой, то будет применена замена,
указанная в качестве значения данного параметра;
'replace' => [
'some_table.some_column' => [
'some_current_value' => 'Да',
'function' => [
'name' => '\app\SomeClass::someFunction',
'params' => [
'some_table.some_column',
'some_param',
'else_param'
]
],
'numpad' => 6,
'cut' => 50,
'make_array' => [
//'explode_by' => ',',
//'delimiter' => '<br />',
'swap' => [
1 => 'some',
2 => 'else',
3 => 'more'
]
],
'empty' => 'пустое значение',
'any_int' => 'число',
'any_string' => 'строка'
],
]
Класс xtables\base\Response
обеспечивает запись в выходной поток данных для их отображения в браузере клиента.
В каждый класс, который вызывается через роуты передается экземпляр класса Response
,
который доступен через свойство $this->response
.
Также он может быть вызван через статическое свойство xTables::$response
.
Могут быть вызваны следующие методы:
Запись любых данных, автоматически добавляется header text/html.
$this->response->write('some data');
Запись json кодированной строки, автоматически добавляется header application/json.
$this->response->json($jsonEncoded);
Кросс доменная передача json кодированной строки, автоматически добавляется header application/javascript.
Для использования данного метода в качестве входного параметра должен быть указан параметр
callback
.
Данный параметр формируется и автоматически посылается при использовании
абсолютных адресов (http, //) в функциях аякс диспетчера (см. AjaxDispatcher).
ajDi::getJs('//domain.ru/some');
/* reply */
$this->response->jsonp($jsonEncoded);
Немедленный переход по указанному адресу с остановкой дальнейшего выполения скрипта.
$this->response->redirect('/some/url');
Добавление кода ответа сервера.
$this->response->setCode(404);
Добавление заголовков. Заголовки добавляются, но не отправляются, что дает
возможность использовать данный метод многократно в разных местах.
Заголовки должны передаваться в массиве: ключи - имена без учета различия заглавных и строчных символов,
значения - значения заголовков.
$this->response->setHeaders([
'content-type' => 'application/javascript'
]);
Реальная отправка заголовков.
$this->response->sendHeaders();
Очистка всех подготовленных к передаче заголовков.
$this->response->clearHeaders();
Добавление заголовка для обновления содержимого без учета кеша браузера.
$this->response->setNoCacheHeader();
Отправка сервером запроса методом POST (используется curl). Метод возвращает ответ, возвращающийся в результате запроса по url.
$this->response->post('//somedomain.com/some/url', [
'param1' => 'value1',
'param2' => 'value2'
]);
Перезагрузка аякс диспетчера, в котором могут быть откорректированы
url и data, которые нужно передать в качестве параметров в этот метод.
Для использования данного метода нужно, чтобы запрос был сделан с клиента с использованием
аякс и аякс диспетчера (здесь это проверяется автоматически).
$this->response->ajDiReload();
$this->response->ajDiReload('/new/url', [
'new_data' => 'some data'
]);
Не предусмотрены.
Класс xtables\base\Router
обеспечивает разбор параметров, поступающих через _GET
, _POST
, _FILES
.
Он также обеспечивает их очистку, через запуск класса xtables\base\Request
.
Осуществляется разбор строки url для запуска соответствующего роута и его метода. Если метод не указан, то по умолчанию будет
вызван метод index
.
404
./config/infoBoxes/404.php
.
Поддерживаются следующие типы роутов:
controller - xtables\base\Home
;
action - index
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод класса (все знаки -
заменяются на _
,
чтобы обеспечить корректные имена методов);
params - параметре в массиве.
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод класса (все знаки -
заменяются на _
,
чтобы обеспечить корректные имена методов);
params - параметры в массиве.
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод класса (все знаки -
заменяются на _
,
чтобы обеспечить корректные имена методов);
params - строка в параметре с именем route_param
(Request::ROUTE_PARAM
).
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод index
;
params - параметре в массиве.
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод index
;
params - параметры в массиве.
controller - соответствующий роуту класс (роуты могут быть добавлены в файле
/config/route-map.json
);
если роут не будет обнаружен, то будет осуществляться поиск на соответствие
имени метода в классе cofing\Home
;
action - метод index
;
params - строка в параметре с именем route_param
(Request::ROUTE_PARAM
).
route-param
может содержать элементы /
в своем составе, все они будут переданы в качестве
параметра и могут быть при необходимости обработаны.
Параметры GET
могут передавать в роутер традиционно, то есть после знака ?
через знак &
либо после роута через знак /
могут быть переданы в виде jsone_encoded и base64_encoded строки.
Все параметры объединяются в единый ассоциативный массив и становятся доступны в объекте
xtables\base\Request
, который передается в конструтор xtables\base\Controller
.
Данный класс является системным классом xTables и не предполагает непосредственного взаимодействия с классами проекта app.
С данным классом взаимодействует лишь главный класс xtables/xTables
Правила домашней страницы могут быть указаны в файле /cofig/homepage-rules.php
.
Настройка осуществляется путем создания роутов.
Добавлять роуты проекта необходимо в файле /config/route-map.php
.
Для обеспечения быстрой работы с учетом специфики приложения применяются только прямые роуты, прямо названные в данном файле.
При установке расширений и обновлениях роуты обновляются автоматически.
"logs": "ext\\logs\\Logs"
Все классы, которые вызваются через роуты и содержат в себе actions, должны расширять
класс xtables\base\Controller
, который получает в свой конструктор экземпляр
класса xtables\base\Request
, включая все входящие параметры в массиве params
.
Для определения уровней доступа нужно переопределить методо accessLevels()
,
который должен возвращать строку с именем доступа или массив с именами доступа. По умолчанию,
если данный метод не переопределен, то устанавливается высший уровень доступа.
xtables\components\auth\Access::FREE
.
use xtables\base\Controller;
use xtables\components\auth\Access;
class SomeClass extends Controller
{
public function accessLevels()
{
return Access::FREE;
}
public function some_action()
{
$some = new SomeClass($this->request);
if ($this->request->isAjDi()) {
// ................
} else {
// ................
}
//$this->request->params;
}
}
Не предусмотрены.
Класс xtables\base\SendMail
обеспечивает отправку писем через SMTP. Для использования класса необходимо
сохранить данные о названии smtp сервера, например: smtp.yandex.ru, названии почтового ящика, через который будут
отправляться письма, и пароле к нему. Для сохранения данных могут использовать встроенные возможности, доступные
по роуту /xtables-settings/mail
. Данные сохраняются в базу данных в таблицу app_service
в зашифрованном виде.
Для отправки почты используется библиотека https://github.com/PHPMailer/PHPMailer
Для использования необходимо создать экзмепляр класса xtables\base\SendMail
.
В конструктор класса могут быть переданы параметры:
dbc
- название подключения к базе данных в пуле подключений; если не указано, то
используется первое подключение в настройках; подключение к базе данных необходимо
в случае, если авторизационные данные для подключения к почте хранятся в базе данных в зашифрованном виде;
это действует только для случаев работы с зарегистрированными пользователями; если необходимо
отправлять почту свободно, то нужно сохранять данные авторизации в файле настроек;
login
- логин к почте, для свободного доступа, когда почта отправляется при отсутствии
авторизованного пользователя;
pass
- пароль к почте, для свободного доступа, когда почта отправляется при отсутствии
авторизованного пользователя;
host
- хост почты, для свободного доступа, когда почта отправляется при отсутствии
авторизованного пользователя, например, smtp.yandex.ru
.
Для отправки письма можно воспользоваться следующими публичными методами класса:
send
- метод только для отправки писем без каких-либо дополнительных функций;
sendNgetReport
- отправляет письма и возвращает массив:
'ok'
- массив адресов, по которым письма отправлены успешно;
'fail'
- массив адресов, отправить письма на которые не удалось.
$limit
- количество адресов, на которые
должны быть отправлены письма (если список состоит из большего количества адресов, то отправка
прерывается).
mailGenerator
- отправляет письма и возвращает через yield
пару ключ/значение
с результатом отправки: 'ok' => address
, 'fail' => address
.$limit
- количество адресов, на которые
должны быть отправлены письма (если список состоит из большего количества адресов, то отправка
прерывается).
mailGenerator()
позволяет получать информацию о каждой отправке
и выполнять после этого какие-то действия, не дожидаясь отправки всех писем целиком.
Настройка осуществляется путем вызова методов:
to()
- в функцию нужно передать массив с почтовыми ящиками получателей либо строка, в которой получатели перечислены через запятую;
subject()
- в функцию нужно передать строку с темой письма;
message()
- в функцию нужно передать строку с содержанием письма;
attach()
- массив со списком путей к файлам (абсолютные пути) или один путь к файлу приложения.
use xtables\base\SendMail;
$mail = new SendMail();
//$mail = new SendMail(['dbc' => 'some_name']);
//$mail = new SendMail([
// 'login' => 'some_login',
// 'pass' => 'some_pass',
// 'host' => 'smtp.yandex_or_other'
//]);
$mail->to('some@mail.ru')->subject('some subject')->message('some message')->attach('/path_to_web_root');
function someFunctionWithMailGenerator($report = []) {
foreach ($mail->mailGenerator as $result => $address) {
if ($result === 'ok') {
// some action
} else {
$report['fail'][] = $address;
}
}
}
Класс xtables\base\Session
обеспечивает работу с сессиями.
proxy()
.
Session::get('some_key'); // static proxy interface
Session::proxy()->get('some_key');
Для работы с сессиями могут использоваться следующие статические интерфейсы:
get()
- получение значения по ключу, если подобный ключ существует в сессии
Session::get('some_name');
set()
- сохранение данных в сессию; может быть передано один ключ и значение либо массив из ключей и значений
Session::set('some_name', 'some_value');
Session::set([
'some_name1' => 'value1',
'some_name2' => 'value2',
'some_name3' => 'value3',
'some_name4' => 'value4'
]);
clear()
- очистка данных сессии; может быть передано как одно, так и несколько значений
Session::clear('some_name');
Session::clear(['some_name1', 'some_name2', 'some_name3']);
Session::clear('some_name1, some_name2, some_name3');
exists()
- проверка наличия ключа в сессии, возвращает true
при нахождении
if (Session::exists('some_name')) {
// some action
}
destroy()
- очистка всех данных сессии
Session::destroy();
Не предусмотрены.
Класс xtables\base\Sheduler
обеспечивает периодическое выполнение функций и файлов через интерфейс командной строки (CLI).
Для работы Sheduler
нужно создать файл-обработчик, который будет запускать данный класс.
В свою очередь необходимо обеспечить периодический запуск данного обработчика, например, по cron, раз в минуту, несколько минут.
Подробнее см. CLI.
Данный класс поддерживает выполнение callable функций и файлов.
Для использования необходимо подключить в файле /config/shedule.json
callable функцию, указав ее имя с учетом namespace, или файл, указав относительный
директории XTABLES_BASE
путь к нему, и определить параметр запуска.
Результаты запуска заданий отражаются в файле /accessory/shedule-report.json
, произошедшие при запуске ошибки -
в общем файле логов /accessory/log.md
.
/accessory/log.md
.
При подключении можно определить параметры запуска. В качестве параметров запуска поддерживаются:
each
- каждый раз при выполнении расписания;
min
- запуск через определенное количество минут, необходимо указать цифру и параметр min, например:
5min
- каждые 5 минут, 30min
- каждые 30 минут, 45min
- каждые 45 минут;
hour
- запуск через определенное количество часов, необходимо указать цифру и параметр hour, например:
1hour
- каждый час, 6hour
- каждые 6 часов;
day
- запуск через определенное количество дней, необходимо указать цифру и параметр day, например:
3day
- каждые 3 дня, 10day
- каждые 10 дней;
daily
- запуск ежедневно в 00 часов;
weekly
- запуск еженедельно в воскресенье в 00 часов;
monthly
- запуск ежемесячно 1 числа в 00 часов.
Пример расписания файла /config/shedule.json
:
{
"/path/to/xtables/base/file.php": "each",
"/path/to/xtables/base/file2.php": "weekly",
"somenamespace\\tocallable::functionName": "3day"
}