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
; 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"
Слід зауважити, що не варто побоюватися повторення бібліотек у різних шарах. У будь-якому разі, кожна з них буде завантажена тільки один раз, під час ініціалізації першого ж шару, в якому вона описана. Слід також зауважити, що таке ручне керування бібліотеками, є не обов'язковим, і в разі якщо ви дотримуєтесь домовленостей що до коду Ubilling, ваші бібліотеки можуть бути автоматично завантажені з api/libs/ штатним автолодером класів за їх іменем.
Використовуючи різні шари відображення, такі як 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! $