/home/kawkavbilling/htdocs/billing.kawkav.com/themes/huraga/html_custom/mod_order_index.html.twig
visits /order directly without a pre-selected product. Renders a
categorised, hero-led shopping experience inside the kawkav shell.
════════════════════════════════════════════════════════════════════ #}
{% extends request.ajax ? "layout_blank.html.twig" : "layout_default.html.twig" %}
{% import "macro_functions.html.twig" as mf %}
{% block meta_title %}{{ 'Choose a service'|trans }}{% endblock %}
{% block body_class %}order-index kw-order-catalog{% endblock %}
{% block breadcrumb %}
<li class="active breadcrumb-item" aria-current="page">{{ 'Order'|trans }}</li>
{% endblock %}
{% block content_before %}{% endblock %}
{% block content %}
{# ─── If a product is in the query, send the user straight to the focused page ─── #}
{% if request.product %}
{% set _redirect_product = guest.product_get({"id": request.product}) %}
{% if _redirect_product.slug %}
<script>window.location.replace("{{ 'order'|link }}/{{ _redirect_product.slug }}");</script>
{% endif %}
{% endif %}
{# ─── Build classification map ─────────────────────────────────────── #}
{% set all_products = guest.product_get_list.list %}
{% set groups = {
'domains': { 'title': 'Domains', 'icon': '🌐', 'tone': 'amber', 'desc': 'Register, transfer & manage your own kawkav-managed domain.', 'priority': 1 },
'webhosting': { 'title': 'Web Hosting', 'icon': '🚀', 'tone': 'green', 'desc': 'Managed NVMe hosting — fast, secure, EU data-residency.', 'priority': 2 },
'email': { 'title': 'Email Hosting', 'icon': '📧', 'tone': 'cyan', 'desc': 'Professional inbox on your own domain — anti-spam included.', 'priority': 3 },
'vps': { 'title': 'VPS & Containers', 'icon': '🖥', 'tone': 'violet', 'desc': 'KVM virtual servers and Docker container hosting.', 'priority': 4 },
'apps': { 'title': 'App Hosting', 'icon': '📦', 'tone': 'violet', 'desc': 'One-click managed deploys — WordPress, Nextcloud, Gitea & more.', 'priority': 5 },
'ai_apps': { 'title': 'AI Applications', 'icon': '🤖', 'tone': 'ai', 'desc': 'Self-hosted AI — local LLMs, chat UIs, RAG, agents.', 'priority': 6 },
'aibuilder': { 'title': 'AI Builder', 'icon': '🧠', 'tone': 'ai', 'desc': 'Sovereign AI Builder — your own bolt.diy + Git workspace.', 'priority': 7 },
'selfhosted': { 'title': 'Self-hosted Tools', 'icon': '🛡', 'tone': 'green', 'desc': 'VPN, DNS ad-blockers, smart-home — your data on your tenant.', 'priority': 8 }
} %}
{# Classify every product into one of the buckets above #}
Arguments
"An exception has been thrown during the rendering of a template ("Product not found") in "mod_order_index.html.twig" at line 23."
/home/kawkavbilling/htdocs/billing.kawkav.com/modules/Product/Api/Guest.php
* @throws \FOSSBilling\Exception
*/
public function get($data)
{
if (!isset($data['id']) && !isset($data['slug'])) {
throw new \FOSSBilling\Exception('Product ID or slug is missing');
}
$id = $data['id'] ?? null;
$slug = $data['slug'] ?? null;
$service = $this->getService();
if ($id) {
$model = $service->findOneActiveById($id);
} else {
$model = $service->findOneActiveBySlug($slug);
}
if (!$model instanceof \Model_Product) {
throw new \FOSSBilling\Exception('Product not found');
}
return $service->toApiArray($model);
}
/**
* Get paginated list of product categories.
*
* @return array
*/
public function category_get_list($data)
{
$data['status'] = 'enabled';
$service = $this->getService();
[$sql, $params] = $service->getProductCategorySearchQuery($data);
$per_page = $data['per_page'] ?? $this->di['pager']->getDefaultPerPage();
$pager = $this->di['pager']->getPaginatedResultSet($sql, $params, $per_page);
foreach ($pager['list'] as $key => $item) {
$category = $this->di['db']->getExistingModelById('ProductCategory', $item['id'], 'Product category not found');
$pager['list'][$key] = $this->getService()->toProductCategoryApiArray($category, true, $this->getIdentity());
Arguments
/home/kawkavbilling/htdocs/billing.kawkav.com/library/Api/Handler.php
}
$bb_mod = $this->di['mod']($mod);
$api->setDi($this->di);
$api->setMod($bb_mod);
$api->setIdentity($this->identity);
$api->setIp($this->di['request']->getClientIp());
if ($bb_mod->hasService()) {
$api->setService($this->di['mod_service']($mod));
}
if (!method_exists($api, $method_name) || !is_callable([$api, $method_name])) {
$reflector = new ReflectionClass($api);
if (!$reflector->hasMethod('__call')) {
throw new FOSSBilling\Exception(':type API call :method does not exist in module :module', [':type' => ucfirst($this->type), ':method' => $method_name, ':module' => $mod], 740);
}
}
return $api->{$method_name}($arguments);
}
}
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Extension/CoreExtension.php
if ($isDefinedTest) {
return false;
}
if ($propertyNotAllowedError) {
throw $propertyNotAllowedError;
}
throw $e;
}
}
if ($isDefinedTest) {
return true;
}
// Some objects throw exceptions when they have __call, and the method we try
// to call is not supported. If ignoreStrictCheck is true, we should return null.
try {
$ret = $object->$method(...$arguments);
} catch (\BadMethodCallException $e) {
if ($call && ($ignoreStrictCheck || !$env->isStrictVariables())) {
return;
}
throw $e;
}
return $ret;
}
/**
* Returns the values from a single column in the input array.
*
* <pre>
* {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %}
*
* {% set fruits = items|column('fruit') %}
*
* {# fruits now contains ['apple', 'orange'] #}
* </pre>
/home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php
* @return iterable<null|scalar|\Stringable>
*/
public function block_content_before(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
yield from [];
}
// line 20
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_content(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
// line 22
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["request"] ?? null), "product", [], "any", false, false, false, 22)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 23
yield " ";
$context["_redirect_product"] = CoreExtension::getAttribute($this->env, $this->source, ($context["guest"] ?? null), "product_get", [["id" => CoreExtension::getAttribute($this->env, $this->source, ($context["request"] ?? null), "product", [], "any", false, false, false, 23)]], "method", false, false, false, 23);
// line 24
yield " ";
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["_redirect_product"] ?? null), "slug", [], "any", false, false, false, 24)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 25
yield " <script>window.location.replace(\"";
yield $this->extensions['Box_TwigExtensions']->twig_bb_client_link_filter("order");
yield "/";
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, ($context["_redirect_product"] ?? null), "slug", [], "any", false, false, false, 25), "html", null, true);
yield "\");</script>
";
}
}
// line 28
yield "
";
// line 30
$context["all_products"] = CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, ($context["guest"] ?? null), "product_get_list", [], "any", false, false, false, 30), "list", [], "any", false, false, false, 30);
// line 31
yield "
";
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
{
if ($useBlocks && isset($blocks[$name])) {
$template = $blocks[$name][0];
$block = $blocks[$name][1];
} elseif (isset($this->blocks[$name])) {
$template = $this->blocks[$name][0];
$block = $this->blocks[$name][1];
} else {
$template = null;
$block = null;
}
// avoid RCEs when sandbox is enabled
if (null !== $template && !$template instanceof self) {
throw new \LogicException('A block must be a method on a \Twig\Template instance.');
}
if (null !== $template) {
try {
yield from $template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Throwable $e) {
$e = new RuntimeError(\sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
$e->guess();
throw $e;
}
} elseif ($parent = $this->getParent($context)) {
yield from $parent->unwrap()->yieldBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this);
/home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php
";
// line 153
yield from $this->unwrap()->yieldBlock('content_before', $context, $blocks);
// line 154
yield "
<div class=\"content-block\" role=\"main\">
";
// line 156
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["settings"] ?? null), "show_breadcrumb", [], "any", false, false, false, 156)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 157
yield " ";
yield from $this->unwrap()->yieldBlock('breadcrumbs', $context, $blocks);
// line 167
yield " ";
}
// line 168
yield "
";
// line 169
yield from $this->unwrap()->yieldBlock('content', $context, $blocks);
// line 170
yield "
";
// line 171
yield Twig\Extension\CoreExtension::include($this->env, $context, "partial_message.html.twig");
yield "
";
// line 173
yield from $this->unwrap()->yieldBlock('content_after', $context, $blocks);
// line 174
yield " </div>
<div id=\"push\"></div>
</div>
</div>
</main>
";
// line 181
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
{
if ($useBlocks && isset($blocks[$name])) {
$template = $blocks[$name][0];
$block = $blocks[$name][1];
} elseif (isset($this->blocks[$name])) {
$template = $this->blocks[$name][0];
$block = $this->blocks[$name][1];
} else {
$template = null;
$block = null;
}
// avoid RCEs when sandbox is enabled
if (null !== $template && !$template instanceof self) {
throw new \LogicException('A block must be a method on a \Twig\Template instance.');
}
if (null !== $template) {
try {
yield from $template->$block($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($template->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Throwable $e) {
$e = new RuntimeError(\sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
$e->guess();
throw $e;
}
} elseif ($parent = $this->getParent($context)) {
yield from $parent->unwrap()->yieldBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this);
/home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php
yield $this->extensions['FOSSBilling\TwigExtensions\DebugBar']->renderHead();
yield "
";
// line 43
yield from $this->unwrap()->yieldBlock('head', $context, $blocks);
// line 44
yield " ";
yield from $this->unwrap()->yieldBlock('js', $context, $blocks);
// line 45
yield "</head>
<body class=\"kw-body ";
// line 47
yield from $this->unwrap()->yieldBlock('body_class', $context, $blocks);
yield "\">
";
// line 49
yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
// line 260
yield "
";
// line 261
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["settings"] ?? null), "inject_javascript", [], "any", false, false, false, 261)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 262
yield " <script>
";
// line 263
yield CoreExtension::getAttribute($this->env, $this->source, ($context["settings"] ?? null), "inject_javascript", [], "any", false, false, false, 263);
yield "
</script>
";
}
// line 266
yield "
<script>
/* Product translation overlay — fetches the per-locale sidecar JSON and
substitutes [data-kw-prod-i18n=\"slug.field\"] nodes. English source is
left intact so missing keys fall back automatically. */
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
}
$content = '';
foreach ($this->yield($context) as $data) {
$content .= $data;
}
return $content;
}
/**
* @return iterable<scalar|\Stringable|null>
*/
public function yield(array $context, array $blocks = []): iterable
{
$context += $this->env->getGlobals();
$blocks = array_merge($this->blocks, $blocks);
try {
yield from $this->doDisplay($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($this->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Throwable $e) {
$e = new RuntimeError(\sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
$e->guess();
throw $e;
}
}
/home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php
'content_before' => [$this, 'block_content_before'],
'content' => [$this, 'block_content'],
'sidebar2' => [$this, 'block_sidebar2'],
'js' => [$this, 'block_js'],
];
}
protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
{
// line 7
return $this->load((((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["request"] ?? null), "ajax", [], "any", false, false, false, 7)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) ? ("layout_blank.html.twig") : ("layout_default.html.twig")), 7);
}
protected function doDisplay(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
// line 8
$macros["mf"] = $this->macros["mf"] = $this->load("macro_functions.html.twig", 8)->unwrap();
// line 7
yield from $this->getParent($context)->unwrap()->yield($context, array_merge($this->blocks, $blocks));
}
// line 10
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_meta_title(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(__trans("Choose a service"), "html", null, true);
yield from [];
}
// line 12
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_body_class(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
}
$content = '';
foreach ($this->yield($context) as $data) {
$content .= $data;
}
return $content;
}
/**
* @return iterable<scalar|\Stringable|null>
*/
public function yield(array $context, array $blocks = []): iterable
{
$context += $this->env->getGlobals();
$blocks = array_merge($this->blocks, $blocks);
try {
yield from $this->doDisplay($context, $blocks);
} catch (Error $e) {
if (!$e->getSourceContext()) {
$e->setSourceContext($this->getSourceContext());
}
// this is mostly useful for \Twig\Error\LoaderError exceptions
// see \Twig\Error\LoaderError
if (-1 === $e->getTemplateLine()) {
$e->guess();
}
throw $e;
} catch (\Throwable $e) {
$e = new RuntimeError(\sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
$e->guess();
throw $e;
}
}
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
{
return $this;
}
/**
* Returns all blocks.
*
* This method is for internal use only and should never be called
* directly.
*
* @return array An array of blocks
*/
public function getBlocks(): array
{
return $this->blocks;
}
public function display(array $context, array $blocks = []): void
{
foreach ($this->yield($context, $blocks) as $data) {
echo $data;
}
}
public function render(array $context): string
{
if (!$this->useYield) {
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php
}
public function display(array $context, array $blocks = []): void
{
foreach ($this->yield($context, $blocks) as $data) {
echo $data;
}
}
public function render(array $context): string
{
if (!$this->useYield) {
$level = ob_get_level();
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Throwable $e) {
while (ob_get_level() > $level) {
ob_end_clean();
}
throw $e;
}
return ob_get_clean();
}
$content = '';
foreach ($this->yield($context) as $data) {
$content .= $data;
}
return $content;
}
/**
/home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/TemplateWrapper.php
/**
* @return iterable<scalar|\Stringable|null>
*/
public function stream(array $context = []): iterable
{
yield from $this->template->yield($context);
}
/**
* @return iterable<scalar|\Stringable|null>
*/
public function streamBlock(string $name, array $context = []): iterable
{
yield from $this->template->yieldBlock($name, $context);
}
public function render(array $context = []): string
{
return $this->template->render($context);
}
/**
* @return void
*/
public function display(array $context = [])
{
// using func_get_args() allows to not expose the blocks argument
// as it should only be used by internal code
$this->template->display($context, \func_get_args()[1] ?? []);
}
public function hasBlock(string $name, array $context = []): bool
{
return $this->template->hasBlock($name, $context);
}
/**
* @return string[] An array of defined template block names
*/
/home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/AppClient.php
/**
* @param string $fileName
*/
public function render($fileName, $variableArray = [], $ext = 'html.twig'): string
{
try {
$template = $this->getTwig()->load(Path::changeExtension($fileName, $ext));
} catch (Twig\Error\LoaderError $e) {
$this->di['logger']->setChannel('routing')->info($e->getMessage());
http_response_code(404);
throw new FOSSBilling\InformationException('Page not found', null, 404);
}
if ("{$fileName}.{$ext}" == 'mod_page_sitemap.xml') {
header('Content-Type: application/xml');
}
return $template->render($variableArray);
}
protected function getTwig(): Twig\Environment
{
$service = $this->di['mod_service']('theme');
$code = $service->getCurrentClientAreaThemeCode();
$theme = $service->getTheme($code);
$settings = $service->getThemeSettings($theme);
$loader = new Box_TwigLoader(
[
'mods' => PATH_MODS,
'theme' => Path::join(PATH_THEMES, $code),
'type' => 'client',
]
);
$twig = $this->di['twig'];
$twig->setLoader($loader);
/home/kawkavbilling/htdocs/billing.kawkav.com/modules/Order/Controller/Client.php
$this->di = $di;
}
public function getDi(): ?\Pimple\Container
{
return $this->di;
}
public function register(\Box_App &$app)
{
$app->get('/order', 'get_products', [], static::class);
$app->get('/order/service', 'get_orders', [], static::class);
$app->get('/order/:id', 'get_configure_product', ['id' => '[0-9]+'], static::class);
$app->get('/order/:slug', 'get_configure_product_by_slug', ['slug' => '[a-z0-9-]+'], static::class);
$app->get('/order/service/manage/:id', 'get_order', ['id' => '[0-9]+'], static::class);
}
public function get_products(\Box_App $app)
{
return $app->render('mod_order_index');
}
public function get_configure_product_by_slug(\Box_App $app, $slug)
{
$api = $this->di['api_guest'];
$product = $api->product_get(['slug' => $slug]);
$tpl = 'mod_service' . $product['type'] . '_order';
if ($api->system_template_exists(['file' => $tpl . '.html.twig'])) {
return $app->render($tpl, ['product' => $product]);
}
return $app->render('mod_order_product', ['product' => $product]);
}
public function get_configure_product(\Box_App $app, $id)
{
$api = $this->di['api_guest'];
$product = $api->product_get(['id' => $id]);
$tpl = 'mod_service' . $product['type'] . '_order';
if ($api->system_template_exists(['file' => $tpl . '.html.twig'])) {
/home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php
{
$this->debugBar['time']->startMeasure('executeShared', 'Reflecting module controller (shared mapping)');
$class = new $classname();
if ($class instanceof InjectionAwareInterface) {
$class->setDi($this->di);
}
$reflection = new ReflectionMethod($class::class, $methodName);
$args = [];
$args[] = $this; // first param always app instance
foreach ($reflection->getParameters() as $param) {
if (isset($params[$param->name])) {
$args[$param->name] = $params[$param->name];
} elseif ($param->isDefaultValueAvailable()) {
$args[$param->name] = $param->getDefaultValue();
}
}
$this->debugBar['time']->stopMeasure('executeShared');
return $reflection->invokeArgs($class, $args);
}
protected function execute($methodName, $params, $classname = null): string
{
$this->debugBar['time']->startMeasure('execute', 'Reflecting module controller');
$reflection = new ReflectionMethod(static::class, $methodName);
$args = [];
foreach ($reflection->getParameters() as $param) {
if (isset($params[$param->name])) {
$args[$param->name] = $params[$param->name];
} elseif ($param->isDefaultValueAvailable()) {
$args[$param->name] = $param->getDefaultValue();
}
}
$this->debugBar['time']->stopMeasure('execute');
return $reflection->invokeArgs($this, $args);
/home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php
$exc = new FOSSBilling\InformationException('The system is undergoing maintenance. Please try again later', [], 503);
$apiController = new Box\Mod\Api\Controller\Client();
$apiController->setDi($this->di);
return $apiController->renderJson(null, $exc);
} else {
return $this->render('mod_system_maintenance');
}
}
}
$this->debugBar['time']->startMeasure('sharedMapping', 'Checking shared mappings');
$sharedCount = count($this->shared);
for ($i = 0; $i < $sharedCount; ++$i) {
$mapping = $this->shared[$i];
$url = new Box_UrlHelper($mapping[0], $mapping[1], $mapping[3], $this->url);
if ($url->match) {
$this->debugBar['time']->stopMeasure('sharedMapping');
return $this->executeShared($mapping[4], $mapping[2], $url->params);
}
}
$this->debugBar['time']->stopMeasure('sharedMapping');
// this class mappings
$this->debugBar['time']->startMeasure('mapping', 'Checking mappings');
$mappingsCount = count($this->mappings);
for ($i = 0; $i < $mappingsCount; ++$i) {
$mapping = $this->mappings[$i];
$url = new Box_UrlHelper($mapping[0], $mapping[1], $mapping[3], $this->url);
if ($url->match) {
$this->debugBar['time']->stopMeasure('mapping');
return $this->execute($mapping[2], $url->params);
}
}
$this->debugBar['time']->stopMeasure('mapping');
$e = new FOSSBilling\InformationException('Page :url not found', [':url' => $this->url], 404);
/home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php
public function delete(string $url, string $methodName, ?array $conditions = [], ?string $class = null): void
{
$this->event('delete', $url, $methodName, $conditions, $class);
}
public function run(): string
{
$this->debugBar['time']->startMeasure('registerModule', 'Registering module routes');
$this->registerModule();
$this->debugBar['time']->stopMeasure('registerModule');
$this->debugBar['time']->startMeasure('init', 'Initializing the app');
$this->init();
$this->debugBar['time']->stopMeasure('init');
$this->debugBar['time']->startMeasure('checkperm', 'Checking access to module');
$this->checkPermission();
$this->debugBar['time']->stopMeasure('checkperm');
return $this->processRequest();
}
/**
* @param string $path
*/
public function redirect($path): never
{
$location = $this->di['url']->link($path);
header("Location: $location");
exit;
}
public function render($fileName, $variableArray = []): string
{
return 'Rendering ' . $fileName;
}
public function sendFile($filename, $contentType, $path): false|int
{
header("Content-type: $contentType");
/home/kawkavbilling/htdocs/billing.kawkav.com/index.php
// If HTTP error code has been passed, handle it.
if (!is_null($http_err_code)) {
switch ($http_err_code) {
case '404':
$e = new FOSSBilling\Exception('Page :url not found', [':url' => $url], 404);
echo $app->show404($e);
break;
default:
$http_err_code = intval($http_err_code);
http_response_code($http_err_code);
$e = new FOSSBilling\Exception('HTTP Error :err_code occurred while attempting to load :url', [':err_code' => $http_err_code, ':url' => $url], $http_err_code);
echo $app->render('error', ['exception' => $e]);
}
exit;
}
// If no HTTP error passed, run the app.
echo $app->run();
exit;