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 @@ + + + + + + + +
+ + + + +
+
+ + + +
+ + + + +
+
+