Зміст

YALF - Yet Another Lightweight Framework

Навіщо?

Що включає?

Системні вимоги

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.biz/yalf_current.tgz
$ tar zxvf yalf_current.tgz && rm -fr yalf_current.tgz
$ chmod -R 777 exports content config

Початкова конфігурація config/yalf.ini

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.biz"
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"

Слід зауважити, що не варто побоюватися повторення бібліотек у різних шарах. У будь-якому разі, кожна з них буде завантажена тільки один раз, під час ініціалізації першого ж шару, в якому вона описана. Слід також зауважити, що таке ручне керування бібліотеками, є не обов'язковим, і в разі якщо ви дотримуєтесь домовленостей що до коду Ubilling, ваші бібліотеки можуть бути автоматично завантажені з api/libs/ штатним автолодером класів за їх іменем.

Web і CLI застосунки

Використовуючи різні шари відображення, такі як LAYER_WEBRENDER або LAYER_CLIRENDER, ви можете нативно, і без особливих зусиль розробляти як Web-орієнтовані, так і CLI додатки. Для нормального сприйняття параметрів з аргументів у CLI ви можете використовувати бібліотеку ubRouting. Хоча як завжди вас ніхто ні до чого не примушує ;)

Давайте для прикладу подивимося, як може працювати простий CLI-додаток, що працює при цьому, скажімо, з кешуванням і 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!
$