From 835e123444f456a57d23d05c5df7a42253f44917 Mon Sep 17 00:00:00 2001 From: tommaso Date: Fri, 5 Sep 2025 12:26:43 +0200 Subject: [PATCH] aggiunta firma circolari --- administrator/forms/circolare.xml | 15 ++- administrator/sql/updates/1.1.7.sql | 12 +++ administrator/src/Model/CircolareModel.php | 54 +++++++++++ administrator/tmpl/circolare/edit.php | 2 +- administrator/tmpl/circolares/default.php | 2 +- circolari.xml | 2 +- site/src/Model/CircolareModel.php | 101 +++++++++++++++++---- site/src/Model/CircolariModel.php | 8 +- site/src/Service/Router.php | 2 +- site/tmpl/circolare/default.php | 14 +++ site/tmpl/circolari/default.php | 99 ++++++++------------ site/tmpl/circolari/default.xml | 31 ++++++- 12 files changed, 250 insertions(+), 92 deletions(-) create mode 100644 administrator/sql/updates/1.1.7.sql diff --git a/administrator/forms/circolare.xml b/administrator/forms/circolare.xml index 980fff4..1afae16 100644 --- a/administrator/forms/circolare.xml +++ b/administrator/forms/circolare.xml @@ -18,9 +18,7 @@ - + + + + id ?? $this->getState($this->getName() . '.id')); + if ($id) { + $db = Factory::getContainer()->get('DatabaseDriver'); + $q = $db->getQuery(true) + ->select($db->quoteName('usergroup_id')) + ->from($db->quoteName('#__circolari_usergroups')) + ->where($db->quoteName('circolare_id') . ' = ' . (int) $id); + $db->setQuery($q); + $data->usergroup_ids = $db->loadColumn() ?: []; + } + return $data; } @@ -324,4 +335,47 @@ class CircolareModel extends AdminModel $this->_db->setQuery($q); return ((int) $this->_db->loadResult()) > 0; } + + public function save($data) + { + $ok = parent::save($data); + if (!$ok) { + return false; + } + + $id = (int) $this->getState($this->getName() . '.id'); + $groups = array_map('intval', $data['usergroup_ids'] ?? []); + + $db = Factory::getContainer()->get('DatabaseDriver'); + $db->transactionStart(); + + try { + // ripulisci associazioni esistenti + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__circolari_usergroups')) + ->where($db->quoteName('circolare_id') . ' = ' . (int) $id) + )->execute(); + + // reinserisci le nuove + if (!empty($groups)) { + $q = $db->getQuery(true) + ->insert($db->quoteName('#__circolari_usergroups')) + ->columns([$db->quoteName('circolare_id'), $db->quoteName('usergroup_id')]); + + foreach ($groups as $gid) { + $q->values((int) $id . ',' . (int) $gid); + } + $db->setQuery($q)->execute(); + } + + $db->transactionCommit(); + } catch (\Throwable $e) { + $db->transactionRollback(); + $this->setError($e->getMessage()); + return false; + } + + return true; + } } diff --git a/administrator/tmpl/circolare/edit.php b/administrator/tmpl/circolare/edit.php index e9e50e9..bece210 100644 --- a/administrator/tmpl/circolare/edit.php +++ b/administrator/tmpl/circolare/edit.php @@ -43,7 +43,7 @@ HTMLHelper::_('bootstrap.tooltip'); form->renderField('attachment'); ?> form->renderField('image'); ?> form->renderField('firma_obbligatoria'); ?> - form->renderField('tipologia_firma_id'); ?> + form->renderField('usergroup_ids'); ?> form->renderField('scadenza'); ?> diff --git a/administrator/tmpl/circolares/default.php b/administrator/tmpl/circolares/default.php index b237a5d..2acccb5 100644 --- a/administrator/tmpl/circolares/default.php +++ b/administrator/tmpl/circolares/default.php @@ -82,7 +82,7 @@ if (!empty($saveOrder)) { - + diff --git a/circolari.xml b/circolari.xml index 843191a..caf55c4 100644 --- a/circolari.xml +++ b/circolari.xml @@ -7,7 +7,7 @@ Tommaso Cippitelli tommaso.cippitelli@protocollicreativi.it http:// - 1.1.6 + 1.1.7 Pcrt\Component\Circolari diff --git a/site/src/Model/CircolareModel.php b/site/src/Model/CircolareModel.php index d025e98..9a88f6b 100644 --- a/site/src/Model/CircolareModel.php +++ b/site/src/Model/CircolareModel.php @@ -1,10 +1,12 @@ getState($this->getName() . '.id'); - if (!$pk) { - return false; + if ($firmatipoId <= 0) { + return $buttons; + } + + $db = Factory::getContainer()->get('DatabaseDriver'); + + // 1) Tabella relazionale + $q = $db->getQuery(true) + ->select($db->quoteName(['id', 'label'])) + ->from($db->quoteName('#__circolari_firmetipi_bottoni')) + ->where($db->quoteName('firmatipo_id') . ' = ' . (int) $firmatipoId) + ->order($db->escape('ordering ASC, id ASC')); + $db->setQuery($q); + $buttons = (array) $db->loadObjectList(); + + // 2) Fallback JSON + if (!$buttons) { + $q2 = $db->getQuery(true) + ->select($db->quoteName('bottoni_firma')) + ->from($db->quoteName('#__circolari_firmetipi')) + ->where($db->quoteName('id') . ' = ' . (int) $firmatipoId); + $db->setQuery($q2); + $json = (string) $db->loadResult(); + + if ($json) { + $rows = json_decode($json, true) ?: []; + foreach ($rows as $r) { + $label = trim((string) ($r['etichetta'] ?? '')); + if ($label !== '') { + $buttons[] = (object) ['id' => 0, 'label' => $label]; + } + } + } + } + + return $buttons; + } + + public function userCanFirmare(int $circolareId, ?int $userId = null): bool + { + $user = Factory::getUser($userId); + if ($user->guest) { + return false; + } + + // Gruppi (inclusa ereditarietà). In J4/J5 puoi usare UserHelper::getUserGroups + $userGroups = array_map('intval', UserHelper::getUserGroups($user->id)); + if (!$userGroups) { + return false; + } + + $db = Factory::getContainer()->get('DatabaseDriver'); + + $q = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName('#__circolari_usergroups')) + ->where($db->quoteName('circolare_id') . ' = ' . (int) $circolareId) + ->where($db->quoteName('usergroup_id') . ' IN (' . implode(',', $userGroups) . ')'); + + $db->setQuery($q); + return ((int) $db->loadResult()) > 0; + } + + + /** + * Incrementa gli hits della circolare. + */ + public function hit($pk = null) + { + $pk = $pk ?: (int) $this->getState($this->getName() . '.id'); + if (!$pk) { + return false; + } + $db = $this->getDatabase(); + $query = $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; } - $db = $this->getDatabase(); - $query = $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; } diff --git a/site/src/Model/CircolariModel.php b/site/src/Model/CircolariModel.php index 391798f..9321b0b 100644 --- a/site/src/Model/CircolariModel.php +++ b/site/src/Model/CircolariModel.php @@ -14,14 +14,13 @@ class CircolariModel extends ListModel protected $filter_fields = [ 'id', 'c.id', 'title', 'c.title', - 'created', 'c.created', 'hits', 'c.hits', 'categoria_id', 'c.categoria_id', 'state', 'c.state', ]; protected function populateState($ordering = 'c.created', $direction = 'DESC') - { + { $app = Factory::getApplication(); // paging @@ -80,9 +79,6 @@ class CircolariModel extends ListModel } // ordinamento - $orderCol = $this->getState('list.ordering', 'c.created'); - $orderDir = $this->getState('list.direction', 'DESC'); - $q->order($db->escape($orderCol . ' ' . $orderDir)); return $q; } @@ -116,4 +112,4 @@ class CircolariModel extends ListModel return \is_object($it) && !empty($it->id); })); } -} +} \ No newline at end of file diff --git a/site/src/Service/Router.php b/site/src/Service/Router.php index 4d32e27..a994bf7 100644 --- a/site/src/Service/Router.php +++ b/site/src/Service/Router.php @@ -22,7 +22,7 @@ class Router extends RouterView $this->registerView($category); // Child: circolare (lega la category tramite categoria_id) - $circolare = new RouterViewConfiguration('circolare'); + $circolare = new RouterViewConfiguration('circolari'); $circolare->setKey('id')->setParent($category, 'categoria_id', 'id'); $this->registerView($circolare); diff --git a/site/tmpl/circolare/default.php b/site/tmpl/circolare/default.php index 2844f16..36131ea 100644 --- a/site/tmpl/circolare/default.php +++ b/site/tmpl/circolare/default.php @@ -6,6 +6,8 @@ use Joomla\CMS\Language\Text; /** @var \Pcrt\Component\Circolari\Site\View\Circolare\HtmlView $this */ $item = $this->item; + +$buttons = $this->getModel()->getBottoniFirma((int)$item->tipologia_firma_id); ?>
@@ -18,6 +20,18 @@ $item = $this->item; + + firma_obbligatoria && $this->getModel()->userCanFirmare($item->id, $this->getModel()->currentUser->id) && !empty($buttons)) : ?> +
+
+ + + +
+
+
description ?: $item->testo ?: $item->descrizione ?: '(Nessun testo)'; ?>
diff --git a/site/tmpl/circolari/default.php b/site/tmpl/circolari/default.php index 98dca2d..4fdae4e 100644 --- a/site/tmpl/circolari/default.php +++ b/site/tmpl/circolari/default.php @@ -1,67 +1,44 @@ item; +dump($item); + +$buttons = $this->getModel()->getBottoniFirma((int)$item->tipologia_firma_id); +dump($this->getModel()->currentUser); -// $listOrder / $listDirn / $filter già come li hai -$Itemid = (int) ($input->getInt('Itemid') ?: 0); ?> -