Twig \ Error \ RuntimeError
An exception has been thrown during the rendering of a template ("Product not found") in "mod_order_index.html.twig" at line 23.
Previous exceptions
  • Product not found (0)
Twig\Error\RuntimeError thrown with message "An exception has been thrown during the rendering of a template ("Product not found") in "mod_order_index.html.twig" at line 23." Stacktrace: #22 Twig\Error\RuntimeError in /home/kawkavbilling/htdocs/billing.kawkav.com/themes/huraga/html_custom/mod_order_index.html.twig:23 #21 Box\Mod\Order\Controller\Client:get_products in [internal]:0 #20 FOSSBilling\Exception in /home/kawkavbilling/htdocs/billing.kawkav.com/modules/Product/Api/Guest.php:83 #19 Box\Mod\Product\Api\Guest:get in /home/kawkavbilling/htdocs/billing.kawkav.com/library/Api/Handler.php:108 #18 Api_Handler:__call in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Extension/CoreExtension.php:1909 #17 Twig\Extension\CoreExtension:getAttribute in /home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php:116 #16 __TwigTemplate_c5bed0317ccd1b8141d7f61f6bc43987:block_content in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:446 #15 Twig\Template:yieldBlock in /home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php:557 #14 __TwigTemplate_f450b86e31aad849e5af44a15a84e984:block_body in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:446 #13 Twig\Template:yieldBlock in /home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php:164 #12 __TwigTemplate_f450b86e31aad849e5af44a15a84e984:doDisplay in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:402 #11 Twig\Template:yield in /home/kawkavbilling/htdocs/billing.kawkav.com/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php:55 #10 __TwigTemplate_c5bed0317ccd1b8141d7f61f6bc43987:doDisplay in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:402 #9 Twig\Template:yield in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:358 #8 Twig\Template:display in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/Template.php:373 #7 Twig\Template:render in /home/kawkavbilling/htdocs/billing.kawkav.com/vendor/twig/twig/src/TemplateWrapper.php:51 #6 Twig\TemplateWrapper:render in /home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/AppClient.php:97 #5 Box_AppClient:render in /home/kawkavbilling/htdocs/billing.kawkav.com/modules/Order/Controller/Client.php:39 #4 Box\Mod\Order\Controller\Client:get_products in [internal]:0 #3 ReflectionMethod:invokeArgs in /home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php:187 #2 Box_App:executeShared in /home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php:316 #1 Box_App:processRequest in /home/kawkavbilling/htdocs/billing.kawkav.com/library/Box/App.php:129 #0 Box_App:run in /home/kawkavbilling/htdocs/billing.kawkav.com/index.php:89
Stack frames (23)
22
Twig\Error\RuntimeError
/themes/huraga/html_custom/mod_order_index.html.twig:23
21
Box\Mod\Order\Controller\Client get_products
[internal]:0
20
FOSSBilling\Exception
/modules/Product/Api/Guest.php:83
19
Box\Mod\Product\Api\Guest get
/library/Api/Handler.php:108
18
Api_Handler __call
/vendor/twig/twig/src/Extension/CoreExtension.php:1909
17
Twig\Extension\CoreExtension getAttribute
/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php:116
16
__TwigTemplate_c5bed0317ccd1b8141d7f61f6bc43987 block_content
/vendor/twig/twig/src/Template.php:446
15
Twig\Template yieldBlock
/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php:557
14
__TwigTemplate_f450b86e31aad849e5af44a15a84e984 block_body
/vendor/twig/twig/src/Template.php:446
13
Twig\Template yieldBlock
/data/cache/5e/5efeae89a76ae5fce330926f61f47063.php:164
12
__TwigTemplate_f450b86e31aad849e5af44a15a84e984 doDisplay
/vendor/twig/twig/src/Template.php:402
11
Twig\Template yield
/data/cache/01/01d97aae74ca1f094101d04a90ef2c40.php:55
10
__TwigTemplate_c5bed0317ccd1b8141d7f61f6bc43987 doDisplay
/vendor/twig/twig/src/Template.php:402
9
Twig\Template yield
/vendor/twig/twig/src/Template.php:358
8
Twig\Template display
/vendor/twig/twig/src/Template.php:373
7
Twig\Template render
/vendor/twig/twig/src/TemplateWrapper.php:51
6
Twig\TemplateWrapper render
/library/Box/AppClient.php:97
5
Box_AppClient render
/modules/Order/Controller/Client.php:39
4
Box\Mod\Order\Controller\Client get_products
[internal]:0
3
ReflectionMethod invokeArgs
/library/Box/App.php:187
2
Box_App executeShared
/library/Box/App.php:316
1
Box_App processRequest
/library/Box/App.php:129
0
Box_App run
/index.php:89
/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
  1. "An exception has been thrown during the rendering of a template ("Product not found") in "mod_order_index.html.twig" at line 23."
    
