diff --git a/site/src/Model/CircolareModel.php b/site/src/Model/CircolareModel.php index 20c84b0..9717282 100644 --- a/site/src/Model/CircolareModel.php +++ b/site/src/Model/CircolareModel.php @@ -248,21 +248,16 @@ class CircolareModel extends ItemModel } - /** - * Incrementa gli hits della circolare. - */ - public function hit($pk = null) + public function incrementHits(int $id): void { - $pk = $pk ?: (int) $this->getState($this->getName() . '.id'); - if (!$pk) { - return false; - } - $db = $this->getDatabase(); - $query = $db->getQuery(true) + if ($id <= 0) return; + + $db = Factory::getContainer()->get('DatabaseDriver'); + $q = $db->getQuery(true) ->update($db->quoteName('#__circolari')) ->set($db->quoteName('hits') . ' = ' . $db->quoteName('hits') . ' + 1') - ->where($db->quoteName('id') . ' = ' . (int)$pk); - $db->setQuery($query)->execute(); - return true; + ->where($db->quoteName('id') . ' = ' . (int) $id); + + $db->setQuery($q)->execute(); } } diff --git a/site/src/Service/Router.php b/site/src/Service/Router.php index 6074737..4190dd8 100644 --- a/site/src/Service/Router.php +++ b/site/src/Service/Router.php @@ -18,9 +18,6 @@ class Router extends RouterView public function __construct(SiteApplication $app, AbstractMenu $menu) { // 1) CATEGORIA (se la usi nei percorsi) - $category = new RouterViewConfiguration('category'); - $category->setKey('id')->setNestable(); - $this->registerView($category); // 2) LISTA (nessuna key!) $circolari = new RouterViewConfiguration('circolari'); @@ -49,15 +46,7 @@ class Router extends RouterView /* ---------------- BUILD ---------------- */ // Segmento categoria = alias (fallback id) - public function getCategorySegment($id, $query) - { - $db = Factory::getContainer()->get('DatabaseDriver'); - $alias = (string) $db->setQuery( - $db->getQuery(true)->select('alias')->from('#__circolari_categorie')->where('id=' . (int)$id) - )->loadResult(); - return $alias !== '' ? [$alias] : [(string) (int) $id]; - } // Segmento dettaglio = alias (fallback id se vuoto) public function getCircolareSegment($id, $query) @@ -72,15 +61,6 @@ class Router extends RouterView /* ---------------- PARSE ---------------- */ - public function getCategoryId($segment, $query) - { - $db = Factory::getContainer()->get('DatabaseDriver'); - $id = (int) $db->setQuery( - $db->getQuery(true)->select('id')->from('#__circolari_categorie')->where('alias=' . $db->quote($segment)) - )->loadResult(); - - return $id > 0 ? $id : (ctype_digit((string)$segment) ? (int)$segment : 0); - } public function getCircolareId($segment, $query) { @@ -106,4 +86,36 @@ class Router extends RouterView return $id; } + + // ⬇️ AGGIUNGI in Pcrt\Component\Circolari\Site\Service\Router + + // Rimuove categoria_id (ecc.) dalla LISTA prima che Joomla costruisca l’URL. + // Così sparisce anche se il link della voce di menu in DB lo contiene ancora. + public function build(&$query) + { + if (isset($query['view']) && $query['view'] === 'circolari') { + foreach (['categoria_id', 'catid', 'categorie', 'categories', 'category_id'] as $k) { + if (array_key_exists($k, $query)) { + unset($query[$k]); + } + } + } + + // Se vuoi essere ultra-clean, rimuovi anche id/Itemid “sporchi” (non necessario di solito) + // if (isset($query['view']) && $query['view'] === 'circolari' && isset($query['id'])) unset($query['id']); + + return parent::build($query); + } + + // (Opzionale) Non reintrodurre variabili categoria in parse: la lista si filtra da params del menu. + public function parse(&$segments) + { + $vars = parent::parse($segments); + + if (isset($vars['view']) && $vars['view'] === 'circolari') { + unset($vars['categoria_id'], $vars['catid'], $vars['categorie'], $vars['category_id']); + } + + return $vars; + } } diff --git a/site/src/View/Circolare/HtmlView.php b/site/src/View/Circolare/HtmlView.php index 34a5d2c..bb73806 100644 --- a/site/src/View/Circolare/HtmlView.php +++ b/site/src/View/Circolare/HtmlView.php @@ -18,33 +18,47 @@ class HtmlView extends BaseHtmlView { // Carica la singola $this->item = $this->get('Item'); + $app = Factory::getApplication(); + $user = Factory::getUser(); + $model = $this->getModel(); + $id = $app->input->getInt('id', 0); + + // Incrementa hits SOLO per utenti loggati + if ($user->id > 0 && $id > 0) { + try { + $model->incrementHits($id); + } catch (\Throwable $e) { + // opzionale: logga se vuoi + } + } + // Se NON c'è l'item → mostra la lista - if (!$this->item) { - $app = \Joomla\CMS\Factory::getApplication(); - $factory = $app->bootComponent('com_circolari')->getMVCFactory(); + if (!$this->item) { + $app = \Joomla\CMS\Factory::getApplication(); + $factory = $app->bootComponent('com_circolari')->getMVCFactory(); - /** @var \Pcrt\Component\Circolari\Site\Model\CircolariModel $model */ - $model = $factory->createModel('Circolari', 'Site', ['ignore_request' => true]); + /** @var \Pcrt\Component\Circolari\Site\Model\CircolariModel $model */ + $model = $factory->createModel('Circolari', 'Site', ['ignore_request' => true]); - // Imposta gli stati MANUALMENTE (niente populateState: è protected) - $model->setState('filter.categoria_id', 0); // nessun filtro categoria - $model->setState('list.start', 0); - $model->setState('list.limit', 0); // 0 = nessun limite (tutte) - $model->setState('list.ordering', 'c.id'); // colonna di ordinamento - $model->setState('list.direction', 'DESC'); // direzione + // Imposta gli stati MANUALMENTE (niente populateState: è protected) + $model->setState('filter.categoria_id', 0); // nessun filtro categoria + $model->setState('list.start', 0); + $model->setState('list.limit', 0); // 0 = nessun limite (tutte) + $model->setState('list.ordering', 'c.id'); // colonna di ordinamento + $model->setState('list.direction', 'DESC'); // direzione - // Recupera i dati - $this->state = $model->getState(); - $this->items = $model->getItems(); - $this->pagination = $model->getPagination(); + // Recupera i dati + $this->state = $model->getState(); + $this->items = $model->getItems(); + $this->pagination = $model->getPagination(); - // Usa il layout della lista (tmpl/circolari/default.php) - $this->setLayout('default'); - $this->addTemplatePath(JPATH_COMPONENT_SITE . '/tmpl/circolari'); + // Usa il layout della lista (tmpl/circolari/default.php) + $this->setLayout('default'); + $this->addTemplatePath(JPATH_COMPONENT_SITE . '/tmpl/circolari'); - return parent::display($tpl); -} + return parent::display($tpl); + } // Rendering normale della singola return parent::display($tpl);