119 lines
3.4 KiB
PHP
119 lines
3.4 KiB
PHP
<?php
|
||
|
||
namespace App\Libraries\Twig;
|
||
|
||
use Twig\Extension\AbstractExtension;
|
||
use Twig\TwigFunction;
|
||
use Twig\TwigGlobal;
|
||
use App\Models\OrganizationModel;
|
||
use Config\Services;
|
||
|
||
class TwigGlobalsExtension extends AbstractExtension
|
||
{
|
||
public function getFunctions(): array
|
||
{
|
||
return [
|
||
new TwigFunction('get_session', [$this, 'getSession'], ['is_safe' => ['html']]),
|
||
new TwigFunction('get_current_org', [$this, 'getCurrentOrg'], ['is_safe' => ['html']]),
|
||
new TwigFunction('get_alerts', [$this, 'getAlerts'], ['is_safe' => ['html']]),
|
||
new TwigFunction('render_pager', [$this, 'renderPager'], ['is_safe' => ['html']]),
|
||
new TwigFunction('is_active_route', [$this, 'isActiveRoute'], ['is_safe' => ['html']]),
|
||
new TwigFunction('get_current_route', [$this, 'getCurrentRoute'], ['is_safe' => ['html']]),
|
||
];
|
||
}
|
||
|
||
public function getSession()
|
||
{
|
||
return session();
|
||
}
|
||
|
||
public function getCurrentOrg()
|
||
{
|
||
$session = session();
|
||
$activeOrgId = $session->get('active_org_id');
|
||
|
||
if ($activeOrgId) {
|
||
$orgModel = new OrganizationModel();
|
||
return $orgModel->find($activeOrgId);
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
public function getAlerts(): array
|
||
{
|
||
$session = session();
|
||
|
||
$alerts = [];
|
||
$types = ['success', 'error', 'warning', 'info'];
|
||
foreach ($types as $type) {
|
||
if ($msg = $session->getFlashdata($type)) {
|
||
$alerts[] = ['type' => $type, 'message' => $msg];
|
||
}
|
||
}
|
||
|
||
if ($validationErrors = $session->getFlashdata('errors')) {
|
||
foreach ($validationErrors as $error) {
|
||
$alerts[] = ['type' => 'error', 'message' => $error];
|
||
}
|
||
}
|
||
|
||
return $alerts;
|
||
}
|
||
|
||
public function renderPager($pager)
|
||
{
|
||
if (!$pager) {
|
||
return '';
|
||
}
|
||
|
||
return $pager->links();
|
||
}
|
||
|
||
/**
|
||
* Проверяет, является ли текущий маршрут активным
|
||
*/
|
||
public function isActiveRoute($routes, $exact = false): bool
|
||
{
|
||
$currentRoute = $this->getCurrentRoute();
|
||
|
||
if (is_string($routes)) {
|
||
$routes = [$routes];
|
||
}
|
||
|
||
foreach ($routes as $route) {
|
||
if ($exact) {
|
||
// Точное совпадение
|
||
if ($currentRoute === $route) {
|
||
return true;
|
||
}
|
||
} else {
|
||
// Частичное совпадение (начинается с)
|
||
// Исключаем пустую строку, так как она совпадает с любым маршрутом
|
||
if ($route === '') {
|
||
// Для пустого маршрута проверяем только корень
|
||
if ($currentRoute === '') {
|
||
return true;
|
||
}
|
||
} elseif (strpos($currentRoute, $route) === 0) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Получает текущий маршрут без базового URL
|
||
*/
|
||
public function getCurrentRoute(): string
|
||
{
|
||
$uri = service('uri');
|
||
$route = $uri->getRoutePath();
|
||
|
||
// Убираем начальный слеш если есть
|
||
return ltrim($route, '/');
|
||
}
|
||
}
|