[Sell] Argos CMS / MVC logic less

НОВО!
В includes папката вкарах един helper клас към Mustache, чрез който може да ползвате във вашите темплейти следните темплейтни дефиниции:
* {{#escape}}<b>Hello</b>{{/escape}}
* → Returns: &lt;b&gt;Hello&lt;/b&gt;
*
* {{#nl2br}}Line 1\nLine 2{{/nl2br}}
* → Returns: Line 1<br />Line 2
*
* {{#truncate}}100{{/truncate}}
* → Truncates text to 100 characters with ellipsis (…)
*
* {{#length}}Example text{{/length}}
* → Returns: 12
*
* {{#strip_tags}}<p>Hello</p>{{/strip_tags}}
* → Returns: Hello
*
* {{#trim}} Hello {{/trim}}
* → Returns: Hello
*
* {{#urlencode}}hello [email protected]{{/urlencode}}
* → Returns: hello+world%40example.com
*
* {{#rawurlencode}}/path/space/{{/rawurlencode}}
* → Returns: %2Fpath%2Fspace%2F


Те ще са ви полезни при създаването на форми като контактни, тикет и т.н. Виждате примерите и няма да дам повече информация за тях, защото това е достатъчно. Не може да ги ползвате в темплейтите на екстеншъните, само в templates/ папката!
Може да се допълни в бъдеще с още полезни неща, но засега ще са тези. За мен лично са полезни.
 
Продължавам да си играя с Админ панела. Добавих функция, която парсва фийда на fakti.bg (известния български сайт за новини).
Функцията проверява дали сте с български език или с друг, ако сте с друг превеждам новиние с rss app (https://rss.app/feeds/5XJAdYWRlICLBeys.xml) от bg на en. (Не мога да дам гаранция за този сайт, но има безплатен абонамент и засега се вписва добре като преводач, но да видим линка колко време ще е активен)
Функцията работи с php fast cache и кешира новините за 1 час в хранилището. След 1 час ще ги извлече отново (опресни)
Бутона за новините се намира до заглавката най-горе в ляво и когато се кликне, се отваря бокс с всички новини, а бутона гладко пада по-надолу, ако го кликнете отново бокса ще се скрие.

Целта е админ панела да е наистина полезен и всичко да е вътре, за да се чувствате добре докато поддържате сайта си или сайтовете си (ако имате няколко)

Снимка:
 
12.9:

Нови ъпдейти:
- Пълно аяксицифиране на админ панела (КРАЙ с досадните рефрешвания, за да видите актуално съдържание след редакциите)
- Фикснат бъг с логаута в админ панела. (Най-горе в падащото меню в дясно)
- Добавени са RSS емисии в админ панела, за да следите новините около света
- Добавени са нови custom helper-и в mustache (includes/Mustache_Helpers.php)
- Добавено е ново мини сайд меню в админ панела и опция за запомняне на изобра (свито или разгърнато)

По-стари ъпдейти свързани с 12.9:
- Оправен е цвета 128 128 128 (Grey) на 0 64 0 (Dark Grey) при функцията за но аватарите с цвят по първатта буква. Иначе не се четеше текста, ако съвпаднат.
- Добавена е нова функция sql_escape (може да потрябва някой път за нещо не-толкова важно), ползва $pdo->quote(), обвивка.
- Добавено е балонче в дясно в админ панела с цел по-бърз достъп до къстъм страниците от екстеншъните.
- Нови промени в помощната функция за страницирането с цел по-добро прихващане на url сегменти.
- Добавен е кеш в translate() функцията с цел по-бързо зареждане на системата.
- Добавени са phpDOC коментари в App/Entity.
- 3 библиотеки бяха ъпдейтнати през composer.
- В PW Manager-a в админ панела е добавена js функция през бутон за генериране на случайни силни пароли.
- Изкарано е потребителското АЙПИ + Флаг на държава в индекс страницата на админ панела (за ваше улеснение)
- Махнати са IP Api-тата и са заменени от нова локална библиотека + GeoIP Maxmind free базаданни.
- Фикснат е бъг с но аватарите, не се е изобразявала кирилицата, вече е оправено.
- Добавен е нов шрифт за каптчата и за но-аватарите.
- Изцяло нова логика за бележките в админ панела. (Вече пътя към тях е с уникален md5 в имената им)
- Фиксната е грешката в индекса в админ панела ("Uncaught TypeError: google.visualization.DataTable is not a constructor(…)) - От нея не е могло да скрива правилно страниците при къстъм достъпа (само в индекса). Вече е ОК!
- Добавен е нов слайдър с времето, махната е старата accuweather библиотека, която товареше...
- Добавена е нова функция getCityCoordinates($country_code), връща longitude/latitude и име на столица.
- Добавена е нова функция base_dir_url(), чрез която ще фикснем това Аргос да може да се инсталира в под папка. (Има промени по темплейтите), Сменя се само мета тага с този:
Code:
<base href="{{base_dir_url}}/">
най-горе в header.html
- Промени в readme.

Общо взето 12.9 е готова, остава да завърша и 13.0. Където ще има изцяло нов дефолт стил и индентация на кода.
След което мисля да спра с ъпдейтите по ядрото, докато не премина на PHP 8.4.
В същото време, ако някой закупи системата може да открие нещо и аз ще го оправя бързо, ако се открие някакъв бъг или разминаване!

Това е една много стабилна версия на ядрото, защото почти всичко е преминало през ръцете ми.
За връзка с мен:
Discord: .pok4
Цена на ядрото: 140 лв.
 
Имам новина :)
Както знаете в екстеншъните не можеше да се ползват global темплейтните дефиниции от includes/global_vars.php, трябваше да се предефинират с php. Същото се отнасяше и за новите helper-и.
Е, новината е такава, че вече може да си ги ползвате в екстеншънските темплейти без никакъв проблем. Всичко работи повече от добре.
С бота си поиграхме малко и го напаснахме така, че да не мърда (haha)
Също така добавих още Lambda helper-и, и те са:
Code:
            // Base64 encode
            'base64' => fn($text) => base64_encode($text),
            
            // Time ago helper
            'timeago' => fn($timestamp) => timeago($timestamp),

Днес бях зает, но тези дни ще направя още някои малки промени по админ панела.
Засега всичко е ТОК И ЖИЦА!
 
Здравейте,
Разцепих js_libs.html от admin/ папката. Беше много голям и беше пълен с Js код. Преместил съм всеки код по админските страници, които се отнасят за него.
Оставил съм само базов код там и малко от конфигурацията...
Мисля, че така е по-добре.

Също така вече в екстеншъните може да ползвате всички lang_ дефиниции без предефиниране (както написах по-горе, може да ползвате глобалните темплейт дефиниции и helper-ите) Тоест - $lang_sys, $global_vars и $helpers са прекарани през $this->m (рендера на mustache в екстеншъните)
Мога да предам и $event_dispatcher-a, но не виждам смисъл. Не знам и как точно ще работи, за това се отказах от това... Писал съм го TODO, ако някога ми се наложи да прекарам темплейтна дефиниция от папката templates/ в екстеншън може и да пробвам... Просто на този етап съм объркан и не мога да преценя дали си струва. За това ако ми се наложи ще го активирам и него...

Сега пак ще трябва да тествам админ панела, за да съм сигурен, че всичко работи. Ще съобщя в следващ пост дали всичко е ОК!
 
Завърших и lambda helper-ите, добавени са още:
Code:
            // Format timestamp as DD-MM-YYYY
            'date_dmy' => fn($ts) => date('d-m-Y', (int)$ts),

            // Remove non-alphanumeric characters
            'alphanumeric' => fn($text) => preg_replace('/[^a-zA-Z0-9]+/', '', $text),

            // Convert URLs to clickable links
            'linkify' => fn($text) => preg_replace('~(https?://[^\s]+)~', '<a href="$1" target="_blank">$1</a>', $text),

            // JSON encode
            'json_encode' => fn($text) => json_encode($text, JSON_UNESCAPED_UNICODE),

            // JSON decode (returns value only if scalar)
            'json_decode' => fn($text) => is_scalar(json_decode($text, true)) ? json_decode($text, true) : '',

            // Is only letters
            'is_alpha' => fn($text) => ctype_alpha($text) ? 'true' : 'false',

            // Is only alphanumeric
            'is_alnum' => fn($text) => ctype_alnum($text) ? 'true' : 'false',

            // Is empty string
            'is_empty' => fn($text) => trim($text) === '' ? 'true' : 'false',

            // MD5 hash
            'md5' => fn($text) => md5($text),

            // SHA1 hash
            'sha1' => fn($text) => sha1($text),

            // Lowercase
            'lower' => fn($text) => mb_strtolower($text, 'UTF-8'),

            // Uppercase
            'upper' => fn($text) => mb_strtoupper($text, 'UTF-8'),

            // Capitalize first letter
            'ucfirst' => fn($text) => mb_strtoupper(mb_substr($text, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($text, 1, null, 'UTF-8'),

            // Capitalize each word
            'ucwords' => fn($text) => mb_convert_case($text, MB_CASE_TITLE, 'UTF-8'),

            // Is valid email
            'is_email' => fn($text) => filter_var($text, FILTER_VALIDATE_EMAIL) ? 'true' : 'false',

            // Is numeric
            'is_numeric' => fn($text) => is_numeric($text) ? 'true' : 'false',

            // Is valid URL
            'is_url' => fn($text) => filter_var($text, FILTER_VALIDATE_URL) ? 'true' : 'false',

Тях може да ги ползвате по темплейти и екстеншъни. Полезни са много. Ето го и пълния списък:
Code:
        return [
            // Escape HTML
            'escape' => fn($text) => htmlspecialchars($text, ENT_QUOTES, 'UTF-8'),

            // Convert newlines to <br />
            'nl2br' => fn($text) => nl2br($text),

            // Truncate to 100 characters with ellipsis
            'truncate' => fn($text) => mb_strimwidth($text, 0, 100, '...'),

            // String length
            'length' => fn($text) => (string)mb_strlen($text, 'UTF-8'),

            // Strip HTML tags
            'strip_tags' => fn($text) => strip_tags($text),

            // Trim whitespace
            'trim' => fn($text) => trim($text),

            // URL encoding
            'urlencode' => fn($text) => urlencode($text),

            // Raw URL encoding
            'rawurlencode' => fn($text) => rawurlencode($text),

            // Base64 encoding
            'base64' => fn($text) => base64_encode($text),

            // Human-readable "time ago"
            'timeago' => fn($timestamp) => timeago($timestamp),

            // Format timestamp as DD-MM-YYYY
            'date_dmy' => fn($ts) => date('d-m-Y', (int)$ts),

            // Remove non-alphanumeric characters
            'alphanumeric' => fn($text) => preg_replace('/[^a-zA-Z0-9]+/', '', $text),

            // Convert URLs to clickable links
            'linkify' => fn($text) => preg_replace('~(https?://[^\s]+)~', '<a href="$1" target="_blank">$1</a>', $text),

            // JSON encode
            'json_encode' => fn($text) => json_encode($text, JSON_UNESCAPED_UNICODE),

            // JSON decode (returns value only if scalar)
            'json_decode' => fn($text) => is_scalar(json_decode($text, true)) ? json_decode($text, true) : '',

            // Is only letters
            'is_alpha' => fn($text) => ctype_alpha($text) ? 'true' : 'false',

            // Is only alphanumeric
            'is_alnum' => fn($text) => ctype_alnum($text) ? 'true' : 'false',

            // Is empty string
            'is_empty' => fn($text) => trim($text) === '' ? 'true' : 'false',

            // MD5 hash
            'md5' => fn($text) => md5($text),

            // SHA1 hash
            'sha1' => fn($text) => sha1($text),

            // Lowercase
            'lower' => fn($text) => mb_strtolower($text, 'UTF-8'),

            // Uppercase
            'upper' => fn($text) => mb_strtoupper($text, 'UTF-8'),

            // Capitalize first letter
            'ucfirst' => fn($text) => mb_strtoupper(mb_substr($text, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($text, 1, null, 'UTF-8'),

            // Capitalize each word
            'ucwords' => fn($text) => mb_convert_case($text, MB_CASE_TITLE, 'UTF-8'),

            // Is valid email
            'is_email' => fn($text) => filter_var($text, FILTER_VALIDATE_EMAIL) ? 'true' : 'false',

            // Is numeric
            'is_numeric' => fn($text) => is_numeric($text) ? 'true' : 'false',

            // Is valid URL
            'is_url' => fn($text) => filter_var($text, FILTER_VALIDATE_URL) ? 'true' : 'false',
        ];
 
Покрай ъпдейтите, които направих вече не е нужно да предефинирате екстеншънските езикови файлове, пример:
Code:
              'ext_gmon_warning_vip_packages'=>$this->lang['ext_gmon_warning_vip_packages'],
              'ext_gmon_report_explain'=>$this->lang['ext_gmon_report_explain'],
              'ext_gmon_claim_explain'=>$this->lang['ext_gmon_claim_explain'],
              'ext_gmon_claim_explain2'=>$this->lang['ext_gmon_claim_explain2'],
              'ext_gmon_canceled'=>$this->lang['ext_gmon_canceled'],
              'ext_gmon_cancel'=>$this->lang['ext_gmon_cancel'],
              'ext_gmon_accept'=>$this->lang['ext_gmon_accept'],
              'ext_gmon_banned'=>$this->lang['ext_gmon_banned'],
              'ext_gmon_remove_ban'=>$this->lang['ext_gmon_remove_ban'],
              'ext_gmon_ban_server'=>$this->lang['ext_gmon_ban_server'],
              'ext_gmon_delete_server'=>$this->lang['ext_gmon_delete_server'],
              'ext_gmon_last_update'=>$this->lang['ext_gmon_last_update'],
              'ext_gmon_owner'=>$this->lang['ext_gmon_owner'],
Това вече е отживелица, защото с вкарването на $lang_sys автоматично ще могат да се викат в темплейтите и няма нужда да ги викате в екстеншъна. Директно си ги ползвате с mustache {{ext_gmon_owner}}. :)
Като ми остане повече време ще ъпдейтна темата как да пишем екстеншъни.
 
Last edited:
НОВО!
Вкарана е нова функция: get_user_groups_by_id($user_id) - връща в масив групите в които дадения потребител членува + цвета им.
Добавен е нов Entity клас - Notification Manager, чрез него може да разпращате нотификации към потребителите, добавил съм му и транслейт функцията.
В екстеншъните:
Code:
  * // Send global notification
 * $this->notification->addNotification(0, 'test.', true);
 * // Send specific notification
 * $this->notification->addNotification(2, 'test.');
 * // Get user notifications by user_id and the second option is limit
 * $this->notification->getNotifications(2, 2);
 * // Get all global notifications (the integer is limit)
 * $this->notification->getGlobalNotifications(2);
 * // Get all notifications for user and global (the firs integer is userid and the second is limit)
 * $this->notification->getAllNotifications(2,2);
 * // Delete specific notification by notification_id
 * $this->notification->deleteNotification(1);
 * // Delete all notifications for user by user_id
 * $this->notification->clearUserNotifications(2);
 * // Get all notifications with pagination (user id, results per page, per side, get parameter name)
 * $this->notification->getAllNotificationsPaginated(2,2,3,'npage')['notifications']; //print the results within array
 * $this->notification->getAllNotificationsPaginated(2,2,3,'npage')['pagination']; //print pagination pages

Нотификейшън мениджъра е тестван от мен на phpbb 3.3.15 и работи отлично!
Работи с phpbb_notifications таблицата.
 
Last edited:
Добавени са още глобални променливи:
Code:
    'user_email' => fn() => $phpBB->get_user_email(),
    'user_warnings' => fn() => $phpBB->get_user_warnings(),
    'user_regdate' => fn() => $phpBB->get_user_regdate(),

Добавена са и нови функции:
Code:
add_to_users_table($column_name,$column_type);
Пример:
Code:
add_to_users_table("price2","varchar(255)");
Защо ни е? Ами много просто, после може да се вземе с $user->data['price2']; през сесията.

Другата нова функция е:
Code:
update_users_table_column($user_id, $column_name, $value);
пример:
Code:
update_users_table_column(2, price2, 15);
Според примера, ъпдейтваме price2 колоната на user с потребителско айди 2 с 15. Това 15 може да са стойност в заредени кредити/пари.

Мисля, че това ще се впише идеално в екстеншъните.
 
Днес реших да тествам къстъм достъпа до определени страници с демо потребител. Да, достъпът се дава, но реално аякс заявките не работеха и дефакто потребителя не можеше да прави почти нищо. За това оправих функцията, която дава достъпа, така, че да работи. Също и бележките в хоум страницата не работеха. Всичко вече е оправено.
Също така съм разширил текстареата с бележките, че седеше свита, сега е колкото първия бокс от ляво на дясно.
Също така съм добавил и кои админи са онлайн в админ панела, демо: https://i.ibb.co/QFV6YZKB/image.png (показват се и потребителите с къстъм достъп)
Така винаги ще знаете кой е до 'вас'. :)
 
Нови 2 функции са добавени:
Code:
add_user_in_group($user_id,$group_id);
remove_user_from_group($user_id,$group_id);

с тях може да вкарвате и изкарвате хора от определени групи в phpbb3.
Знам, че phpbb има вградена функция, но реших да ги изпиша и отделно, за да са си във functions.php на системата + PHPDOC коментари и т.н.

Мисля, че вече всичко е ОК, остава да интегрирам темплейта само и това е... Повече не се сещам какво може да се направи. Ще ви държа в течение :)
 
Утре ще имам още малко работа, днес я довърших, а утре ще бъде интегрирано.
Става дума за възможност да викате аякс заявки директно от темплейта ви.
Трябва да достъпвате този url: https://your-site.com/ajax/style
И да създадете ajax.php в папката на вашия темплейт с подобно съдържание:
Code:
<?php
namespace Style;

class Style extends \App\Controllers\BaseController
{
    public function __construct()
    {
        parent::__construct();
    }

    public function Ajax()
    {
        if (is_ajax()) {
            if (isset($_POST['username'])) {
                echo $this->username;
            }

            if (isset($_POST['myform'])) {
                echo $this->myform();
            }
        }
    }

    public function myform()
    {
        return alert('success', $this->lang['lang_success']);
    }
}
Това е примерно съдържание, само да се ориентирате
Може да викате всичко от системата, функции, entity класове и т.н.

Другото е, че бота ми написа wrapper за Nette Utils, която и без това е в системата заради емейл библиотеката и ще го прасна в Entity папката. Полезен е, има доста неща...

Това ще е май последно..
 
Още малко:
- Оптимизации в get_user_ava функцията
- Добавен е ErrorHandler клас, който представя грешките в Аргос в по-четлив и стилизиран вид. (500 грешките)

Правя бекъп и спирам докато не завърша темплейта и не мина след това на PHP 8.4.
 
от няколко дена следя какво правиш, впечатлен съм и доста, евала Г-н Сашев, иска ми се да видя демо на всичко това
 
Здравей, мерси за което.
Утре по някое време ще ти драсна лс с линк към демо и профил, за да разгледаш админ панела.