[internal]
/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
  1. "Product not found"
    
Exception message: Product not found
/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'])) {
[internal]
/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;
 

Environment & details:

Key Value
PHP Version
"8.3.30"
Error code
0
Instance ID
"XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX"
Key Value
product
"sovereign-tenant"
_url
"/order"
empty
empty
empty
empty
Key Value
USER
"kawkavbilling"
HOME
"/home/kawkavbilling"
HTTP_ACCEPT_ENCODING
"gzip, br, zstd, deflate"
HTTP_USER_AGENT
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
HTTP_ACCEPT
"*/*"
HTTP_CONNECTION
"close"
HTTP_X_FORWARDED_FOR
"216.73.216.191"
HTTP_X_REAL_IP
"216.73.216.191"
HTTP_X_FORWARDED_HOST
"billing.kawkav.com"
HTTP_HOST
"billing.kawkav.com"
PHP_VALUE
"""
\n
error_log=/home/kawkavbilling/logs/php/error.log;\n
memory_limit=512M;\n
max_execution_time=60;\n
max_input_time=60;\n
max_input_vars=10000;\n
post_max_size=64M;\n
upload_max_filesize=64M;\n
date.timezone=UTC;\n
display_errors=off;
"""
HTTPS
"on"
MGT
"1"
GEOIP_LONGITUDE
"-119.1091"
GEOIP_LATITUDE
"34.1453"
GEOIP_CITY_CONTINENT_CODE
"NA"
GEOIP_POSTAL_CODE
"93033"
GEOIP_CITY
"Oxnard"
GEOIP_REGION
"CA"
GEOIP_CITY_COUNTRY_NAME
"United States"
GEOIP_CITY_COUNTRY_CODE3
"USA"
GEOIP_CITY_COUNTRY_CODE
"US"
GEOIP_COUNTRY_NAME
"United States"
GEOIP_COUNTRY_CODE3
"USA"
GEOIP_COUNTRY_CODE
"US"
REDIRECT_STATUS
"200"
SERVER_NAME
"billing.kawkav.com"
SERVER_PORT
"443"
SERVER_ADDR
"127.0.0.1"
REMOTE_PORT
""
REMOTE_ADDR
"216.73.216.191"
SERVER_SOFTWARE
"nginx/1.21.4"
GATEWAY_INTERFACE
"CGI/1.1"
SERVER_PROTOCOL
"HTTP/1.0"
DOCUMENT_ROOT
"/home/kawkavbilling/htdocs/billing.kawkav.com"
DOCUMENT_URI
"/index.php"
REQUEST_URI
"/order?product=sovereign-tenant"
SCRIPT_NAME
"/index.php"
SCRIPT_FILENAME
"/home/kawkavbilling/htdocs/billing.kawkav.com/index.php"
CONTENT_LENGTH
""
CONTENT_TYPE
""
REQUEST_METHOD
"GET"
QUERY_STRING
"product=sovereign-tenant"
FCGI_ROLE
"RESPONDER"
PHP_SELF
"/index.php"
REQUEST_TIME_FLOAT
1778741886.8758
REQUEST_TIME
1778741886
empty
0. Whoops\Handler\PrettyPageHandler