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