setKey('id')->setNestable(); $this->registerView($category); // Child: circolare (lega la category tramite categoria_id) $circolare = new RouterViewConfiguration('circolari'); $circolare->setKey('id')->setParent($category, 'categoria_id', 'id'); $this->registerView($circolare); parent::__construct($app, $menu); // Regole standard di routing $this->attachRule(new StandardRules($this)); $this->attachRule(new MenuRules($this)); $this->attachRule(new NomenuRules($this)); } /* ---------------- BUILD ---------------- */ // Segmenti categoria = path completo (parent1/parent2/figlia) public function getCategorySegment($id, $query) { $id = (int) ($id ?: 0); if ($id <= 0) { return []; } $db = Factory::getContainer()->get('DatabaseDriver'); $path = (string) $db->setQuery( $db->getQuery(true) ->select('path') ->from('#__circolari_categorie') ->where('id = ' . $id) ->where("extension = 'com_content'") )->loadResult(); return $path !== '' ? array_filter(explode('/', $path)) : [(string) $id]; } // Ultimo segmento = SOLO alias della circolare public function getCircolareSegment($id, $query) { $db = Factory::getContainer()->get('DatabaseDriver'); $alias = (string) $db->setQuery( $db->getQuery(true) ->select('alias') ->from('#__circolari') ->where('id = ' . (int) $id) )->loadResult(); // Nessun fallback numerico: imponiamo l'alias return [$alias]; } /* ---------------- PARSE ---------------- */ // Ricava categoria_id accumulando i segmenti e risolvendo per PATH completo public function getCategoryId($segment, $query) { static $segments = []; $segments[] = $segment; $path = implode('/', $segments); $db = Factory::getContainer()->get('DatabaseDriver'); // match per path (univoco in com_content) $id = (int) $db->setQuery( $db->getQuery(true) ->select('id') ->from('#__circolari_categorie') ->where('path = ' . $db->quote($path)) ->where("extension = 'com_content'") )->loadResult(); if ($id > 0) { return $id; } // fallback (singolo alias) se si visita direttamente un livello intermedio $id = (int) $db->setQuery( $db->getQuery(true) ->select('id') ->from('#__circolari_categorie') ->where('alias = ' . $db->quote($segment)) ->where("extension = 'com_content'") ->order('level DESC') )->loadResult(); return $id ?: 0; } // Alias circolare (+ categoria_id già risolto) → id public function getCircolareId($segment, $query) { $categoria_id = (int) ($query['categoria_id'] ?? 0); $db = Factory::getContainer()->get('DatabaseDriver'); $q = $db->getQuery(true) ->select('id') ->from('#__circolari') ->where('alias = ' . $db->quote($segment)); if ($categoria_id > 0) { $q->where('categoria_id = ' . $categoria_id); } $db->setQuery($q); return (int) $db->loadResult() ?: 0; } }