====== YALF - Yet Another Lightweight Framework ======
{{:yalflogo.png|}}
===== Навіщо? =====
{{:treba.jpg?600|}}
===== Що включає? =====
* [[nyanorm|NyanORM - для надзручної роботи з БД]]
* [[ubrouting|ubRouting - для забезпечення роботи із зовнішніми даними, їх фільтрацією та раутингом]]
* [[apiastral|Astral - для швидкого прототипування вьюшок]]
* [[ubillingcache|Ubilling Cache - для влаштовування кешування всілякого]]
* [[snmphelper|SNMP helper - для штурхання залізяк і не залізяк в SNMP]]
* [[omaeurl|OmaeURL - для зручної роботи із зовнішніми API та іншими віддаленими URL-ами]]
* [[ubillingtelegram|Telegram API - для базової роботи з ботами Telegram]]
* [[wolfdispatcher|WolfDispatcher - і зручного написання хуків для них]]
* [[stardust|StarDust - для того, щоб зручно менеджити ваші процеси]]
* І ще багато-багато шматочків, які ви раніше бачили і використовували у вигляді Ubilling
===== Системні вимоги =====
**Apache:** >= 2.4\\
**PHP:** >=5.3, 7.0, 7.2, 7.4, 8.2\\
**PHP extensions:** BCMATH CURL GD ICONV MBSTRING MYSQL/MYSQLI PDF SNMP SOAP XML ZIP ZLIB SOCKETS FTP IMAP JSON POSIX PHAR SESSION SIMPLEXML TOKENIZER MEMCACHED\\
**PHP Options:** short_open_tag=on, safe_mode=off, register_globals=off, magic_quotes=off, allow_url_fopen=on
===== Встановлення =====
$ mkdir myapp
$ cd myapp
$ fetch http://yalf.nightfly.in.ua/yalf_current.tgz
$ tar zxvf yalf_current.tgz && rm -fr yalf_current.tgz
$ chmod -R 777 exports content config
===== Початкова конфігурація config/yalf.ini =====
; Main module name from modules/general/
INDEX_MODULE="index"
; Template name to preload from skins/ like "paper", "void", etc...
YALF_SKIN="paper"
; Default application language. Loaded from languages directory.
YALF_LANG="english"
; Allow online language switching by remote clients?
; Now supported locale switching by GET callback like ?yalfswitchlocale=ukrainian
YALF_LANG_SWITCHABLE=0
;Is application global menu rendering enabled?
YALF_MENU_ENABLED=1
; XHProf libs path. Recomended to be masked in production.
XHPROF_PATH="_xhprof"
; Your application logo, name and site URL
YALF_LOGO="skins/yalflogo.png"
YALF_URL="http://yalf.nightfly.in.ua"
YALF_APP="Dummy application"
YALF_TITLE="Application title here"
; Disabled modules list. Separator - comma.
YALF_DISABLED_MODULES=""
; Emulate RCMS users auth and rights system?
YALF_AUTH_ENABLED=0
; Modules which not require any authorization (public modules)
YALF_NO_AUTH_MODULES=""
; Logging emulation. Possible values: fake(output to nowhere), file(output to content/logs/yalflog.log), mysql (YALF_LOG_TABLE table)
YALF_LOGGING_TYPE="fake"
YALF_LOG_TABLE="weblogs"
;Configs editable from web with sysconf module. Comma separated.
YALF_EDITABLE_CONFIGS="config/yalf.ini,config/mysql.ini,config/globalmenu.ini,config/alter.ini"
; List of layers which must be loaded, with their dependencies.
; Format: LAYER_*="lib1,lib2,lib3" will load api/libs/api.lib1.php etc..
LAYER_LOCALE="i18n"
;LAYER_NYANORM="mysql,nyanorm,sqldebug"
;LAYER_CACHE="ubconfig,ubcache"
;LAYER_MAPS="mapscompat,lmaps,ubconfig"
;LAYER_TELEGRAM="telegram,ubconfig"
;LAYER_WHOIS="whois"
;LAYER_SNMP="snmphelper,ubconfig"
;LAYER_ZEN="zenflow"
;LAYER_GRAVATAR="ubconfig,gravatar"
; Renderer layers
LAYER_WEBRENDER="webrender,workicons,astral"
;LAYER_CLIRENDER="clirender"
===== Трішечки детальніше =====
Основним файлом конфігурації для вашого застосунку є вищевказаний **config/yalf.ini**. У принципі, що в ньому відбувається досить самоочевидно, для тих, хто хоч трохи знайомий з парадигмами написання коду та користувацьких модулів для Ubilling. З незначних нововведень ви можете помітити підсистему авторизації, яку можна вимкнути, рушій локалізації, який можна вимкнути, і оптимізовану, а головне керовану, систему попереднього завантаження бібліотек, з кодовою назвою LAYERS_OF_FEAR aka "Шари Страху".
Якщо коротко, то авторизація глобально вмикається-вимикається опцією **YALF_AUTH_ENABLED**. У разі ввімкнення рушія авторизації, всі модулі, крім перерахованих в опції **YALF_NO_AUTH_MODULES** замість власне свого виконання, примусово підмінюються на модуль loginform. Після проходження авторизації користувачем, всередині модулів можуть вже нормально відпрацьовувати перевірки наявності тих чи інших прав на базі cfr(). **Важливо:** за вимкненої системи емуляції авторизації функція cfr() завжди повертатиме true. Власне вимкнення **YALF_AUTH_ENABLED** просто симулюватиме "залогіненість" користувача з рутовими правами. Для перевірки на ввімкнення авторизації, ви завжди можете використовувати
$system->getAuthEnabled()
що повертає boolean.
===== Шари Страху =====
Ви завжди можете оптимізувати завантаження бібліотек з **api/libs/** потрібних вашому додатку за допомогою конструкцій виду **LAYER_* **. Власне, все зводиться до банального перерахування потрібних вам бібліотек для кожного шару через кому, або розкоментуванням потрібних вам уже заготовлених шарів у конфігу за замовчуванням. Тобто, для прикладу, коли вашому застосунку потрібна як робота з MySQL, так і кешування, а також ви, припустімо, зібралися малювати мапи, ви можете просто розкоментувати такі шари в конфізі за замовчуванням:
LAYER_NYANORM="mysql,nyanorm"
LAYER_CACHE="ubconfig,ubcache"
LAYER_MAPS="mapscompat,lmaps,ubconfig"
Або окремо перерахувати це у вашому особистому шарі бібліотек, наприклад якось так:
LAYER_MYAWESOMEAPP="mysql,nyanorm,ubconfig,ubcache,mapscompat,lmaps"
Слід зауважити, що не варто побоюватися повторення бібліотек у різних шарах. У будь-якому разі, кожна з них буде завантажена тільки один раз, під час ініціалізації першого ж шару, в якому вона описана. Слід також зауважити, що таке ручне керування бібліотеками, є не обов'язковим, і в разі якщо ви дотримуєтесь [[development|домовленостей що до коду Ubilling]], ваші бібліотеки можуть бути автоматично завантажені з **api/libs/** штатним автолодером класів за їх іменем.
===== Web і CLI застосунки =====
Використовуючи різні шари відображення, такі як LAYER_WEBRENDER або LAYER_CLIRENDER, ви можете нативно, і без особливих зусиль розробляти як Web-орієнтовані, так і CLI додатки. Для нормального сприйняття параметрів з аргументів у CLI ви можете використовувати бібліотеку [[ubrouting|ubRouting]]. Хоча як завжди вас ніхто ні до чого не примушує ;) \\
Давайте для прикладу подивимося, як може працювати простий CLI-додаток, що працює при цьому, скажімо, з [[ubillingcache|кешуванням]] і [[omaeurl|OmaeURL]]. Для цього ми використовуємо такі шари:
LAYER_CLIRENDER="clirender"
LAYER_ADVICEAPP="ubconfig,ubcache,omaeurl"
І власне код, що малює нам у CLI "пораду години":
if (ubRouting::optionCliCount() > 1) {
if (ubRouting::optionCliCheck('get')) {
$getOption = ubRouting::optionCli('get', 'vf');
if ($getOption == 'advice') {
$cache = new UbillingCache();
$cacheTimeout = 3600;
$cacheKey = 'SOMEADVICE';
$currentAdvice = $cache->get($cacheKey, $cacheTimeout);
if (empty($currentAdvice)) {
//need to update cache
$adviceUrl = 'http://ubilling.net.ua/fga/api/random';
$fga = new OmaeUrl($adviceUrl);
$rawAdvice = $fga->response();
if (!empty($rawAdvice)) {
$rawAdvice = @json_decode($rawAdvice, true);
if (!empty($rawAdvice)) {
if (isset($rawAdvice['text'])) {
$currentAdvice = $rawAdvice['text'];
//updating cache
$cache->set($cacheKey, $currentAdvice, $cacheTimeout);
}
}
} else {
show_error(__('Error receiving advice from remote API'));
}
}
show_window(__('Advice of the hour') . ':', zb_TranslitString($currentAdvice));
} else {
show_error(__('No known get value, try "php --get=advice"'));
}
} else {
show_error(__('No known CLI options, try "php --get=advice"'));
}
} else {
show_error(__('Not enought CLI options, try "php --get=advice"'));
}
Усе, тепер ми можемо використовувати наш застосунок із CLI просто ось так:
$ php index.php --get=advice
Advice of the hour:
Raduysia bliat dribnyciam!
$