From 7c30a27cccda2360e80b5355c5fc64957d6e11f8 Mon Sep 17 00:00:00 2001 From: harshkhatri8 Date: Mon, 6 Oct 2025 21:24:06 +0530 Subject: [PATCH 1/5] Fix: functionality of save as copy button to prevent it from creating duplicate record in Component -> Banners -> Clients --- .../com_banners/src/Model/ClientModel.php | 38 +++++++++++++++++++ administrator/language/en-GB/com_banners.ini | 2 + 2 files changed, 40 insertions(+) diff --git a/administrator/components/com_banners/src/Model/ClientModel.php b/administrator/components/com_banners/src/Model/ClientModel.php index 6378292da6ab2..55c558bc9a716 100644 --- a/administrator/components/com_banners/src/Model/ClientModel.php +++ b/administrator/components/com_banners/src/Model/ClientModel.php @@ -14,6 +14,7 @@ use Joomla\CMS\MVC\Model\AdminModel; use Joomla\CMS\Table\Table; use Joomla\CMS\Versioning\VersionableModelTrait; +use Joomla\CMS\Language\Text; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -135,4 +136,41 @@ protected function prepareTable($table) { $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); } + + /** + * Override save to prevent duplicate client names when saving as copy. + * + * @param array $data The form data. + * + * @return boolean True on success, false on failure. + * + * @since 5.3.5 + */ + public function save($data) + { + $table = $this->getTable(); + + // Check for duplicate name BEFORE saving + if (isset($data['name']) && !empty($data['name'])) + { + $existing = $this->getTable(); + + // Load a record with the same name + if ($existing->load(['name' => $data['name']])) + { + // If this is a new record or a copy, block it + if (empty($data['id']) || (int) $existing->id !== (int) $data['id']) + { + $this->setError(\Joomla\CMS\Language\Text::_('COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME')); + return false; // Stop saving + } + } + } + + // No duplicate found, continue saving + return parent::save($data); + } + + + } diff --git a/administrator/language/en-GB/com_banners.ini b/administrator/language/en-GB/com_banners.ini index de21f1e5f218f..58302b8a69981 100644 --- a/administrator/language/en-GB/com_banners.ini +++ b/administrator/language/en-GB/com_banners.ini @@ -202,5 +202,7 @@ COM_BANNERS_TYPE2="Clicks" COM_BANNERS_UNLIMITED="Unlimited" COM_BANNERS_WARNING_PROVIDE_VALID_NAME="Please provide a valid, non-blank name" COM_BANNERS_XML_DESCRIPTION="This component manages banners and banner clients." +COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME="A client with this name already exists." + JLIB_RULES_SETTING_NOTES_COM_BANNERS="Changes apply to this component only.
Inherited - a Global Configuration setting or higher level setting is applied.
Denied always wins - whatever is set at the Global or higher level and applies to all child elements.
Allowed will enable the action for this component unless overruled by a Global Configuration setting." ; Alternate language strings for the rules form field From abe0c7b2896664dcf433ff247ddaccf31907ca61 Mon Sep 17 00:00:00 2001 From: harshkhatri8 Date: Mon, 6 Oct 2025 22:19:27 +0530 Subject: [PATCH 2/5] Fix: functionality of save as copy button to prevent it from creating duplicate record in Component -> Banners -> Clients --- .../com_banners/src/Model/ClientModel.php | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/administrator/components/com_banners/src/Model/ClientModel.php b/administrator/components/com_banners/src/Model/ClientModel.php index 55c558bc9a716..cbe1cbb523ecc 100644 --- a/administrator/components/com_banners/src/Model/ClientModel.php +++ b/administrator/components/com_banners/src/Model/ClientModel.php @@ -150,27 +150,44 @@ public function save($data) { $table = $this->getTable(); - // Check for duplicate name BEFORE saving - if (isset($data['name']) && !empty($data['name'])) - { - $existing = $this->getTable(); - - // Load a record with the same name - if ($existing->load(['name' => $data['name']])) - { - // If this is a new record or a copy, block it - if (empty($data['id']) || (int) $existing->id !== (int) $data['id']) - { - $this->setError(\Joomla\CMS\Language\Text::_('COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME')); - return false; // Stop saving - } + // If saving as copy or duplicate exists, generate a unique name + if (isset($data['name'])) { + $table->load(['name' => $data['name']]); + + // Only modify name if it's a duplicate + if ($table->id) { + $data['name'] = $this->generateUniqueName($data['name']); } } - // No duplicate found, continue saving return parent::save($data); } + /** + * Generate a unique client name if it already exists. + * + * @param string $name The original client name + * + * @return string Unique client name + */ + protected function generateUniqueName($name) + { + $table = $this->getTable(); + $baseName = $name; + $i = 2; + + // Keep appending numbers until the name is unique + while ($table->load(['name' => $name])) { + $name = $baseName . ' (' . $i . ')'; + $i++; + } + + return $name; + } + + + + } From 08b459a73bff662c628effba9ab66cbe521fe87d Mon Sep 17 00:00:00 2001 From: harshkhatri8 Date: Tue, 7 Oct 2025 11:03:31 +0530 Subject: [PATCH 3/5] Fix: made all the changes suggested and fixed the Docblocks, removed extra blank lines, and added @SInCE DEPLOY_VERSION --- .../com_banners/src/Model/ClientModel.php | 21 ++++++++----------- administrator/language/en-GB/com_banners.ini | 1 - 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/administrator/components/com_banners/src/Model/ClientModel.php b/administrator/components/com_banners/src/Model/ClientModel.php index cbe1cbb523ecc..8c328d4e8cb0d 100644 --- a/administrator/components/com_banners/src/Model/ClientModel.php +++ b/administrator/components/com_banners/src/Model/ClientModel.php @@ -137,14 +137,14 @@ protected function prepareTable($table) $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); } - /** + /** * Override save to prevent duplicate client names when saving as copy. * * @param array $data The form data. * * @return boolean True on success, false on failure. * - * @since 5.3.5 + * @since __DEPLOY_VERSION__ */ public function save($data) { @@ -166,12 +166,13 @@ public function save($data) /** - * Generate a unique client name if it already exists. - * - * @param string $name The original client name - * - * @return string Unique client name - */ + * Generate a unique client name if it already exists. + * + * @param string $name The original client name + * + * @return string Unique client name + * @since __DEPLOY_VERSION__ + */ protected function generateUniqueName($name) { $table = $this->getTable(); @@ -186,8 +187,4 @@ protected function generateUniqueName($name) return $name; } - - - - } diff --git a/administrator/language/en-GB/com_banners.ini b/administrator/language/en-GB/com_banners.ini index 58302b8a69981..1da1047f71a42 100644 --- a/administrator/language/en-GB/com_banners.ini +++ b/administrator/language/en-GB/com_banners.ini @@ -204,5 +204,4 @@ COM_BANNERS_WARNING_PROVIDE_VALID_NAME="Please provide a valid, non-blank name" COM_BANNERS_XML_DESCRIPTION="This component manages banners and banner clients." COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME="A client with this name already exists." - JLIB_RULES_SETTING_NOTES_COM_BANNERS="Changes apply to this component only.
Inherited - a Global Configuration setting or higher level setting is applied.
Denied always wins - whatever is set at the Global or higher level and applies to all child elements.
Allowed will enable the action for this component unless overruled by a Global Configuration setting." ; Alternate language strings for the rules form field From cd493a0e7a99c44d583bc4496228e57220dd8324 Mon Sep 17 00:00:00 2001 From: harshkhatri8 Date: Wed, 8 Oct 2025 09:48:49 +0530 Subject: [PATCH 4/5] change the Language key and sort it in alpha order and also the other suggested change --- .../components/com_banners/src/Model/ClientModel.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/administrator/components/com_banners/src/Model/ClientModel.php b/administrator/components/com_banners/src/Model/ClientModel.php index 8c328d4e8cb0d..429ce7fc1fa95 100644 --- a/administrator/components/com_banners/src/Model/ClientModel.php +++ b/administrator/components/com_banners/src/Model/ClientModel.php @@ -11,10 +11,10 @@ namespace Joomla\Component\Banners\Administrator\Model; use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Model\AdminModel; use Joomla\CMS\Table\Table; use Joomla\CMS\Versioning\VersionableModelTrait; -use Joomla\CMS\Language\Text; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -163,14 +163,13 @@ public function save($data) return parent::save($data); } - - /** * Generate a unique client name if it already exists. * * @param string $name The original client name * * @return string Unique client name + * @since __DEPLOY_VERSION__ */ protected function generateUniqueName($name) From cccf92d38d1d0391bcad583a417dce9204c74187 Mon Sep 17 00:00:00 2001 From: harshkhatri8 Date: Fri, 10 Oct 2025 12:46:03 +0530 Subject: [PATCH 5/5] sort Language keys in alpha order --- administrator/language/en-GB/com_banners.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/administrator/language/en-GB/com_banners.ini b/administrator/language/en-GB/com_banners.ini index 1da1047f71a42..f5ffaa9dec10a 100644 --- a/administrator/language/en-GB/com_banners.ini +++ b/administrator/language/en-GB/com_banners.ini @@ -40,6 +40,7 @@ COM_BANNERS_CLIENT_EDIT="Edit Client" COM_BANNERS_CLIENT_EMPTYSTATE_BUTTON_ADD="Add your first client" COM_BANNERS_CLIENT_EMPTYSTATE_CONTENT="A Banner Client contains contact details and further information such as tracking preferences." COM_BANNERS_CLIENT_EMPTYSTATE_TITLE="No Clients have been created yet." +COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME="A client with this name already exists." COM_BANNERS_CLIENT_NEW="New Client" COM_BANNERS_CLIENT_SAVE_SUCCESS="Client saved." COM_BANNERS_CLIENTS_FILTER_SEARCH_DESC="Search in client name. Prefix with ID: to search for a client ID." @@ -202,6 +203,5 @@ COM_BANNERS_TYPE2="Clicks" COM_BANNERS_UNLIMITED="Unlimited" COM_BANNERS_WARNING_PROVIDE_VALID_NAME="Please provide a valid, non-blank name" COM_BANNERS_XML_DESCRIPTION="This component manages banners and banner clients." -COM_BANNERS_CLIENT_ERROR_DUPLICATE_NAME="A client with this name already exists." JLIB_RULES_SETTING_NOTES_COM_BANNERS="Changes apply to this component only.
Inherited - a Global Configuration setting or higher level setting is applied.
Denied always wins - whatever is set at the Global or higher level and applies to all child elements.
Allowed will enable the action for this component unless overruled by a Global Configuration setting." ; Alternate language strings for the rules form field