diff --git a/administrator/forms/circolare.xml b/administrator/forms/circolare.xml
index 13f2d49..f8a6976 100644
--- a/administrator/forms/circolare.xml
+++ b/administrator/forms/circolare.xml
@@ -18,6 +18,14 @@
type="text"
label="JFIELD_ALIAS_LABEL"
description="JFIELD_ALIAS_DESC" />
+
item;
}
+ if ((is_array($data) && empty($data['id'])) || (is_object($data) && empty($data->id))) {
+ if (is_array($data)) {
+ $data['catid'] = (int)($data['catid'] ?? 0) ?: 11;
+ } else {
+ $data->catid = (int)($data->catid ?? 0) ?: 11;
+ }
+ }
+
return $data;
}
diff --git a/administrator/src/Table/CircolareTable.php b/administrator/src/Table/CircolareTable.php
index 2f67584..8b1cabf 100644
--- a/administrator/src/Table/CircolareTable.php
+++ b/administrator/src/Table/CircolareTable.php
@@ -198,7 +198,7 @@ class CircolareTable extends Table implements VersionableTableInterface, Taggabl
$this->ordering = self::getNextOrder();
}
-// Ordering per nuovi record
+ // Ordering per nuovi record
if (property_exists($this, 'ordering') && (int) $this->id === 0) {
$this->ordering = self::getNextOrder();
}
@@ -235,6 +235,11 @@ class CircolareTable extends Table implements VersionableTableInterface, Taggabl
}
+ // Default categoria (nuovi record o catid non impostato)
+ $this->catid = (int)($this->catid ?? 0) ?: 11;
+
+
+
return parent::check();
}
@@ -313,5 +318,4 @@ class CircolareTable extends Table implements VersionableTableInterface, Taggabl
$this->_db->setQuery($q);
return ((int) $this->_db->loadResult()) > 0;
}
-
}
diff --git a/administrator/tmpl/circolare/edit.php b/administrator/tmpl/circolare/edit.php
index 6eba66d..9f7fa7a 100644
--- a/administrator/tmpl/circolare/edit.php
+++ b/administrator/tmpl/circolare/edit.php
@@ -36,6 +36,7 @@ HTMLHelper::_('bootstrap.tooltip');
form->renderField('title'); ?>
form->renderField('alias'); ?>
+ form->renderField('catid'); ?>
form->renderField('description'); ?>
form->renderField('attachment'); ?>
form->renderField('image'); ?>
diff --git a/circolari.xml b/circolari.xml
index f1c4db3..dcf4751 100644
--- a/circolari.xml
+++ b/circolari.xml
@@ -7,7 +7,7 @@
Tommaso Cippitelli
tommaso.cippitelli@protocollicreativi.it
http://
- CVS: 1.1.0
+ CVS: 1.1.3
Pcrt\Component\Circolari
@@ -33,7 +33,7 @@
src
-
+ services
tmpl
diff --git a/site/services/provider.php b/site/services/provider.php
new file mode 100644
index 0000000..eb39b94
--- /dev/null
+++ b/site/services/provider.php
@@ -0,0 +1,25 @@
+registerServiceProvider(new $cls('Pcrt\\Component\\Circolari'));
+ }
+
+ // Fallback per ambienti older: comunque registra il namespace PSR-4
+ if (class_exists('JLoader') && \defined('JPATH_SITE')) {
+ \JLoader::registerNamespace(
+ 'Pcrt\\Component\\Circolari\\Site',
+ JPATH_SITE . '/components/com_circolari/src',
+ false, false, 'psr4'
+ );
+ }
+ }
+};
diff --git a/site/src/Service/Router.php b/site/src/Service/Router.php
index 6938101..5a431d5 100644
--- a/site/src/Service/Router.php
+++ b/site/src/Service/Router.php
@@ -5,22 +5,126 @@ namespace Pcrt\Component\Circolari\Site\Service;
use Joomla\CMS\Application\SiteApplication;
use Joomla\CMS\Menu\AbstractMenu;
+use Joomla\CMS\Factory;
use Joomla\CMS\Component\Router\RouterView;
use Joomla\CMS\Component\Router\RouterViewConfiguration;
-use Joomla\CMS\Component\Router\Rules\MenuRules;
use Joomla\CMS\Component\Router\Rules\StandardRules;
+use Joomla\CMS\Component\Router\Rules\MenuRules;
+use Joomla\CMS\Component\Router\Rules\NomenuRules;
class Router extends RouterView
{
public function __construct(SiteApplication $app, AbstractMenu $menu)
{
+ // Parent: category (annidata → più segmenti)
+ $category = new RouterViewConfiguration('category');
+ $category->setKey('id')->setNestable();
+ $this->registerView($category);
+
+ // Child: circolare (lega la category tramite catid)
$circolare = new RouterViewConfiguration('circolare');
- $circolare->setKey('id');
+ $circolare->setKey('id')->setParent($category, 'catid', 'id');
$this->registerView($circolare);
parent::__construct($app, $menu);
- $this->attachRule(new MenuRules($this));
+ // 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('#__categories')
+ ->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 catid 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('#__categories')
+ ->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('#__categories')
+ ->where('alias = ' . $db->quote($segment))
+ ->where("extension = 'com_content'")
+ ->order('level DESC')
+ )->loadResult();
+
+ return $id ?: 0;
+ }
+
+ // Alias circolare (+ catid già risolto) → id
+ public function getCircolareId($segment, $query)
+ {
+ $catid = (int) ($query['catid'] ?? 0);
+
+ $db = Factory::getContainer()->get('DatabaseDriver');
+ $q = $db->getQuery(true)
+ ->select('id')
+ ->from('#__circolari')
+ ->where('alias = ' . $db->quote($segment));
+
+ if ($catid > 0) {
+ $q->where('catid = ' . $catid);
+ }
+
+ $db->setQuery($q);
+
+ return (int) $db->loadResult() ?: 0;
}
}
diff --git a/site/tmpl/category/default.xml b/site/tmpl/category/default.xml
new file mode 100644
index 0000000..136089d
--- /dev/null
+++ b/site/tmpl/category/default.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+