[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',
        ];